Pregunta

Tengo un matrice de A (369x10) que quiero a agruparse en 19 clusters. Utilizo este método

[idx ctrs]=kmeans(A,19)

que los rendimientos idx (369x1) y CTR (19x10)

Me sale el punto hasta here.All mis filas en A se agrupan en 19 grupos.

Ahora tengo una matriz B (49x10) .I quieren saber donde las filas de este B corresponde en el entre dados 19 clusters.

¿Cómo es posible en MATLAB?

Gracias de antemano

¿Fue útil?

Solución

No puedo pensar en una mejor manera de hacerlo que lo que usted describe. Una función integrada ahorraría una línea, pero no pude encontrar uno. Aquí está el código que yo 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));

Otros consejos

El siguiente es un ejemplo completo de 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)

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

Si se asume que está utilizando la distancia euclídea al cuadrado métrica, intente lo siguiente:

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)

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

Tome una mirada 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 de otras métricas de distancia.

para la pequeña cantidad de datos, se puede hacer

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

pero esto es algo oscuro; la bsxfun con los CTR permutados crea una matriz 49 x 10 x 19 de booleanos, que es entonces 'todo-ed' a través de la segunda dimensión, permutan espalda y luego se encuentran los identificadores de fila. de nuevo, probablemente no es práctico para grandes cantidades de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top