当前位置: 华文星空 > 知识

【自动驾驶算法】分段最小二乘法拟合

2021-07-14知识

在之前做最小二乘法拟合车道线时,有时发现单线拟合不足以满足需求,这时候就需要分段线性回归模型解决该问题。

举一个简单的例子,在地球上任意一点温度(k)随高度(h)的变化:

上图显示了温度随高度(d_{t}/d_{z} )的变化。我们可以看到,温度的变化不是一条很好的直线。这在分析数据时产生了一些影响。例如,如果我们试图计算(d_{t}/d_{z} ),它给出的结果并不能准确地代表大气的不同层(或部分)的变化。

温度(K)随高度(m)和不同层的变化

事实上,我们可以将其划分为3个不同的层(或部分)。上面我们可以看到这些层的表示和它的近似高度(x轴)。断点是数据完全改变其行为的点,比如曲率斜率变化明显等。例如,断点1(表示为b1)是我们的起点;b1和b2之间的层有类似的d_{t}/d_{z} 。但是,当它到达b2时,d_{t}/d_{z} 的变化更加平滑,不再像以前那样呈指数增长。我们想要了解的是d_{t}/d_{z} 在每一层中是如何变化的,以及断点在哪里。

温度(K)随高度(m)的变化与最小二乘拟合结果

如果我们绘制数据并试图对其进行回归,拟合出来的效果就会非常差。然而,这并不意味着线性回归不是我们问题的最佳选择,我们稍微调整一下。

温度(K)随高度(m)的变化与三阶最小二乘法

上图绘制了一个拟合数据的三阶多项式回归。多项式回归的问题是,当添加多项式项(二次的,三次的,等等)时,你失去了模型的可解释性。但是在不同区间变化比较明显的情况,三次多项式也不能很好的表达数据,假如用更高阶呢?那么就可能会产生龙格现象,造成更差的结果。可我们换一种想法,可不可以针对特征进行数据分割去做呢?这时候我们就要考虑使用分段线性回归,其背后的想法是,如果数据在数据的不同区域遵循不同的线性趋势,如前所示,那么我们应该「分段」建模回归函数。下面是构成问题的方程组:

其中b1是第一个断点的x位置,b2是第二个断点的x位置,以此类推,直到最后一个断点 b_{nb} ,总共有nb个断点。 虽然解决线性回归相当简单,但仍然存在一个问题:如何找到断点?对我来说,这就是我被困的地方。您可以尝试使用一组for循环来强力解决它,但这不是最优的方法。值得庆幸的是,Charles Jekel创建了一个相对简单和直接的python库,名为pwlf

import pwlf
import pandas as pd
import numpy as np
#fit your data (x and y)
myPWLF = pwlf.PiecewiseLinFit(df['Height (m)'], df['Temperature (K)'])
#fit the data for n line segments
z = myPWLF.fit(3)
#calculate slopes
slopes = myPWLF.calc_slopes()
# predict for the determined points
xHat = df['Height (m)']
yHat = myPWLF.predict(xHat)
#calculate statistics
p = myPWLF.
se = myPWLF.se # standard errors
只需几行代码,您就可以创建如上所示的分段线性模型。在我的例子中,我知道我需要3个回归来匹配我的数据,所以我只是通过它,然后通过算法找到断点。PWLF算法是通过差分进化算法寻找给定函数的全局最小值;在我们的例子中,是残差的平方和。后面我会进一步说一下差分进化算法的本质及用法。


现在已知了断点,我们就可以拟合数据了。最令人惊奇的是你仍然可以将每个部分作为一个正常的线性回归来分析,计算与线性回归相同的统计量,等等。我们可以从上图中看到pwlf的结果。

分段线性回归利用了线性回归的优点,解决了简单线性回归无法解决的复杂问题。这个简单算法最令人惊叹的部分是,它可以让你通过解决多重线性回归来轻松理解数据,所以如果你的数据不适合单一的直线,分段线性回归可以帮助你。此外,我们还看到PWLF库是实现分段线性回归的一种相当简单的方法,并且有一种简单易懂的方法。掌握它可以帮助您对复杂的数据有更多的见解。