【问题标题】:'Stable' multi-dimensional scaling algorithm“稳定”多维缩放算法
【发布时间】:2013-11-28 10:40:53
【问题描述】:

我有一个节点的无线网状网络,每个节点都能够报告其与其邻居的“距离”,以(简化的)信号强度来衡量。节点在地理上位于 3d 空间中,但由于无线电干扰,节点之间的距离不需要三角(三角?)一致。即,给定节点 A、B 和 C,A 和 B 之间的距离可能是 10,A 和 C 之间的距离也可能是 10,而 B 和 C 之间的距离可能是 100。

我想做的是根据节点的连接性来可视化逻辑网络布局,即在视觉中包含节点之间的逻辑距离。

到目前为止,我的研究表明,多维缩放 (MDS) 正是为这类事情而设计的。鉴于我的数据可以直接表示为二维距离矩阵,它甚至是更一般的 MDS 的更简单形式。

现在,似乎有很多 MDS 算法,参见例如http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.htmlhttp://tapkee.lisitsyn.me/ 。我需要在 C++ 中执行此操作,我希望我可以使用现成的组件,即不必从论文中重新实现算法。所以,我认为:https://sites.google.com/site/simpmatrix/ 将是门票。它有效,但是:

  • 布局不稳定,即每次重新运行算法时,节点的位置都会发生变化(见下图 1 和 2 之间的差异 - 这是因为已经运行了两次,没有任何进一步的变化)。这是由于传递给该算法的初始化矩阵(其中包含每个节点的初始位置,然后算法会迭代校正) - 我传递一个空的,然后实现派生一个随机的。一般来说,布局确实接近我对给定输入数据所期望的布局。此外,在不同的运行之间,节点的方向(顺时针或逆时针)可以改变。见下图 3。

  • 我认为很明显的“解决方案”是传递一个稳定的默认初始化矩阵。但是当我最初将所有节点放在同一个地方时,它们根本没有移动;当我将它们放在一个轴上时(节点 0 位于 0,0 ;节点 1 位于 1,0 ;节点 2 位于 2,0 等),它们仅沿该轴移动。 (见下图 4)。不过它们之间的相对距离还可以。

所以看起来这个算法只改变节点之间的距离,但不改变它们的位置。

感谢您阅读本文 - 我的问题是(我很乐意回答其中的一个或几个问题,因为每个问题都可能让我知道继续前进的方向):

  • 我在哪里可以找到有关众多 MDS 算法的属性的更多信息?
  • 是否有一种算法可以导出网络中每个节点的完整位置,而无需传递每个节点的初始位置?
  • 是否有可靠的方法来估计每个点的位置,以便算法可以正确缩放它们之间的距离?我没有这些节点的地理位置,这是本练习的重点。
  • 是否有任何算法可以在两次运行之间保持网络派生的“角度”不变?

如果一切都失败了,我的下一个选择是使用我上面提到的算法,增加迭代次数以将运行之间的可变性保持在几个像素左右(我必须试验多少次迭代这将采取),然后围绕节点 0“旋转”每个节点,例如,将节点 0 和 1 在水平线上从左到右对齐;这样,在 MDS 算法确定点的相对距离后,我会“纠正”点的位置。我还必须纠正每个节点周围连接节点的顺序(顺时针或逆时针)。这可能很快就会变得多毛。

显然我更喜欢稳定的算法解决方案 - 增加迭代以消除随机性并不是很可靠。

谢谢。

编辑:我被推荐到 cs.stackexchange.com 并在那里制作了一些 cmets;有关算法建议,请参阅https://cs.stackexchange.com/questions/18439/stable-multi-dimensional-scaling-algorithm

图 1 - 带有随机初始化矩阵:

图像 2 - 使用相同的输入数据运行后,与 1 相比旋转:

图 3 - 与前 2 相同,但节点 1-3 在另一个方向:

图 4 - 节点的初始布局在一条线上,它们在 y 轴上的位置没有改变:

【问题讨论】:

  • 在进一步开发我的测试数据集之后,我发现我还有一个需求。我没有所有节点之间的距离 - 网络一侧的节点可能与另一侧的节点遥不可及。我需要一种能够指定这一点的方法,而不必指定彼此无法到达的那些之间的较大距离,因为这样它们之间的距离在结果图中将是相同的。最好是我希望无法触及的节点彼此远离,但如果我不绘制它们之间的连接,视觉效果可能也会很清晰。
  • 您可以添加一个假距离来分隔未连接的组(您可能知道这一点,但您想要的是图中的“简单连接的组件”),但不幸的是每个组都可以单独反映和旋转.我删除了我的答案,因为它只是重复了您已有的想法。
  • 谢谢,我不知道这个词,我会朝那个方向调查。回复:另一个答案,好清楚 - 我只是在检查我是否遗漏了一个细节。我能找到的关于这个主题的信息比我的大部分正常工作要密集得多,我需要经常检查两次和三次 :) 再次感谢您参与这个小众问题 - 我什至找不到任何标签它真的属于。
  • 没问题。这类问题最有趣,只是越来越少见了……

标签: c++ algorithm graph-algorithm


【解决方案1】:

大多数缩放算法有效地在节点之间设置“弹簧”,其中弹簧的静止长度是边缘的所需长度。然后他们试图最小化弹簧系统的能量。但是,当您初始化所有节点时,任何一个节点移动时释放的能量在各个方向上都是相同的。因此相对于每个节点位置的能量梯度为零,因此算法将节点留在原处。同样,如果你从一条直线开始,渐变总是沿着这条线,所以节点只会沿着这条线移动。

(在很多方面这是一个有缺陷的解释,但它适用于直觉)

尝试将节点初始化为位于单位圆上、网格上或任何其他方式,以使它们不都是共线的。假设库算法的更新方案是确定性的,那应该为您提供可重现的可视化并避免退化条件。

如果库是非确定性的,要么找到另一个确定性的库,要么打开源代码并将随机生成器替换为使用固定种子初始化的 PRNG。不过,我推荐前一个选项,因为其他更高级的库应该允许您设置您想要“忽略”的边缘。

【讨论】:

  • 感谢您的回答。自从提出这个问题后,我的研究使我相信 MDS 不是解决我的问题的正确方法。 (一旦我通过一个可行的替代方案确认了这一点,我将立即更新问题......)这里可能存在术语问题,但据我所知,您所描述的不是 MDS 算法,而是图布局算法。这就是我要使用的,主要基于这篇论文:cs.ubc.ca/~tmm/courses/533/morereadings/dejordy.pdf。 Boost.Graph 实现了几个基于 spring 的图形布局算法。
  • (愚蠢的评论长度限制...) MDS 算法的一个基本属性(在我读过的文献中描述的)是它们需要一个完整的距离矩阵,即需要每个节点之间的吸引力或排斥力。而图形算法,如基于弹簧的算法,不需要这个。所以感谢您的回答 - 这是我要尝试的。正如我所提到的,一旦我通过实际实施验证了这一点,我将用我的最终结果更新这个问题。
  • 是的,MDS 算法与图形布局算法不同(我想知道您为什么不使用后者,但认为您有自己的理由),但是许多/大多数 MDS 算法总结了一些每对节点之间的成本函数排序,然后使用下坡优化技术来最小化总和的值。在那种情况下,我描述的弹簧隐喻仍然是一个很好的物理类比,它解释了共线起始位置的问题,即使它不是算法的基础,就像它在力导向的图形绘制中一样。无论如何,祝您实施顺利!
  • 好的,我认为您的评论在我回复之前的前几次阅读时都超出了我的想象。你的新评论让它点击了,我想。感谢您将两者结合在一起——事实上,我现在明白了为什么当所有节点都在一条线上开始时,我会看到我看到的行为。鉴于这种心理模型,确实应该可以像您所说的那样“忽略”边缘,尽管这仍然不会给我带来网络“边缘”的节点将像我理解的那样彼此远离的行为,例如Kamada/Kawai 会的,对吗?
  • 是的,MDS 算法会很高兴地显示一棵所有点共线的树,除非你添加人造弹簧来迫使孩子分开。明确用于图形绘制的算法不应该有这个问题。
【解决方案2】:

我已阅读“SimpleMatrix”MDS 库的代码,发现它使用随机置换矩阵来决定点的顺序。固定排列顺序后(只用 srand(12345) 代替 srand(time(0))),相同数据的结果不变。

【讨论】:

    【解决方案3】:

    显然,对于这个问题,一般来说没有确切的解决方案;只有 4 个节点 ABCD 和距离 AB=BC=AC=AD=BD=1 CD=10 你无法清楚地绘制出合适的 2D 图(甚至不是 3D 图)。

    这些算法所做的只是在节点之间放置弹簧,然后模拟排斥/吸引力(取决于弹簧是短于还是长于规定距离),可能还会增加空间摩擦以避免共振和爆炸。

    要保持“稳定”图表,只需构建一个解决方案,然后仅更新距离,重新使用先前解决方案的当前位置作为起点。选择两个固定节点并对齐它们似乎是防止缓慢漂移的好主意,但我想说弹簧力永远不会最终产生旋转动量,因此我希望无论如何缩放和居中解决方案就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多