python - 给定测地线的成对距离矩阵,哪些算法可用于为流形生成欧几里德嵌入?

标签 python algorithm numpy matrix scikit-learn

我有一个方阵 D (目前表示为形状为 (572, 572) 的 numpy 数组)似乎对应于沿大致圆柱形物体表面的点之间的成对距离。即,值 D[i,j]对应于沿该空心圆柱体表面的任何路径的最小长度。如何将这 572 个点构建到保留那些测地线距离的欧氏空间中的 3 维(或 n 维)嵌入?

当前尝试

locally linear embedding这样的算法和 isomap能够采用成对的测地线距离矩阵并输出嵌入,以便成对的 euclidean 距离与原始测地线相同。虽然这通常不是同一个任务,但在输出恰好在某个维度上接近超立方体的情况下,所需的转换实际上已经发生(考虑 swiss roll ),因为嵌入本身是一个流形,所以欧氏距离对应于测地距离。

对于像圆柱体这样稍微复杂一点的物体来说情况并非如此。通过将测地线距离视为欧几里德距离,所需圆柱体上的对映点被映射到彼此相距比所需距离远得多的位置,并且相应的全局优化问题通常会导致分支结构,分支的末端对应于最大距离的对映点,放大圆柱体随机采样中的小扰动。一般来说,这些算法的简单应用似乎无法解决手头的问题。

另一种颇有成效(尽管成本高昂)的方法是粗暴的蒙特卡洛 技术。我从具有不同参数的管状对象生成随机样本,直到找到一组参数生成类似于我的测地线距离矩阵,直至排列(通过求解将距离矩阵转换为我的线性系统并进行测试来处理效率不是太低查看结果是否接近置换矩阵)。然后,通过找到与上述近似置换矩阵最近的置换矩阵,执行从我的 572 个点到该对象的近似最优映射,保持成对距离。

这产生了合理的结果,但它以数据的形状为前提,而且代价高得惊人。我已经执行了一些更明显的优化,例如使用小的随机样本而不是整个数据集,以及使用基于梯度的技术进行参数估计,但更通用的技术会更好。

注意事项

这个问题当然没有唯一解。即使假设流形可以在 3 空间中从有限均匀采样中明确识别,仅挤压圆柱体会产生具有相同测地线和不同欧氏距离(因此不同嵌入)的形状。这并不比 LLE 和 Isomap 产生不同的解决方案更困扰我,我会接受任何合理的答案。

关于从有限样本中唯一识别流形,为了争论,我会很好地使用 dist_matrix_来自拟合的属性 Isomap来自 scikit-learn 的类(class)没有任何特殊参数的包来查找测地线。这执行了不必要的 MDS步骤,但它并不是非常昂贵,而且开箱即用。然后我们想要一个最小化原始测地线距离矩阵和 dist_matrix_ 之间的 frobenius 距离的嵌入。属性。

最佳答案

虽然我最初排除了局部线性嵌入和其他类似技术,但似乎仓促行事。由于流形实际上是局部线性的,因此充分采样、足够好的流形具有以下特性:它的小测地线距离与其对应的欧氏距离大致相同。

考虑到这一点,任何将最近的测地线邻居视为最近的欧几里德邻居并通过测地线距离近似欧几里德距离的重建都将近似地保持全局测地线距离,直到累积误差项.这意味着所有仅使用局部距离的标准算法都能够提供近似正确的嵌入。这些包括但不限于

  • 局部线性嵌入
  • 等轴测图
  • 光谱嵌入

一些经典的嵌入算法将无法正常工作在此应用程序中,因为它们试图保留所有距离,并且大测地线可能无法很好地表示欧氏距离。例如,多维缩放在没有修改的情况下是不合适的。

注意 在我的初步分析中,LLE 似乎产生糟糕结果的原因是违反了我的假设之一——流形被充分采样。我将它应用于具有已知所需行为的简单形状,但我错误地使用了太少的点以确保在我的分析中形成快速反馈循环。更好采样的流形的行为完全符合预期。

关于python - 给定测地线的成对距离矩阵,哪些算法可用于为流形生成欧几里德嵌入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705667/

相关文章:

python - 当unicodecsv.DictReader在Python2.7中解析UTF-8-BOM文件时,如何删除第一个字段名称中的引号字符?

algorithm - 具有不等式、AND 和幂的二叉树

c++ - 找出特定整数有多少个二进制数字

python - numpy 函数的省时组合

python - AttributeError: 'module'对象没有属性 'spectrogram'

python - Apache 与 Django/Matplotlib 应用程序一起挂起

python - 使用 django 过滤器搜索多个单词时该怎么办

python - tkinter 按钮边框的一半是白色的?

javascript - JavaScript 图形探索算法中的递归

python - 使用 Numpy 加载文本时出现内存错误