Implementación del algoritmo K-MEANS
Agregue una implementación de Matlab:
función [cid, nr, centres] = cskmeans(x, k, nc)
CSKMEANS Agrupación de K-Means - General acercarse.
HMEANS se utiliza para encontrar la partición inicial y luego cada partición. p> Esto implementa un algoritmo K-means más general, donde
HMEANS se utiliza para encontrar la partición inicial y luego examina cada
observación para mejorar aún más la minimización
Suma de cuadrados dentro de un grupo.
[CID, NR, CENTERS] = CSKMEANS(X, K, NC) realiza una agrupación de K-medias utilizando los datos proporcionados en X
Agrupación: X es una matriz de datos n x d,
donde cada fila representa una observación. K representa
el número de clústeres necesarios. NC es una matriz k x d que representa los centros del grupo inicial. Si no se especifica NC, no se especifica ningún centro de clúster inicial
. Si no se especifica NC,
los centros se seleccionarán aleatoriamente a partir de las observaciones: CID proporciona un conjunto de n índices que representan la membresía del grupo
de cada punto. > miembro de cada punto. NR es el número de observaciones en cada grupo
. CENTROS es una matriz en la que cada fila
corresponde a un centro de clúster.
Véase también CSHMEANS
W. L. y A. R. Martinez, 15/9/01
Caja de herramientas de estadística computacional
Advertencia desactivada
CSHMEANS
es una matriz en la que cada fila
corresponde a un centro de clúster. advertencia desactivada
[n, d] = size(x);
if nargin lt; 3
Luego seleccione algunas observaciones como centros de conglomerados.
ind = ceil(n*rand(1, k));
Agregaremos algo de ruido para hacerlo más interesante.
nc = x(ind,:) randn(k, d);
end
Establecer almacenamiento
Entero 1,. ....
cid = zeros(1,n);
Establezca un valor diferente para iniciar el ciclo.
oldcid = ones(1,n);
Números en cada grupo.
nr = zeros(1,k);
Establece el número máximo de iteraciones.
maxiter = 100;
iter = 1;
mientras ~ isequal(cid, oldcid) amp; Ejecute el algoritmo hmeans
Para cada punto, encuentre la distancia a todos los centros del grupo
para i = 1: n
dist = sum(( repmat(x(i,:),k,1)-nc).^2,2);
[m,ind] = min(dist Asígnalo al centro de clases del clúster); p>
cid(i) = ind;
end
Buscar nuevo centro de clúster
para i = 1:k
Encuentra todos los puntos en el grupo
ind = find(cid==i);
Encuentra el punto central
nc (i,:) = media (x(ind,:));
Encuentra el número en cada grupo;
nr(i) = longitud(ind) ;
end p>
iter = iter 1;
end
Ahora verifique cada observación para ver si se puede reducir aún más el error.
Recorre todos los puntos.
maxiter = 2;
iter = 1;
move = 1;
mientras iter lt; 0
move = 0;
Recorre todos los puntos.
for i = 1:n
Encuentra la distancia a todos los centros de los conglomerados
dist = sum((repmat (x(i,:), k, 1)-nc).^2, 2);
r = cid(i) Este es el ID del clúster de x
nr, nr 1;
<); p>dadj = nr./(nr 1).*dist'; todas las distancias ajustadas[m, ind] = min(dadj); p>
if ind ~= r Si no, mueve x
cid(i) = ind
ic = find(cid == ind);
nc(ind,:) = media(x(ic,:));
mover = 1;
fin
fin
iter = iter 1;
fin
centros = nc;
if movimiento == 0
disp(' No se movieron puntos después del procedimiento de agrupación inicial. ')
If move == 0
disp('No se movieron puntos después del procedimiento de agrupación inicial.')
else
disp('Algunos puntos se movieron después del proceso de agrupación inicial.')
end
advertencia activada