首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的clustering和kmeans2聚类问题

Python中的clustering和kmeans2聚类问题
EN

Stack Overflow用户
提问于 2014-08-14 06:31:20
回答 1查看 6.5K关注 0票数 4

我有一个关于kmeanskmeans2的问题。我有一套1700长的数据点。我想在空间上把它们聚成100个。然而,在使用kmeanskmeans2时,我得到了截然不同的结果。你能解释一下为什么吗?我的密码在下面。

首先,我加载数据并绘制坐标。看上去都是对的。

代码语言:javascript
复制
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点数据集的位置。

代码语言:javascript
复制
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的结果看起来几乎是随机的。

代码语言:javascript
复制
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()产生的数组的大小:

代码语言:javascript
复制
print 'k =', k
print 'N =', N
print len(cluster_centroids1)
print len(cluster_centroids2)
print len(closest_centroids)
print len(np.unique(closest_centroids))

输出:

代码语言:javascript
复制
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那样表示原始数据集。

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

代码语言:javascript
复制
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(coordinates[:,0], coordinates[:,1], c=closest_centroids, s=100)
plt.show()

你可以在这里看到:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-14 07:49:08

谢谢你的好问题与样例代码和图像!这是个很好的新手问题。

大多数的特点可以通过仔细阅读文档来解决。有几件事:

  • 当比较原始的点集和产生的集群中心时,您应该尝试用相同的维度(即w与结果相同)将它们绘制在相同的图中。例如,像您所做的那样,用大点绘制集群中心,并在上面画一些小点的原始数据。
  • kmeanskmeans2从不同的情况出发。kmeans2从点的随机分布开始,由于数据分布不均匀,kmeans2收敛到一个非理想的结果。您可以尝试添加关键字minit='points'并查看结果是否更改。
  • 由于最初的质心选择是错误的,在最初的100个质心中,只有17个实际上有属于它们的点(这与图的随机外观密切相关)。
  • 似乎kmeans中的一些质心可能会彼此塌陷,如果这给出最小的失真。(这似乎没有记录在案。)因此,你只能得到96个质心。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25301466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档