2009-09-03 8 views
7

Tengo una matrice de A (369x10) que quiero agrupar en 19 clusters. I utilizar este métodoMatlab: K-means clustering

[idx ctrs]=kmeans(A,19) 

que produce idx (369x1) y CTR (19x10)

consigo el punto hasta here.All mis filas en A está agrupado en 19 clusters.

Ahora tengo una matriz B (49x10). Quiero saber dónde se corresponden las filas de esta B en los 19 clústeres dados.

¿Cómo es posible en MATLAB?

gracias de antemano

+0

¿qué salida esperas? – SilentGhost

+0

Digamos que mis clusters son p1 ... p19. y tengo un punto de datos de prueba que selecciono al azar de los datos de prueba que utilizo durante la agrupación. Quiero ver algo así; "mis datos de prueba pertenecen a p5" – tguclu

+2

Encontré una manera, pero no estoy seguro de que sea correcta. ctrs contiene los centros de cada clúster. Si calculo la distancia euclidiana por elementos de ctrs y mis datos de prueba y obtengo el índice mínimo, entonces me dará el índice de clúster al que pertenecen mis datos de prueba. alguna idea? – tguclu

Respuesta

4

No puedo pensar en una mejor manera de hacerlo que lo que usted describe. Una función incorporada salvaría una línea, pero no pude encontrar una. Aquí está el código usaría:

[ids ctrs]=kmeans(A,19); 
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20 
[distance testpointID] = min(D(1,2:end)); 
0

para la pequeña cantidad de datos, que podría hacer

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2])) 

pero esto es algo oscuro; el bsxfun con los ctrs permutados crea un conjunto de booleanos de 49 x 10 x 19, que luego se 'modifica' en la segunda dimensión, se permuta y luego se encuentran los identificadores de fila. nuevamente, probablemente no sea práctico para grandes cantidades de datos.

1

Suponiendo que está utilizando la distancia euclídea al cuadrado métrica, intente esto:

for i = 1:size(ctrs,2) 
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2); 
end 
[distances,predicted] = min(d,[],2) 

predicho entonces debe contener el índice del centroide más cercano, y las distancias deben contener las distancias al centroide más cercano.

Eche un vistazo dentro de la función kmeans, en la subfunción 'distfun'. Esto le muestra cómo hacer lo anterior, y también contiene los equivalentes para otras métricas de distancia.

11

El siguiente es un ejemplo completo en la agrupación:

%% generate sample data 
K = 3; 
numObservarations = 100; 
dimensions = 3; 
data = rand([numObservarations dimensions]); 

%% cluster 
opts = statset('MaxIter', 500, 'Display', 'iter'); 
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ... 
    'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3); 

%% plot data+clusters 
figure, hold on 
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled') 
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled') 
hold off, xlabel('x'), ylabel('y'), zlabel('z') 

%% plot clusters quality 
figure 
[silh,h] = silhouette(data, clustIDX); 
avrgScore = mean(silh); 


%% Assign data to clusters 
% calculate distance (squared) of all instances to each cluster centroid 
D = zeros(numObservarations, K);  % init distances 
for k=1:K 
    %d = sum((x-y).^2).^0.5 
    D(:,k) = sum(((data - repmat(clusters(k,:),numObservarations,1)).^2), 2); 
end 

% find for all instances the cluster closet to it 
[minDists, clusterIndices] = min(D, [], 2); 

% compare it with what you expect it to be 
sum(clusterIndices == clustIDX) 
2

No sé si me da el significado correcto, pero si quieres saber cual se agrupan los puntos pertenecen puede utilizar la función KnnSearch fácilmente. Tiene dos argumentos y buscará en el primer argumento el primero de ellos más cercano al argumento dos.

Cuestiones relacionadas