加权法衡量差异

加权平均法的概念直接看这篇博客加权平均法就明白了。

在每一个数的权数相同的情况下,加权平均值就等于算数平均值。

以正常视力的人眼为例:
  • 距离人越近的位置,视野越清晰,可信度更高,所以分配的权重更大;
  • 距离人越远的位置,视野越模糊,可信度越低,所以分配的权重更小;

上面博客中的加权平均法用来一个事物衡量平均水平,还可以衡量两个事物的差异。


下面的例子是衡量两条线的差异程度:

本例中,加权平均法会根据不同位置来分配不同权重。

就是 动态权重,根据某点原点的距离,越远越不可靠,权重越低。

例:有两条线,线上的点距离原点越远,可信度越低。现在需要评估两条线的相似程度,就是量化distance,可以分别选取两条线上的三个点,对三对点分别计算距离,然后分配不同权重,进行加权平均,就得到了两条线的差异:

java加权平均值_java加权平均值

有两条线L1,L2有一系列点(已知每个点的坐标xy值,注意图中xy方向与上学时课本上的不一样)
L1: 起点A1,终点B1L2: 起点A2,终点B2

  • 1.先找出L1,L2x方向公共部分,得到公共部分在x方向距离原点的距离startend;
  • 2.然后根据startend求出中间点:
    mid=(end - start)/2;
  • 3.然后再从L1,L2中分别找出x方向距离最接近startmidend的点,得到首中尾三对点:
  • start点对:start_point_1对应图中L1中的A1start_point_2对应图L2A2'
  • mid 点对: mid_point_1mid_point_2
  • end 点对:end_point_1对应图L1B1'end_point_2对应图L2B2

其中:

  • start_point_1,mid_point_1,end_point_1L1上的点,start_point_1.x < mid_point_1.x < end_point_1.x
  • start_point_2,mid_point_2,end_point_2L2上的点, start_point_2.x < mid_point_2.x < end_point_2.x

注意:startmidend是长度是距离,不是点,start_point_1,mid_point_1,end_point_1start_point_2,mid_point_2,end_point_2是点,不要混淆了。

  • 4.得到首中尾三个点后,根据三个点离原点的距离设置权重:

代码如下:
// 计算两个start点的距离,两个mid点的距离,两个end点的距离
float start_dist = std::sqrt(std::pow(start_point_1.x - start_point_2.x, 2) 
                     + std::pow(start_point_1.y - start_point_2.y, 2));

float mid_dist = std::sqrt(std::pow(mid_point_1.x - mid_point_2.x, 2)
                      + std::pow(mid_point_1.y - mid_point_2.y, 2));

float end_dist = std::sqrt(std::pow(end_point_1.x - end_point_2.x, 2) 
                   + std::pow(end_point_1.y - end_point_2.y, 2));

//加权法求各个权重,权重是根据距离来定的
float wSigma = 1.0 / (std::abs(start) + std::abs(mid) + std::abs(end));
float wStart  = 0.5 * wSigma * (std::abs(mid) + std::abs(end));
float wMid = 0.5 * wSigma * (std::abs(start) + std::abs(end));
float wEnd    = 0.5 * wSigma * (std::abs(start) + std::abs(middle));

// 则两条线的距离可以通过三对点的距离,使用加权法近似表示为
float distance = wStart * start_dist 
		       + wMid * mid_dist 
		       + wEnd * end_dist;

从上面代码最后一句可以看出,如果distance==0,那么两条线L1L2重合。
不要简单理解为计算两条线的距离,要注意到里面的限定条件是线上的点距离原点越远,可信度越低,所以才使用了加权法。

如果两条线上所有点可信度一样,即权重一样,那么计算的这两条线的距离,可以直接使用wStart = wMid = wEnd =1/3,然后1/3*(起点之间距离 + 中间点之间距离 + 终点之间距离)