[英]Trouble with scipy kmeans and kmeans2 clustering in Python
我有一个关于scipy的kmeans
和kmeans2
。 我有一组1700个lat-long数据点。 我想在空间上将它们聚类成100个簇。 但是,当使用kmeans
vs kmeans2
时,我得到了截然不同的结果。 你能解释一下这是为什么吗? 我的代码如下。
首先,我加载数据并绘制坐标。 这看起来都很正确。
import pandas as pd, numpy as np, matplotlib.pyplot as plt
from scipy.cluster.vq import kmeans, kmeans2, whiten
df = pd.read_csv('data.csv')
df.head()
coordinates = df.as_matrix(columns=['lon', 'lat'])
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(coordinates[:,0], coordinates[:,1], c='c', s=100)
plt.show()
接下来,我将数据白化并运行kmeans()
和kmeans2()
。 当我从kmeans()
绘制质心时,它看起来是正确的 - 即大约100个点或多或少代表完整1700点数据集的位置。
N = len(coordinates)
w = whiten(coordinates)
k = 100
i = 20
cluster_centroids1, distortion = kmeans(w, k, iter=i)
cluster_centroids2, closest_centroids = kmeans2(w, k, iter=i)
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(cluster_centroids1[:,0], cluster_centroids1[:,1], c='r', s=100)
plt.show()
然而,当我接下来从kmeans2()
绘制质心时,它对我来说看起来很kmeans2()
。 我希望kmeans
和kmeans2
的结果非常相似,但它们完全不同。 虽然kmeans
的结果似乎只是表示我的完整数据集,但kmeans2
的结果看起来几乎是随机的。
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(cluster_centroids2[:,0], cluster_centroids2[:,1], c='r', s=100)
plt.show()
这是我的k和N的值,以及由kmeans()
和kmeans2()
产生的数组的大小:
print 'k =', k
print 'N =', N
print len(cluster_centroids1)
print len(cluster_centroids2)
print len(closest_centroids)
print len(np.unique(closest_centroids))
输出:
k = 100
N = 1759
96
100
1759
17
len(cluster_centroids1)
不等于k
? len(closest_centroids)
等于N
,这似乎是正确的。 但为什么len(np.unique(closest_centroids))
不等于k
? len(cluster_centroids2)
等于k
,但同样,绘制时, cluster_centroids2
似乎不表示原始数据集的方式cluster_centroids1
一样。 最后,我绘制了我的全坐标数据集,由集群着色。
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(coordinates[:,0], coordinates[:,1], c=closest_centroids, s=100)
plt.show()
你可以在这里看到它:
感谢您提供示例代码和图片的好问题! 这是一个很好的新手问题。
通过仔细阅读文档可以解决大多数特性。 一些东西:
在比较原始点集和生成的聚类中心时,您应该尝试将它们绘制在具有相同尺寸的相同图中(即w
再次显示结果)。 例如,使用大点绘制聚类中心,并在其上绘制带有小点的原始数据。
kmeans
和kmeans2
从不同的情况开始。 kmeans2
从点的随机分布开始,并且由于您的数据不均匀分布, kmeans2
收敛到非理想的结果。 您可以尝试添加关键字minit='points'
并查看结果是否发生变化。
由于最初的质心选择是不好的,因此最初的100个质心中只有17个实际上有任何属于它们的点(这与图的随机外观密切相关)。
看起来kmeans
中的一些质心可能会相互坍塌,如果它产生最小的失真。 (这似乎没有记录。)因此,你将只获得96个质心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.