2017-07-14 102 views
0

我正在处理需要使用集群的数据。KMeans(和BisectingKMeans)集群的错误/错误

我知道Spark框架不会让我有一个单一的群集;最小数量的聚类是两个。

我创建了一些虚拟随机数据来测试我的程序,并且我的程序显示错误的结果,因为我的KMeans函数正在生成一个集群!怎么来的?我不明白。是因为我的数据是随机的吗?我没有在我的kmeans上指定任何东西。这是处理K均值代码的一部分:

kmeans = new BisectingKMeans(); 
model = kmeans.fit(dataset); //trains the k-means with the dataset to create a model 

clusterCenters = model.clusterCenters(); 

dataset.show(false); 

for(Vector v : clusterCenters){ 
    System.out.println(v); 
} 

输出如下:

+----+----+------+ 
|File|Size|Volume| 
+----+----+------+ 
|F1 |13 |1689 | 
|F2 |18 |1906 | 
|F3 |16 |1829 | 
|F4 |14 |1726 | 
|F5 |10 |1524 | 
|F6 |16 |1844 | 
|F7 |15 |1752 | 
|F8 |12 |1610 | 
|F9 |10 |1510 | 
|F10 |11 |1554 | 
|F11 |12 |1632 | 
|F12 |13 |1663 | 
|F13 |18 |1901 | 
|F14 |13 |1686 | 
|F15 |18 |1910 | 
|F16 |19 |1986 | 
|F17 |11 |1585 | 
|F18 |10 |1500 | 
|F19 |13 |1665 | 
|F20 |13 |1664 | 
+----+----+------+ 
only showing top 20 rows 

[-1.7541523789077474E-16,2.0655699373151038E-15] //only one cluster center!!! why?? 

为什么会出现这种情况?我需要解决什么来解决这个问题?只有一个群集遗址我的程序

回答

0

关于随机数据,正确平分k均值的输出通常只是一个群集。

用平分的k-means表示您只给出最大值集群的数量。但如果结果没有改善,它可以提早停止。在你的情况下,将数据分成两个集群显然没有提高质量,所以这个平分不被接受。

+0

啊好吧我明白了!所以随机数据会严重影响我的模型。对于正常的真实数据,这种行为不应该发生,对吗?至少我希望如此。无论如何,谢谢你向我解释。 –

+0

有了理想的数据,它不会。但是,如果数据只有一个群集,经过严格预处理或非常嘈杂,那么您也可能会在真实数据上看到单个群集。你会惊讶你多久没有找到有意义的群集,像k-means这样的方法...... –