python - Python 中的 scipy kmeans 和 kmeans2 聚类问题

标签 python scipy cluster-analysis geospatial k-means

我有一个关于 scipy 的 kmeanskmeans2 的问题。我有一组 1700 个经纬度数据点。我想在空间上将它们聚集成 100 个簇。但是,使用 kmeanskmeans2 时,我得到的结果截然不同。你能解释这是为什么吗?我的代码如下。

首先我加载我的数据并绘制坐标。一切看起来都是正确的。

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(clu​​ster_centroids1) 不等于 k
  • len(closest_centroids) 等于 N,这似乎是正确的。但是为什么 len(np.unique(closest_centroids)) 不等于 k
  • len(clu​​ster_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()

你可以在这里看到:Screenshot

最佳答案

感谢您提出带有示例代码和图像的好问题!这是一个很好的新手问题。

通过仔细阅读文档可以解决大部分问题。一些事情:

  • 比较原始点集和生成的聚类中心时,您应该尝试将它们绘制在具有相同维度的同一图中(即 w agains the results)。例如,按照您所做的那样用大点绘制聚类中心,并在其顶部绘制带有小点的原始数据。

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

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

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

关于python - Python 中的 scipy kmeans 和 kmeans2 聚类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301466/

相关文章:

用于 utf-8 的 Python json.loads

python - SyntaxError : Non-ASCII character '\xe3' in file G:\test. py on line 2, but no encoding declared

python - 优化最小化与 SLSQP 不兼容的不平等约束

python - 在有和没有SciPy的情况下计算k组合的数量

python - 对数正态分布拟合

python - 使用 scikit 包在 Python 中绘制集群区域的边界

matlab - 对大型数据集进行聚类

python - 完美获取python中的所有javascript文件名及其内容

r - 将聚类结果叠加到排序上

python - 如何从 csv 返回生成的一行?