在Mathematica中聚类2D绘图

时间:2011-09-04 01:52:43

标签: wolfram-mathematica cluster-analysis

laListe={{{{10, 17}, 1}, {{33, 12}, 1}, {{32, 17}, 1}, {{9, 10},1}, 
         {{22, 24}, 1},{{27, 6}, 2}, {{25, 13}, 2}, {{30, 9}, 2}}, 
         {{{14, 12}, 1},{{19, 17}, 1}, {{7, 21}, 1}, {{7, 24},1}, 
         {{27, 19}, 1}, {{12, 16}, 2}, {{13, 20}, 2}, {{20, 22}, 2}}}

FrameXYs = {{4.32, 3.23}, {35.68, 26.75}}


Row[Function[compNo, 
             Graphics[{White, EdgeForm[Thick], 
             Rectangle @@ FrameXYs, 
             Black, 
             Disk[Sequence @@ laListe[[compNo, #]]] & /@ 
             Range[Length@laListe[[compNo]]]}, ImageSize -> 300]] /@ 
             {1, 2}]

enter image description here

我想找到一种方法来聚集这些磁盘,因为它们彼此接近。 Mathematica有内置功能来做这样的事情吗?

编辑

当我尝试使用FindClusters时,我遇到了一些不便:

使用:

list1={{{24.413, 6.5978}, {7.68887, 7.2147}, {29.357, 13.2822}, 
       {6.22436, 9.7145}, {22.7162, 17.7198}, {13.6851, 5.7635}, 
       {18.8062, 12.9946}, {8.04889, 16.7414}}}

FindClusters是否取消了小数:

FindClusters[Flatten[list1,1]]

出:

  {{{{24.413, 6.5978}, {7.68887, 7.2147}, {29.357, 13.2822}, 
     {6.22436,9.7145}, {22.7162, 17.7198}, {13.6851, 5.7635}, 
     {18.8062,12.9946}, {8.04889, 16.7414}}}}

鉴于:

  FindClusters[Flatten[Round[list1], 1]]

出:

   {{{24, 7}, {29, 13}, {23, 18}, {14, 6}, {19, 13}}, 
    {{8, 7}, {6, 10}, {8, 17}}}

然后,要做到这一点,我必须摆脱磁盘直径,这对我来说是重要的视觉集群。 然后我想捕捉对齐。当5个磁盘未分组但对齐时。而且,当我在一些组合物上测试它时,它没有找到那些。

我正在尝试的是使用以下内容“点击”磁盘:

pointize[{{x_,y_},r_},size_:12] :=
                                  Table[{x+r Cos[i ((2\[Pi])/size)],
                                  y+r Sin[i ((2\[Pi])/size)]},{i,0,size}]

我最初用它来计算那些磁盘的ConvexHullArea。我觉得这可以帮助我考虑到半径,但实施起来很棘手,我甚至不确定它是否相关

另外,我希望它只是小数问题,但是我不能使用FindClusters [list],但是必须给它我想要FindClusters [list,3]的簇数,而我想要的是拥有它相同的算法可以在不同的组合上找到不同的簇号。

您是否会想到使用FindClusters进行特定设置和/或距离功能?

修改

由于此前的专家感谢以前的技巧,我发现了一些有趣的东西。只是一个想法,我需要找到一种方法量化它并将新图像以矩阵形式左右使用。

comp1 = Graphics[{White, Rectangle @@ FrameXYs, Black, 
     Disk[Sequence @@ laListe[[1, #]]] & /@ Range[Length@laListe[[1]]]},
     ImageSize -> 300]

enter image description here

     Binarize[ImageCorrelate[comp1, GaussianMatrix[40]], .95]

enter image description here

2 个答案:

答案 0 :(得分:7)

是的,FindClusters应该做你想做的事。 有一个tutorial。您可能必须将数据展平为n次3矩阵。

答案 1 :(得分:4)

或者,你可以使用类似的东西:

Table[Colorize[
  MorphologicalComponents[Blur[ColorNegate@comp1, i], .05]], {i, 1, 60, 10}]

enter image description here

您也可以使用Dilation,具体取决于您想要的区域类型

Table[Colorize@
  MorphologicalComponents@Dilation[ColorNegate@comp1, DiskMatrix@i], {i,1,60,10}]

enter image description here

顺便说一句,在这里你有办法使用FindClusters,效率不高,而且结果可能不直观:

ImageRotate[Rasterize[
  Show[
    ListPlot@
    FindClusters[Position[ImageData@Binarize@ColorNegate@comp1, 1, {2}], 3],
  Axes -> False, AspectRatio -> Automatic]], 3 Pi/2]

enter image description here

修改

您可以管理FindClusters选项以获得更好的结果。例如:

ImageRotate[Rasterize[Show[
   ListPlot@
    FindClusters[
     Position[ImageData@Binarize@Rasterize[ColorNegate@comp1, RasterSize -> 200], 
     1, {2}], 
    3, Method -> {"Agglomerate", "Linkage" -> "Complete"}], 
   Axes -> False, AspectRatio -> Automatic]], 3 Pi/2]

enter image description here

从这里,你也可以去Convex Hull:

<< ComputationalGeometry`
fc = FindClusters[
       Position[
         ImageData@Binarize@
            Rasterize[ColorNegate@comp1, RasterSize -> 200], 
       1, {2}], 
     3, Method -> {"Agglomerate", "Linkage" -> "Complete"}];
ImageRotate[Graphics[Polygon@(#[[ConvexHull[#]]]) & /@ fc, Frame->True], 3 Pi/2]

enter image description here