【算法】局部加权回归(Lowess) - Go语言中文社区

【算法】局部加权回归(Lowess)


一、简介

1.1 预测问题

对于预测问题,回归中最简单的线性回归,是以线性的方法拟合出数据的趋势。但是对于有周期性,波动性的数据,并不能简单以线性的方式拟合,否则模型会偏差较大,而局部加权回归(lowess)能较好的处理这种问题。可以拟合出一条符合整体趋势的线,进而做预测。

1.2 平滑问题

同时,局部加权回归(lowess)也能较好的解决平滑问题。在做数据平滑的时候,会有遇到有趋势或者季节性的数据,对于这样的数据,我们不能使用简单的均值正负3倍标准差以外做异常值剔除,需要考虑到趋势性等条件。使用局部加权回归,可以拟合一条趋势线,将该线作为基线,偏离基线距离较远的则是真正的异常值点。
实际上,局部加权回归(Lowess)主要还是处理平滑问题的多,因为预测问题,可以有更多模型做的更精确。但就平滑来说,Lowess很直观而且很有说服力。

二、算法讲解

2.1 算法思想

局部加权回归(Lowess)的大致思路是:以一个点 x x x为中心,向前后截取一段长度为 f r a c frac frac的数据,对于该段数据用权值函数 w w w做一个加权的线性回归,记 ( x , y ^ ) (x,hat{y}) (x,y^)为该回归线的中心值,其中 y ^ hat{y} y^为拟合后曲线对应值。对于所有的 n n n个数据点则可以做出 n n n条加权回归线,每条回归线的中心值的连线则为这段数据的Lowess曲线。

2.2 参数讲解

在这个思路中,能提取出的可调参数则是:
1.长度 f r a c frac frac,应该截取多长的作为局部处理, f r a c frac frac为原数据量的比例;
2.权值函数 w w w,使用什么样的权值函数 w w w合适;
3.迭代次数 i t it it,在进行一次局部回归后,是否需要迭代,再次做回归;
4. d e l t a delta delta回归间隔,是否真的每个点都需要算一次加权回归,能否隔 d e l t a delta delta距离算一次,中间没算的用插值替换即可。

在了解了算法算法的大致思想和可调参数以后,你可以马上上手使用statsmodels.api.nonparametric.lowess了。使用方法如下:

import statsmodels.api as sm
lowess = sm.nonparametric.lowess
result = lowess(y, x, frac=0.2, it=3, delta=0.0)

但是,在statsmodels中,你会发现:1、权值w函数你是不可调的;2、在用了 d e l t a delta delta之后,插值函数你是不可调的。
总之就是,黑盒子,很多你都不可调的。而且它还有一个非常严重的问题,具体可看本文3.3效果对比。
接下来就是看相关文档,了解思路,之后,你可以自己写一个lowess,而且速度不会慢。

相关文档,statsmodels就给出了比较权威的参考:《Cleveland, W.S. (1979) “Robust Locally Weighted Regression and Smoothing Scatterplots”. Journal of the American Statistical Association 74 (368): 829-836.》。
文章是《鲁棒性的加权回归》,即原始加权基础上迭代,增加鲁棒性。网上还有一些其他的lowess讲解,我看了,和这个不太一样,可以选择性阅读。

2.3 权值函数

理解了lowess之后,可以明白,其实权值函数并不是固定的,只要满足一定的规则条件即可(当然并也非强制),条件如下:
1. W ( x ) > 0    f o r    ∣ x ∣ < 1 W(x)>0 ; for ; |x|<1 W(x)>0forx<1;
2. W ( − x ) = W ( x ) W(-x)=W(x) W(x)=W(x);
3. W ( x )    i s    a    n o n i n c r e a s i n g    f u n c t i o n    f o r    x ⩾ 0 W(x) ; is ; a ; nonincreasing ; function ; for ; x geqslant 0 W(x)isanonincreasingfunctionforx0;
4. W ( x ) = 0    f o r    ∣ x ∣ ⩾ 1 W(x)=0 ; for ; |x| geqslant 1 W(x)=0forx1

选择该类函数大致思路是:希望 W ( x ) W(x) W(x)大于0,且作用域为[-1,1],且为对称函数,该函数对于中间(0处)的值较大,两边(-11)处值较小。
选择思路是,中间的权值较高,对于加权回归的影响较大;[-1,1]的原因是,对于任意不规则的数据段,可以压缩映射到[-1,1],方便处理。

权值函数如,B函数(二次函数):
B ( x ) = { ( 1 − x 2 ) 2 , f o r    ∣ x ∣ < 1 0 , f o r    ∣ x ∣ ⩾ 1 B(x)=left{ begin{aligned} & (1-x^{2})^{2}, & for ; |x| < 1 \ & 0, & for ; |x| geqslant 1 end{aligned} right. B(x)={(1x2)2,0,forx<1forx1

W函数(三次函数):
W ( x ) = { ( 1 − ∣ x ∣ 3 ) 3 , f o r    ∣ x ∣ < 1 0 , f o r    ∣ x ∣ ⩾ 1 W(x)=left{ begin{aligned} & (1-|x|^{3})^{3}, & for ; |x| < 1 \ & 0, & for ; |x| geqslant 1 end{aligned} right. W(x)={(1x3)3,0,forx<1forx1

二次与三次函数的区别在于,三次函数对于周围权值降速更快,在平滑最初时候效果好,且适用于大多数分布,但增加了残差的方差。
对于权值函数选取,第一次迭代适用W函数(三次函数),之后迭代使用B函数(二次函数)。
权值函数的使用:
1、使用权值函数 W ( x ) W(x) W(x)
2、数据段 [ d 1 , d 2 ] [d_{1},d_{2}] [d1,d2],映射成 [ − 1 , 1 ] [-1,1] [1,1]对应的坐标;
3、带入函数 W ( x ) W(x) W(x),计算出每个点对应的 w i w_{i} wi
4、使用加权回归得出模型: Y ^ = X ( X T w X ) − 1 X T w Y hat{Y}=X(X^{T}w X)^{-1}X^{T}w Y Y^=X(XTwX)1XTwY(推导见我的另一篇博客:
线性回归,加权回归,推导过程

2.4 回归迭代

上面讲了权值函数的选取和使用,提到了迭代,这里讲解怎么迭代。
首先,原值为 y y y,预测值为 y ^ hat{y} y^,残差为 e = y − y ^ e=y-hat{y} e=yy^,记 s s s ∣ e i ∣ |e_{i}| ei的中位数。鲁棒性的权值调整附加值 δ k = W ( e k 6 s ) delta_{k}=W(frac{e_{k}}{6s}) δk=W(6sek),修正后的权值为 δ k w k delta_{k}w_{k} δkwk
迭代过程为:
1.使用W函数(三次函数)作为权值函数,求出 w i w_{i} wi
2.将 w i w_{i} wi带入加权回归计算出 y ^ hat{y} y^
3.求出 e = y − y ^ e=y-hat{y} e=yy^ s s s
4.以B函数作为修正权值函数,求出 δ k = B ( e k 6 s ) delta_{k}=B(frac{e_{k}}{6s}) δk=B(6sek),计算出 δ k w k delta_{k}w_{k} δkwk
5.将 δ k w

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/longgb123/article/details/79520982
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢