【问题标题】:Trouble with scipy kmeans and kmeans2 clustering in PythonPython中scipy kmeans和kmeans2集群的问题
【发布时间】:2014-10-07 17:11:24
【问题描述】:

我对 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()

接下来,我对数据进行白化并运行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() 绘制质心时,它看起来完全不可靠。我希望kmeanskmeans2 的结果非常相似,但它们完全不同。虽然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()

你可以在这里看到它:

【问题讨论】:

  • 不要对 latlng 数据使用 k-means。 k-means 最小化方差,而不是大地距离。 IE。有很大的失真。它会起作用,但不要指望你的结果会很好,特别是如果你的数据中有阿拉斯加、加拿大或北欧。 IIRC 甚至在美国,失真平均为 25% 之类的。
  • 谢谢@Anony-Mousse - 你会推荐什么聚类方法而不是地理坐标数据的k-means来最小化大地距离?
  • 任何适用于任意距离的东西,例如层次聚类、DBSCAN、OPTICS、...

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢@DrV - minit='points' 让我的 kmeans2 现在一切正常!
猜你喜欢
  • 2014-01-06
  • 2013-12-14
  • 2017-06-01
  • 2014-11-28
  • 2013-04-26
  • 2019-01-14
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多