2013-11-22 4 views
1

Я хочу построить 3 "k означает" точки в диаграмме рассеяния.Вычисление k средств и построение графика по диаграмме рассеяния

from pylab import plot,show 
from numpy import array 
from scipy.cluster.vq import kmeans,vq 

data = array([1,1,1,1,1,1,3,3,3,3,3,3,7,7,7,7,7,7]) 
plot(data,marker='*',linewidth=0) 

centroids,x = kmeans(data,3) 
idx,x = vq(data,centroids) 

plot(data[idx==0,0],data[idx==0,1],'yellow', 
    data[idx==1,0],data[idx==1,1],'yellow', 
    data[idx==2,0],data[idx==2,1],'yellow') 

plot(centroids[:,0],centroids[:,1],'red',markersize=8) 
show() 

Что плохого происходит с выше, так как производились следующее сообщение об ошибке коды:

plot(data[idx==0,0],data[idx==0,1],'yellow', 
IndexError: too many indices for array 
+2

'данных [IDX == 0,0]', что вы пытаетесь добиться с этим? это не синтаксис python valide – Oz123

+3

@ Oz123 - 'data [idx == 0, 0]' отлично подходит для синтаксиса python, и это очень распространенная идиома в numpy (хотя она используется и в других местах). –

+0

@JoeKington, смею сказать: вы можете показать рабочий пример? Я хотел бы узнать что-то новое! – Oz123

ответ

2

Вашего синтаксис data[idx==0,0] неверен.

>>> data[idx==0,0] 
Traceback (most recent call last): 
    ... 
IndexError: too many indices for array 

В дальнейшем, centroids[:,0] также приведет к ошибке IndexError: too many indices, поскольку centroids является 1-d массива.

Проблема заключается в том, что ваши данные 1-й, и для построения графика рассеяния вам нужны значения для 2 координат. Ниже будет делать:

>>> data = data.reshape(9,2) # 2d array of x,y coordinates 
>>> data 
array([[1, 1], 
     [1, 1], 
     [1, 1], 
     [3, 3], 
     [3, 3], 
     [3, 3], 
     [7, 7], 
     [7, 7], 
     [7, 7]]) 
>>> centroids, x = kmeans(data,3) # clusters in 2d 
>>> idx, x = vq(data,centroids) 

кластер 0 Рентгеновские cooridinates

>>> data[idx==0][:,0] 
array([1, 1, 1]) 

кластера 0 у-координаты

>>> data[idx==0][:,1] 
array([1, 1, 1])