如何从视频特征的kmeans聚类中绘制多维数据?

时间:2019-06-13 08:07:28

标签: python numpy matplotlib k-means

我使用kmeans(k = 200)和视频中的特征点创建了一个集群。共有359个视频,每个视频都有不同的帧数。

X = []
Y = []

for video in dataset:
    X.append(video["features"])
    Y.append(video["category"])

附加到X的每个值都是一个要素数组,而Y是分类的

print (np.shape(X))
print (np.shape(Y))

返回

  

(359,200)   (359,)

我试图用

plt.scatter(X,Y, c=kmeans.labels_, cmap='rainbow')  
plt.scatter(kmeans.cluster_centers_[:,0] ,kmeans.cluster_centers_[:,1], color='black')  

并收到错误消息

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-45-7b6bea3c931e> in <module>()
     31     print (np.shape(X))
     32     print (np.shape(Y))
---> 33     plt.scatter(X,Y, c=kmeans.labels_, cmap='rainbow')
     34     plt.scatter(kmeans.cluster_centers_[:,0] ,kmeans.cluster_centers_[:,1], color='black')
     35     '''

2 frames
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   4180         y = np.ma.ravel(y)
   4181         if x.size != y.size:
-> 4182             raise ValueError("x and y must be the same size")
   4183 
   4184         if s is None:

ValueError: x and y must be the same size

我尝试了X [:,0]和许多类似的变体,但又遇到了另一个错误

TypeError: list indices must be integers or slices, not tuple

有人可以帮我如何为绘图功能输入信息吗? 另外,我已经将以前的kmeans聚类输出保存为腌制文件。是否可以加载该文件并创建散点图。谢谢您的答复。

1 个答案:

答案 0 :(得分:0)

绘图时,xy必须具有一维且具有相同的尺寸。您收到错误消息,因为y的大小为359,而x的大小为200。x[0]x[0,:]相同,它是200个数字。参见numpy array indexing and slicing。如果要在x中绘制所有数组,则可以执行以下操作:

for i in range(x.shape[1]):
    plt.scatter(x[:,i], y)

要绘制成子图:

fig, axes = plt.subplots(40,5, figsize=(20,100))
for i in range(x.shape[1]):
    ax = axes.flat[i]
    ax.scatter(x[:,i], y)

另一种可能性是减小尺寸。例如,使用sklearn.decomposition.PCA,但这是一个单独的问题。