在Python中使用scipy kmeans和kmeans2集群时出现问题

时间:2014-08-14 06:31:20

标签: python scipy cluster-analysis geospatial k-means

我对scipy kmeanskmeans2有疑问。我有一组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()

Screenshot

接下来,我将数据白化并运行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()

http://i.stack.imgur.com/WNi2L.png

然而,当我接下来从kmeans2()绘制质心时,它对我来说看起来很不稳定。我希望kmeanskmeans2的结果非常相似,但它们完全不同。虽然kmeans的结果似乎只是表示我的完整数据集,但kmeans2的结果看起来几乎是随机的。

plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(cluster_centroids2[:,0], cluster_centroids2[:,1], c='r', s=100)
plt.show()

http://i.stack.imgur.com/AhgSU.png

以下是我对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那样代表原始数据集。 / LI>

最后,我绘制了由群集着色的全坐标数据集。

plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(coordinates[:,0], coordinates[:,1], c=closest_centroids, s=100)
plt.show()

您可以在此处查看:Screenshot

1 个答案:

答案 0 :(得分:1)

感谢您提供示例代码和图片的好问题!这是一个很好的新手问题。

通过仔细阅读文档可以解决大多数特性。一些事情:

  • 在比较原始点集和生成的聚类中心时,您应该尝试将它们绘制在具有相同尺寸的相同图中(即w再次显示结果)。例如,在您完成时使用大点绘制聚类中心,并在其上绘制带有小点的原始数据。

  • kmeanskmeans2从不同情况开始。 kmeans2从点的随机分布开始,并且由于您的数据分布不均匀,kmeans2会收敛到非理想的结果。您可以尝试添加关键字minit='points'并查看结果是否发生变化。

  • 由于初始质心选择不好,因此初始100个质心中只有17个实际上有任何属于它们的点(这与图形的随机外观密切相关)。

  • 似乎kmeans中的某些质心可能会相互折叠,如果它产生最小的失真。 (这似乎没有记录。)因此,你将只获得96个质心。