6
$\begingroup$

I am trying to determine which method mathematica chooses when using FindClusters. The documentation says that it chooses the best one for the data. I have tried to use AbsoluteOptions, which says it returns the options for a command, but it does not seem to be working.

GaussianRandomData[n_Integer, p_, sigma_] := 
  Table[p + 
    {Re[#], Im[#]}&[RandomReal[NormalDistribution[0, sigma]] E^(I RandomReal[{0, 2 π}])], {n}];
datapairs = BlockRandom[SeedRandom[2134];
Join[
  GaussianRandomData[100, {2, 1}, .3], 
  GaussianRandomData[100, {1, 1.8}, .2], 
  GaussianRandomData[100, {1, 1.1}, .4], 
  GaussianRandomData[100, {1.75, 1.75}, 0.1]]];

AbsoluteOptions[FindClusters[datapairs, Method -> Automatic], Method]

Any help would be appreciated.

$\endgroup$
  • $\begingroup$ You might be interested to know you can replace {Re[#], Im[#]}& with ReIm $\endgroup$ – m_goldberg Feb 7 at 23:56
8
$\begingroup$

Using Trace with the option TraceInternal -> True gives:

DeleteDuplicates[Flatten@Trace[FindClusters[datapairs, Method -> Automatic], 
   HoldPattern[Rule["Method", _]], TraceInternal -> True]]

{"Method"->"GaussianMixture"}

If you specify the number of clusters:

DeleteDuplicates[Flatten@Trace[FindClusters[datapairs, 3, Method -> Automatic], 
   HoldPattern[Rule["Method", _]], TraceInternal -> True]]

{"Method"->"KMeans"}

With PerformanceGoal -> "Quality"

DeleteDuplicates[Flatten@Trace[FindClusters[datapairs, 3, Method -> Automatic, 
    PerformanceGoal -> "Quality"], HoldPattern[Rule["Method", _]], 
   TraceInternal -> True]]

{"Method"->"KMedoids"}

l = {RGBColor[1., 0.5544801460824762, 0.12056345655596812`], RGBColor[
   1., 0.2818404077149421, 0.1073945311994069], RGBColor[
   1., 0.12423838985259317`, 0.19023691956664956`], RGBColor[
   0.8, 0.4542154246540884, 0.31688034954543], RGBColor[
   0.8, 0.5483770742736782, 0.16977938137471082`], RGBColor[
   0.8, 0.03163746197875539, 0.5781619271042624], RGBColor[
   0.8, 0.1612089376881538, 0.15737556414394493`], RGBColor[
   0.5, 0.8592283961197744, 0.04768022523989446], RGBColor[
   0.1544029090531034, 0.5400111921283921, 0.1332688011328087], 
   RGBColor[0.5550268260924609, 0.6650311925481958, 0.24096295360192643`], 
   RGBColor[0.8424867588418756, 0.9610747917029776, 0.38159472421539053`], 
   RGBColor[0.5, 0.6654316628707297, 0.9850955091132039], RGBColor[
   0.1726013976586489, 0.7948159289195966, 0.9375970360424373], 
   RGBColor[0.07338116039584297, 0.6615692536088942, 0.9035903703739081], 
   RGBColor[0.0396922307314016, 0.06815211658088716, 0.9401879243429714], 
   RGBColor[0.26561262398696184`, 0.1750699399994622, 0.47868645290098866`]};

DeleteDuplicates[Flatten@Trace[FindClusters[l], HoldPattern[Rule["Method", _]], 
   TraceInternal -> True]]

{Method -> DBSCAN}

The function MachineLearning`file40Decisions`PackagePrivate`automaticClusterNumberMethods seems to determine the method to be used based on input type, data dimensions and the setting for the option PerformanceGoal:

automaticClusterNumberMethods[type_, performanceGoal_, dims_]:= If[
    MachineLearning`file40Decisions`PackagePrivate`vectorSpaceQ[type],
    Switch[
            performanceGoal, Automatic | "Memory",
                If[Greater[Last @ dims, 7],
                    {"DBSCAN", "NeighborhoodContraction", "Agglomerate"},
                    {"DBSCAN", "NeighborhoodContraction", "GaussianMixture", 
      "Agglomerate"}
                ],
            "Speed",
                {"DBSCAN", "GaussianMixture", "NeighborhoodContraction"},
            "Quality",
                {
                    "Agglomerate", "DBSCAN", "JarvisPatrick", "MeanShift", 
     "Spectral", "SpanningTree",
                    "NeighborhoodContraction", "GaussianMixture"
                },
            "TrainingSpeed",
                {"DBSCAN", "NeighborhoodContraction"}
        ],
    {"DBSCAN", "JarvisPatrick"}
   ];

If the number of clusters is given the function MachineLearning`file40Decisions`PackagePrivate`givenClusterNumberMethods is called to determine the method to be used:

givenClusterNumberMethods[type_, performanceGoal_] := If[
    vectorSpaceQ[type],
    Switch[
        performanceGoal, Automatic | "Memory" | "Speed",
            {"KMeans", "Agglomerate"},
        "Quality",
            {"KMeans", "Agglomerate", "Spectral", "KMedoids"},
        "TrainingSpeed",
            {"KMeans"}
    ],
    If[MatchQ[type, {"Location"}],
        {"KMedoids"},
        {"KMedoids", "Agglomerate"}
    ]
];
$\endgroup$
  • $\begingroup$ Very nice. +1. Just one remark. In my application several methods have been tried automatically bij FindClusters[.] before it finalizes. Following the above example, DeleteDuplicates[.] masks which was the final method executed. Removing the DeleteDuplicates[.] entirely shows the order in which the various methods were called. $\endgroup$ – Romke Bontekoe Apr 5 at 12:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.