算法总结7—多维缩放

一直没有时间写…..唉

这个东西好像是属于数据可视化?反正就是把多维的数据降到低维空间但是仍然尽可能的保持原来数据之间的距离关系(就是在原来维度下离的远的点仍然离得远,接近的点仍然接近) 。最常见的应该就是降到2维以方便打印和屏幕输出。

算法的输入是所有数据在高维情况下两两之间的距离(记i与j的距离为Dij)。现在以降到2维为例说明这个算法。

首先我们把所有数据点随机绘制在一张二维图像上,然后计算它们两两之间的距离dij,然后我们计算出它与高维距离Dij的误差,根据这些误差,我们将每对数据点按比例移近或移远,然后重新计算所有dij,不断重复到我们没法减少误差为止。

还是来具体说明一下吧,假设有n个点

  1. 输入每一对点之间的距离Dij。
  2. 随机在2维平面生成n个点,点i坐标记为x[i]、y[i],计算它们两之间的距离,记为dij.
  3. 对所有i 和j计算:eij=(dij-Dij) / Dij,每个点用一个二维的值grad[k]来表示它要移动的距离的比例因子(初始为0,0)。在计算出每个eij后,计算 ((x[i] - x[j]) / dij)* eij,然后把它加到grad[i][x]上,同样把((y[i] - y[j]) / dij)* eij加到grad[i][y]上。
  4. 把所有eij的绝对值相加,为总误差,与前一次的总误差比较(初始化为无穷大),大于前一次的话就停止。否则把它作为上一次总误差,继续。
  5. 对每个点,新的坐标为x[i] - = rate * grad[i][x]  y[i] - = rate*grad[i][y],其中rate是开始时自己定义的一个常数参数,该参数影响了点的移动速度。重新计算各个dij,回到3。

伪码:

for m = 1 to 1000{
  for i=1 to n
    for  j = 1 to n
      dij=sqrt((x[i] – x[j])^2+(y[i]-y[j])^2)
  for i=1 to n
    gradi=0
  totale=0
  for i= 1 to n
    for j= 1 to n{
       if(j==i) continue
         eij=(dij-Dij) / Dij
         grad[i][0]+= ((x[i] - x[j]) / dij)* eij
         grad[i][1]+=((y[i] - y[j]) / dij)* eij
         totale+=abs(eij)
       }
  if (laste < totale) break;
  laste=totale
  for i=1 to n{
    x[i] -= rate * grad[i][x]
    y[i] - = rate* grad[i][y]
  }
}

恩,就是这样….最近这几个算法都不是很难恩………..

原文地址:https://www.cnblogs.com/luosha/p/2571545.html