我有一个对象列表(可能不超过100个),其中每个对象与所有其他对象的距离。该距离仅仅是这些对象共享的所有字段之间的额外绝对差异。可能只有少数(一个)或多个(几十个)字段,因此距离的维度并不重要。
我想在2D图形中显示这些点,使得距离较小的物体看起来很近。我希望这将清楚地表达整个列表中有多少个子组。显然这个图的轴是没有意义的(我甚至不确定“图形”是否正确使用)。
将距离网络转换为2D点分布的好算法是什么?理想情况下,我希望对距离网络进行一些小改动,从而导致图形发生微小变化,因此渐进式进度可视为随时间的平滑变化。
我已经找到了我正在寻找的那种结果的一个小例子: Example Graphic http://en.wiki.mcneel.com/content/upload/images/GraphExample.png
任何想法都非常感谢, 大卫
它实际上似乎有效。我将整个值集视为二维粒子云,在所有粒子之间构建反平方排斥力,并基于反距离构造线性吸引力。它不是一个稳定的算法,每当执行额外的迭代时,结果往往会剧烈旋转,但它似乎总能产生与视觉聚类的良好分离:
alt text http://en.wiki.mcneel.com/content/upload/images/ParticleCloudSolution.png
如果有人感兴趣的话,我可以发布C#代码(遗憾的是有很多)
答案 0 :(得分:2)
Graphviz包含解决此问题的几种不同方法的实现;考虑使用其弹簧模型图形布局工具作为解决方案的基础。或者,其网站包含相关理论的a good collection of source material。
答案 1 :(得分:1)
您可能希望谷歌周围的条款,如:
GraphViz确实实现了其中一些算法,不确定它是否包含对您有用的任何算法。
一个注意事项 - 对于某些算法,对图表内容的细微更改可能会导致图表发生非常大的变化。
答案 2 :(得分:1)
以前的答案可能会有所帮助,但不幸的是,鉴于您对问题的描述,并不能保证有解决方案,事实上大部分时间都没有。
我认为您需要读入群集分析,因为有一些算法可以根据相关性度量将您的点分类为群集,然后您可以使用graphviz或类似的东西来绘制结果。 http://en.wikipedia.org/wiki/Cluster_analysis
我非常喜欢的是“最小切割分区算法”,请参见此处:http://en.wikipedia.org/wiki/Cut_(graph_theory)