python - 不能根据数据在现有图上绘制计算的质心值

标签 python numpy matplotlib plot scipy

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

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

最佳答案

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

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

data = np.column_stack([x,y])

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

from scipy.cluster.vq import kmeans2

centroids, ks = kmeans2(data, 3, 10)

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

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

two d

原答案:

正如@David 指出的那样,您的数据 是一维的,因此每个集群的质心也只是一维的。你的情节看起来 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)

32343

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

for c in centroids:
    plt.axhline(c)

lines

如果您想找到 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)

关于python - 不能根据数据在现有图上绘制计算的质心值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20177429/

相关文章:

python - 使用ffmpeg逐帧编写视频

python - 将两个图例标签放在一个图中的不同位置

python - matplotlib.pyplot 中刻度标签的不同旋转

python - 如果不关闭 pyodbc 连接会发生什么情况?

Python/MySQL : Select data in a for loop

python - python中有md5解密函数吗?

Python:两个高斯与 np.convolve 卷积的结果函数的大小

python - numpy 中结构化数组的形状

numpy - 绘制加窗 FFT 结果不佳

python - 简单的肥尾对数分箱