KMedias

Implementart el algoritmo de Kmeas. Este consiste en encontrar k cluster basdos en una lista de objetos. El algoritmo recibe una lista de objetos y el número k que indica el número de clusters que se quieren identificar.  Receta del algoritmo:

1. Seleccionare de forma aleatoria  k  elementos a utilizar como pivote (medias). 
2. Asignar a cada elemento un índice  de 1 a k
3. Separar los elementos de la lista de objetos en k listas, cada elemento de la ista original pertenece a la lista del obejto que está masa cercano. Para determinat la distancia utilizar un medida de distancia euclidiana. 
4. Calcular la media para cada una de las k listas y utilizar esos valores como los nuevos pivotes
5. Comparar los nuevos pivotes con los de la iteriacion previa, sino cambiaron detener el procedimiento y regresar las k listas

DistanciaEuclidiana[x1_,x2_]:=Block[{r},
r=Apply[Plus,(x1-x2)^2];
Sqrt[r]
];

GeneraDatos[n_,N_]:=Table[Table[RandomInteger[N],{n}],{N}];

CalculaClusters[datos_,lk_,k_]:=Block[{ld,min,pos,ldcn},
ld=Transpose[Table[Map[DistanciaEuclidiana[#,j]&,datos],{j,lk}]];
min=Map[Min,ld];
pos=MapThread[Position,{ld,min}];
ldcn=Table[List[],{k}];
Table[ ldcn[[pos[[i]][[1]][[1]]]]=Append[ldcn[[pos[[i]][[1]][[1]]]],datos[[i]]],{i,Range[Length[pos]]}];
ldcn
];

CalculaClusters2[datos_,lk_,k_]:=Block[{ld,x,pos,ldcn},
ld=Map[Nearest[lk,#] &,datos];
pos=Map[Position[lk,#[[1]]]&,ld];
ldcn=Table[List[],{k}];
Table[ ldcn[[pos[[i]][[1]][[1]]]]=Append[ldcn[[pos[[i]][[1]][[1]]]],datos[[i]]],{i,Range[Length[pos]]}];
ldcn
];

KMedias[datos_,k_,lk_,ldc_,maxIter_]:=Block[{lkn=Map[Mean,ldc],ldcn},
 ldcn=CalculaClusters2[datos,lkn,k];
 If[lk==lkn||maxIter==0,ldc,KMedias[datos,k,lkn,ldcn,maxIter-1]]
]

KMedias[datos_,k_]:=Block[{lk,ldc},
lk=RandomChoice[datos,k];
ldc=CalculaClusters2[datos,lk,k];
KMedias[datos,k,lk,ldc,1000]

];

d=GeneraDatos[3,1000];

r=KMedias[d,3];