我的数据集看起来像这样:(用户名已被混淆,也有40位用户 - 我并不想全部显示)
(a1,List(1.0, 1015.0))
(a2,List(2.0, 2015.0))
(a3,List(3.0, 3015.0))
(a4,List(1.0, 1015.0))
(a5,List(0.0, 15.0))
(a6,List(0.0, 15.0))
基本上,我想创建一个示例应用程序,其中有4个非常明显的集群(每个集群有10个用户)。并表明具有相同特征的用户属于同一群集。
代码从数据创建向量,训练模型并根据所学习的模型进行预测:
val cuttedData = data1.map(s => s.replace("List", "").replace("(", "").replace(")", "").trim.split(','))
val parsedData1 = cuttedData.map(item => Vectors.dense(item.drop(1).map(t => t.toDouble))).cache()
parsedData1.foreach(println)
val gmm1 = new GaussianMixture().setK(4).run(parsedData1)
cuttedData.foreach(item => {println(item(0) + " : " + gmm1.predict(Vectors.dense(item.drop(1).map(i => i.toDouble))))})
问题是用户预计只有3个集群,因此功能 - >集群关系是:
(1.0, 1015.0) -> 1
(0.0, 15.0) -> 0
(2.0, 2015.0), (3.0, 3015.0) -> 2
从模型中打印出的簇是:
weight=0.150000
mu=[2.4445803037860923E-11,15.000000024445805]
sigma=
5.7824573923325105E-11 5.782457392332511E-8
5.782457392332511E-8 5.782457377877571E-5
weight=0.150000
mu=[2.4445803037860923E-11,15.000000024445805]
sigma=
5.7824573923325105E-11 5.782457392332511E-8
5.782457392332511E-8 5.782457377877571E-5
weight=0.371495
mu=[2.1293846059560595,2144.3846059560597]
sigma=
0.4824411855092578 482.4411855092562
482.4411855092562 482441.185509255
weight=0.328505
mu=[1.8536826474572847,1868.6826474572852]
sigma=
0.4795182413266584 479.51824132665774
479.51824132665774 479518.24132665637
我不明白为什么用户被分类错误,我尝试将K参数增加到100,并使用Normalizer来获取数据,但它没有帮助。
另一件需要注意的事情是,当我使用KMEANS获取相同的数据时,它可以完美地运行。