I came across a variant of k-means that adds a algorithm to select good starting values called k-means++.
kMeansInitializer[data_, k_Integer] :=
Module[
{startingPoint = RandomChoice[data], getDistance, getDistances,
nextPoint},
getDistance[datum_, points_] := Min[Norm[datum - #]^2 & /@ points];
getDistances[points_] := getDistance[#, points] & /@ data;
nextPoint[points_] := RandomChoice[getDistances[points] -> data];
NestList[nextPoint, startingPoint, k - 1]
]
After implementing the algorithm (a bit of a challenge for someone at my level) I now find I have no idea how to feed the values I generate to ClusteringComponents
to use as initial values for use in its k-means implementation.
ClusteringComponents
. Here's an implementation ofk-means
that I wrote, which might be easily extended to your needs. $\endgroup$