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

Python 无法基于数据在现有绘图上绘制计算出的质心值,python,numpy,matplotlib,plot,scipy,Python,Numpy,Matplotlib,Plot,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] 那么,如何计算k均值(3个值)并绘制图呢 不能根据此处的数据在现有绘图上绘制计算出的质心值吗?我想在下面的链接中绘制类似的图 然而,我无法理解。任何帮助都将不胜感激 import numpy as np, matplotlib.pyplot as plt from scipy.cluster.vq

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

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个值)并绘制图呢


不能根据此处的数据在现有绘图上绘制计算出的质心值吗?我想在下面的链接中绘制类似的图

然而,我无法理解。任何帮助都将不胜感激

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

原始答复: 正如@David指出的,您的
数据是一维的,因此每个簇的质心也将是一维的。绘图看起来是2d的原因是因为运行时

plt.plot(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-y对的质心,其中
x=range(len(data))
y=data
,则必须将这些对传递给聚类算法,如下所示:

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)

你有一维数据。这就是质心只有一个坐标的原因。@David是正确的。尝试
data=np.random.rand(100,2)
然后
plot(*data.T,'ob')
(顺便说一句,
np.random.rand
返回一个数组,无需调用
np.array
)我的答案包括您的编辑,只需添加这一行:
data=np.column\u堆栈([x,y])
@askewchan好的,谢谢