我有一个关于scipy'skmeans
和kmeans2
的问题。我有一组1700个拉长数据点我想把它们在空间上分为100个簇然而,当使用kmeans
与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()
。当我从“CCC”中绘制质心时,它看起来是正确的,即大约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()
然而,当我下一次绘制
kmeans()
的质心时,它看起来完全不稳定我希望kmeans2()
和kmeans
的结果相当相似,但它们完全不同虽然kmeans2
的结果看起来只是代表我的完整数据集,但kmeans
的结果看起来几乎是随机的。plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(cluster_centroids2[:,0], cluster_centroids2[:,1], c='r', s=100)
plt.show()
下面是k和n的值,以及
kmeans2
和kmeans()
产生的数组大小: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
为什么
kmeans2()
不等于len(cluster_centroids1)
?k
等于len(closest_centroids)
,这似乎是正确的。但为什么N
不等于len(np.unique(closest_centroids))
?k
等于len(cluster_centroids2)
,但同样,绘制时,k
似乎不像cluster_centroids2
那样表示原始数据集。最后,我绘制了完整的坐标数据集,并用集群着色。
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'
并查看结果是否更改。
由于初始质心的选择是一个错误的选择,只有17个初始100质心实际上有任何属于它们的点(这与图的随机外观密切相关)。
似乎kmeans
中的一些质心可能会相互塌陷,如果这给出最小的失真。(这似乎没有记录在案)因此你只能得到96个质心。