加权法衡量差异
加权平均法
的概念直接看这篇博客加权平均法就明白了。
在每一个数的权数相同的情况下,加权平均值就等于算数平均值。
以正常视力的人眼为例:
- 距离人越近的位置,视野越清晰,可信度更高,所以分配的权重更大;
- 距离人越远的位置,视野越模糊,可信度越低,所以分配的权重更小;
上面博客中的加权平均法用来一个事物衡量平均水平,还可以衡量两个事物的差异。
下面的例子是衡量两条线的差异程度:
本例中,加权平均法会根据不同位置来分配不同权重。
就是 动态权重,根据某点
离原点
的距离,越远越不可靠,权重越低。
例:有两条线,线上的点距离原点越远,可信度越低
。现在需要评估两条线的相似程度,就是量化distance
,可以分别选取两条线上的三个点,对三对点分别计算距离,然后分配不同权重,进行加权平均,就得到了两条线的差异:
有两条线L1
,L2
有一系列点(已知每个点的坐标x
、y
值,注意图中xy
方向与上学时课本上的不一样)L1
: 起点A1
,终点B1
L2
: 起点A2
,终点B2
- 1.先找出
L1
,L2
的x
方向公共部分
,得到公共部分在x
方向距离原点
的距离start
、end
; - 2.然后根据
start
、end
求出中间点:mid=(end - start)/2
; - 3.然后再从
L1
,L2
中分别找出x方向
距离最接近start
、mid
、end
的点,得到首中尾三对点:
-
start
点对:start_point_1
对应图中L1
中的A1
,start_point_2
对应图L2
中A2'
-
mid
点对:mid_point_1
,mid_point_2
-
end
点对:end_point_1
对应图L1
中B1'
,end_point_2
对应图L2
中B2
其中:
-
start_point_1
,mid_point_1
,end_point_1
是L1
上的点,start_point_1.x < mid_point_1.x < end_point_1.x
-
start_point_2
,mid_point_2
,end_point_2
是L2
上的点,start_point_2.x < mid_point_2.x < end_point_2.x
注意:start
、mid
、end
是长度是距离,不是点,start_point_1
,mid_point_1
,end_point_1
,start_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
,那么两条线L1
和L2
重合。
不要简单理解为计算两条线的距离,要注意到里面的限定条件是线上的点距离原点越远,可信度越低
,所以才使用了加权法。
如果两条线上所有点可信度一样,即权重一样,那么计算的这两条线的距离,可以直接使用wStart = wMid = wEnd =1/3
,然后1/3*(起点之间距离 + 中间点之间距离 + 终点之间距离)
。