无法根据数据在现有图上绘制计算出的质心值

296*_*502 10 python plot numpy matplotlib scipy

编辑:好的,如果数据是二维的,如下:

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]
Run Code Online (Sandbox Code Playgroud)

那么,如何计算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()
Run Code Online (Sandbox Code Playgroud)

ask*_*han 10

一个小编辑来回答你关于2d的问题:

您可以使用下面的原始答案,只需:

data = np.column_stack([x,y])
Run Code Online (Sandbox Code Playgroud)

如果要绘制质心,则在原始答案中与下面相同.如果要按所选组的颜色为每个值着色,则可以使用kmeans2

from scipy.cluster.vq import kmeans2

centroids, ks = kmeans2(data, 3, 10)
Run Code Online (Sandbox Code Playgroud)

要绘制,选择k颜色,然后使用ks返回的数组kmeans2从三种颜色中选择颜色:

colors = ['r', 'g', 'b']
plt.scatter(*data.T, c=np.choose(ks, colors))
plt.scatter(*centroids.T, c=colors, marker='v')
Run Code Online (Sandbox Code Playgroud)

两个d

原始答案:

正如@David指出的那样,你data是一维的,所以每个星团的质心也只是一维的.你的情节看起来是2d 的原因是因为当你跑步时

plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

if data是1d,那么函数实际上做的是:

plt.plot(range(len(data)), data)
Run Code Online (Sandbox Code Playgroud)

为清楚起见,请参阅此示例:

data = np.array([3,2,3,4,3])
centroids, variances= kmeans(data, 3, 10)
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

32343

然后质心将是一维的,因此它们x在该图中没有位置,因此您可以将它们绘制为线条,例如:

for c in centroids:
    plt.axhline(c)
Run Code Online (Sandbox Code Playgroud)

线

如果你想找到xy对的质心where x = range(len(data))y = data,那么你必须将这些对传递给聚类算法,如下所示:

xydata = np.column_stack([range(len(data)), data])
centroids, variances= kmeans(xydata, 3, 10)
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是你想要的.可能你需要随机x y值,所以尝试类似:

data = np.random.rand(100,2)
centroids, variances = kmeans(data, 3, 10)
Run Code Online (Sandbox Code Playgroud)