matlab - ejemplos - kmeans r
Matlab: K-means agrupamiento (5)
No puedo pensar en una mejor manera de hacerlo que lo que describes. Una función incorporada salvaría una línea, pero no pude encontrar una. Aquí está el código que 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));
Tengo una matrice de A (369x10) que quiero agrupar en 19 grupos. Yo uso este método
[idx ctrs]=kmeans(A,19)
que produce idx (369x1) y ctrs (19x10)
Entiendo el punto hasta aquí. Todas mis filas en A están agrupadas en 19 grupos.
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
para una pequeña cantidad de datos, podrías 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.
Suponiendo que está usando una métrica de distancia euclidiana cuadrada, 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)
predicted debería 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.
El siguiente es un ejemplo completo de clustering:
%% 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)
No sé si entiendo bien tu significado, pero si quieres saber a qué grupo pertenecen tus puntos, puedes usar 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.