我尝试在一个数据集的样本上使用高斯混合模型。
我同时使用了MLlib
(与pyspark
)和{scikit-learn
看起来更真实。在
from pyspark.mllib.clustering import GaussianMixture as SparkGaussianMixture
from sklearn.mixture import GaussianMixture
from pyspark.mllib.linalg import Vectors
Scikit学习:
^{pr2}$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
聚集的数据:
我使用的是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]]])
我真的不知道在
scikit-learn
或Spark
中使用了哪种类型的EM alghoritm,但我确信如果他们使用SEM(随机期望最大化),它应该比EM覆盖得更快(see this)。在然而,为了避免鞍点或局部极大值,通常建议采用多次起动技术。在
我真的不明白你的情节,它们的比例不一样,第二个是第一个的放大吗?顺便说一句,我建议你用BIC(Bayesian Information criteria)来选择
k
的个数,并用这个度量来选择组件的个数。在这本身不是python的问题。IMO,这似乎更像是一个机器学习/数据验证/数据分割的问题,也就是说,你认为你必须并行化你的工作是正确的,但是你用什么方式来做才重要。在你的模型中有一些类似8位量化和模型并行性的东西,你可以通过研究来帮助你得到你想要的:在不牺牲数据质量或保真度的前提下,及时地在大型数据集上训练模型。在
这是一篇关于量化的博客:https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/
这是一篇关于模型并行性和8位量化的博文:http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/
以及相关文件:https://arxiv.org/pdf/1511.04561.pdf
尽管您需要记住,根据您的GPU上的FP操作,您可能不会从该路径中看到实质性的好处:https://blog.inten.to/hardware-for-deep-learning-part-3-gpu-8906c1644664
HTH和YMMV。在
另外,你可能想研究数据折叠,但不记得细节,也不记得我在这个时候读过的论文。我会把这个放在这里记住的。在
相关问题 更多 >
编程相关推荐