【发布时间】:2018-11-27 16:05:28
【问题描述】:
我正在尝试在数据集样本上使用高斯混合模型。
我同时使用了MLlib(和pyspark)和scikit-learn,得到了截然不同的结果,scikit-learn 看起来更真实。
from pyspark.mllib.clustering import GaussianMixture as SparkGaussianMixture
from sklearn.mixture import GaussianMixture
from pyspark.mllib.linalg import Vectors
Scikit 学习:
local = pd.DataFrame([ x.asDict() for x in df.sample(0.0001).collect() ])
model1 = GaussianMixture(n_components=3)
model1.fit([ [x] for x in local['field'].tolist() ])
model1.means_
array([[7.56123598e+00],
[1.32517410e+07],
[3.96762639e+04]])
model1.covariances_
array([[[6.65177423e+00]],
[[1.00000000e-06]],
[[8.38380897e+10]]])
MLLib:
model2 = SparkGaussianMixture.train(
sc.createDataFrame(local).rdd.map(lambda x: Vectors.dense(x.field)),
k=3,
convergenceTol=1e-4,
maxIterations=100
)
model2.gaussians
[MultivariateGaussian(mu=DenseVector([28736.5113]), sigma=DenseMatrix(1, 1, [1094083795.0001], 0)),
MultivariateGaussian(mu=DenseVector([7839059.9208]), sigma=DenseMatrix(1, 1, [38775218707109.83], 0)),
MultivariateGaussian(mu=DenseVector([43.8723]), sigma=DenseMatrix(1, 1, [608204.4711], 0))]
但是,我有兴趣通过模型运行整个数据集,我担心这需要并行化(因此使用 MLlib)才能在有限时间内获得结果。我做错了什么/错过了什么吗?
数据:
而数据在更接近由scikit-learn 聚类的位置处具有明显正常的 dist ceneterd:
我正在使用 Spark 2.3.0 (AWS EMR)。
编辑:初始化参数:
local = pd.DataFrame([ x.asDict() for x in df.sample(0.0001).collect() ])
model1 = GaussianMixture(n_components=3, init_params='random')
model1.fit([ [x] for x in local['field'].tolist() ])
model1.means_
array([[2.17611913e+04],
[8.03184505e+06],
[7.56871801e+00]])
model1.covariances_
rray([[[1.01835902e+09]],
[[3.98552130e+13]],
[[6.95161493e+00]]])
【问题讨论】:
-
我可以看到至少
mu值在两种方法中都类似于三个集群。然而,这些值可能高度依赖于初始化值 -
mu的值实际上并不接近。用图表更新了问题。 -
您可以发布数据集的快照吗?还是以 ? 开头的虚拟数据?
-
是否有统计原因不能对数据集进行二次抽样?
-
@MohammedKashif 恐怕我做不到,虽然我可以尝试生成一些类似的数据,让我试试...
标签: python apache-spark scikit-learn pyspark apache-spark-mllib