【问题标题】:Clustering 2D plot in Mathematica在 Mathematica 中聚类 2D 图
【发布时间】:2011-11-09 22:48:09
【问题描述】:
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}]

我想找到一种方法来聚集这些磁盘,因为它们彼此靠近。 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”磁盘:

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]

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

【问题讨论】:

  • 在这里查看我的答案stackoverflow.com/questions/3165867/…
  • 我不明白为什么你必须去掉气泡直径——它实际上是你的三维,不是吗?此外,您不必指定要查找的集群数量。您对高斯 blob 的最新编辑很酷,但我认为这是一个单独的问题。
  • Verbeia,我想我对 find clusters 不够敏捷,我以为我不能在其中包含我的第三维(半径),我会更加努力。

标签: wolfram-mathematica cluster-analysis


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    编辑

    也许您可以管理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]
    

    从这里,您还可以前往 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]
    

    【讨论】:

    • 非常感谢贝利撒留!最后一个正是我正在计算的。和 Mr.Wizard & Yoda 一样,我不知道你在做什么,但每次都很神奇!
    • +1 使用底层 Mathematica 系统的许多不同部分实现了一个很棒的完整实现。
    • @Verbeia 这正是我觉得 Mma 使用起来如此有趣的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2017-08-28
    相关资源
    最近更新 更多