编辑: 好的,如果数据是二维的,如下:
x = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
y = [8,7,5,4,3,7,8,3,2,1,9,11,16,18,19]
那么,如何计算k意味着(3个值)并制作图?
不能根据此处的数据在现有的绘图上绘制计算的质心值吗?我想在下面的链接中做出类似的情节
http://glowingpython.blogspot.jp/2012/04/k-means-clustering-with-scipy.html
然而,我无法理解。任何帮助都将受到高度赞赏。
import numpy as np, matplotlib.pyplot as plt
from scipy.cluster.vq import kmeans, vq
data = np.array(np.random.rand(100))
plt.plot(data, 'ob')
centroids, variances= kmeans(data,3,10)
indices, distances= vq(data,centroids)
print (centroids)
[ 0.82847854 0.49085422 0.18256191]
plt.show()
答案 0 :(得分:10)
您可以使用下面的原始答案,只需:
data = np.column_stack([x,y])
如果要绘制质心,则原始答案中的内容与下图相同。如果要按所选组的颜色为每个值着色,可以使用kmeans2
from scipy.cluster.vq import kmeans2
centroids, ks = kmeans2(data, 3, 10)
要绘制,选择k
颜色,然后使用ks
返回的kmeans2
数组从三种颜色中选择颜色:
colors = ['r', 'g', 'b']
plt.scatter(*data.T, c=np.choose(ks, colors))
plt.scatter(*centroids.T, c=colors, marker='v')
正如@David指出的那样,你的data
是一维的,所以每个群集的质心也只是一维的。你的情节看起来 2d的原因是因为当你运行
plt.plot(data)
如果data
是1d,那么函数实际上做的是绘图:
plt.plot(range(len(data)), data)
为清楚起见,请参阅此示例:
data = np.array([3,2,3,4,3])
centroids, variances= kmeans(data, 3, 10)
plt.plot(data)
然后质心将是一维的,因此它们在该图中没有x
位置,因此您可以将它们绘制为线条,例如:
for c in centroids:
plt.axhline(c)
如果要查找x = range(len(data))
和y = data
所在的x-y对的质心,则必须将这些对传递给聚类算法,如下所示:
xydata = np.column_stack([range(len(data)), data])
centroids, variances= kmeans(xydata, 3, 10)
但我怀疑这是你想要的。您可能需要随机x
和 y
值,因此请尝试以下操作:
data = np.random.rand(100,2)
centroids, variances = kmeans(data, 3, 10)