K-means Python中的聚类

时间:2015-11-01 03:07:08

标签: python cluster-analysis k-means

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


x = [916,684,613,612,593,552,487,484,475,474,438,431,421,418,409,391,389,388,
    380,374,371,369,357,356,340,338,328,317,316,315,313,303,283,257,255,254,245,
    234,232,227,227,222,221,221,219,214,201,200,194,169,155,140]

kmeans = KMeans(n_clusters=4)
a = kmeans.fit(np.reshape(x,(len(x),1)))
centroids = kmeans.cluster_centers_

labels = kmeans.labels_

print(centroids)
print(labels)

colors = ["g.","r.","y.","b."]

for i in range(len(x)):
    plt.plot(x[i], colors[labels[i]], markersize = 10)

plt.scatter(centroids[:, 0], marker = "x", s = 150, linewidths = 5, zorder = 10)
plt.show()

上面的代码显示了4个集群,但它们绝对不是我想拥有的。

我也遇到了错误,这使得它更糟糕。我得到的输出如下图所示。

我得到的错误是:TypeError: scatter() missing 1 required positional argument: 'y'错误不是什么大问题,因为我不喜欢我的东西。

Clusters Output

以下是我希望集群输出看起来如何的图像。

Cluster I want

3 个答案:

答案 0 :(得分:3)

您的数据是一维的(一行),如果您希望在帖子中以二维方式可视化,则应使用二维或多维数据,例如[[1,3], [2,3], [1,5]].  在k-means之后,它们被分成k个簇,你可以使用scatter来显示输出。顺便说一下,散射取x和y,散射是二维可视化。

我建议你看一下python数据挖掘工具Orange。你可以通过拖放来做k-means。

enter image description here

可以轻松地显示k-means的输出。

enter image description here

祝你好运!数据挖掘很有趣: - )

答案 1 :(得分:2)

您的数据是1维

不要在没有编制数据的情况下期待一个漂亮的2D图。

要删除警告,您可以设置y=x。但它不会有太大变化,数据将继续成为一维线。

您当然可以添加随机噪声,并将y设置为随机值。但这意味着要制作假数据。

对于一维算法,我建议使用群集。这些算法专为复杂的多变量数据而设计,您无法再提供良好的统计模型。一维数据可以排序,这允许更高效的算法。您可以轻松地对这些数据执行KDE,并适应数千个统计分布。这将为您提供更有意义的更高统计功效的模型。

通过快速浏览你的情节,我说没有集群。相反,您的数据看起来像是一个偏斜的正态分布,有一个明确的异常值(在此数据集大小中可以预期)给我。请尝试更多统计方法。

答案 2 :(得分:0)

由于您只使用一维,因此您应该了解您的计算内容。使用KMeans,您可以提取四个平均值;你可以在这里做的最好的事情是绘制你的数据如下,四条水平线显示这些值。我用下面的代码得到以下图片。这张照片类似于您为2D显示的图片的1D。

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


x = [916,684,613,612,593,552,487,484,475,474,438,431,421,418,409,391,389,388,
    380,374,371,369,357,356,340,338,328,317,316,315,313,303,283,257,255,254,245,
    234,232,227,227,222,221,221,219,214,201,200,194,169,155,140]

kmeans = KMeans(n_clusters=4)
a = kmeans.fit(np.reshape(x,(len(x),1)))
centroids = kmeans.cluster_centers_

labels = kmeans.labels_

print(centroids)
print(labels)

colors = ["g.","r.","y.","b."]

for i in centroids: plt.plot( [0, len(x)-1],[i,i], "k" )
for i in range(len(x)):
    plt.plot(i, x[i], colors[labels[i]], markersize = 10)

plt.show()

使用1D数据计算kmeans对于下面的曲线(来自页面http://lasp.colorado.edu/home/sorce/2013/01/28/the-sorce-mission-celebrates-ten-years/)更有趣,因为您显然可以看到两个不同的平均值:

transit of venus http://lasp.colorado.edu/media/projects/SORCE/images/news_images/Fig_8%20Left_Kopp_vg.jpg