前言
最小角回归涉及到了相关系数(current correlations),但这里并不会具体定义相关系数的定义,只需要在知道它是用来衡量两个变量相关程度的就可以了。
算法思想
这里用一张图来说明算法的基本思想:
从
简
单
的
情
况
说
明
,
假
设
有
两
个
样
本
x
1
和
x
2
,
真
实
标
签
为
y
2
^
(
图
中
绿
色
的
,
请
自
行
屏
蔽
绿
色
的
y
1
^
因
为
它
对
于
说
明
算
法
思
想
每
啥
用
)
从简单的情况说明,假设有两个样本x_{1}和x_{2},真实标签为\hat{y_{2}}(图中绿色的,请自行屏蔽绿色的\hat {y_{1}}因为它对于说明算法思想每啥用)
从简单的情况说明,假设有两个样本x1和x2,真实标签为y2^(图中绿色的,请自行屏蔽绿色的y1^因为它对于说明算法思想每啥用)
算
法
从
μ
0
^
=
0
开
始
,
从
图
中
也
可
以
看
出
,
y
2
^
−
μ
0
^
显
然
比
x
2
更
靠
近
x
1
,
这
个
“
靠
近
程
度
”
使
用
相
关
系
数
来
衡
量
的
,
即
:
算法从\hat{ \mu_{0}}=0开始,从图中也可以看出,\hat{y_{2}}- \hat{\mu_{0}}显然比x_{2}更靠近x_{1},这个“靠近程度”使用相关系数来衡量的,即:
算法从μ0^=0开始,从图中也可以看出,y2^−μ0^显然比x2更靠近x1,这个“靠近程度”使用相关系数来衡量的,即:
c
1
(
μ
0
^
)
=
x
1
(
y
2
^
−
μ
0
^
)
(1)
c_{1}(\hat{\mu_{0}})=x_{1}(\hat{y_{2}}-\hat{\mu_{0}})\tag{1}
c1(μ0^)=x1(y2^−μ0^)(1)
c
2
(
μ
0
^
)
=
x
2
(
y
2
^
−
μ
0
^
)
(2)
c_{2}(\hat{\mu_{0}})=x_{2}(\hat{y_{2}}-\hat{\mu_{0}})\tag{2}
c2(μ0^)=x2(y2^−μ0^)(2)
c
1
(
μ
0
^
)
>
c
2
(
μ
0
^
)
(3)
c_{1}(\hat{\mu_{0}})>c_{2}(\hat{\mu_{0}})\tag{3}
c1(μ0^)>c2(μ0^)(3)
于是算法会沿着
x
1
x_{1}
x1走一步,走多大呢?这里有个公式(
γ
1
可
以
看
成
是
步
长
\gamma_{1}可以看成是步长
γ1可以看成是步长):
μ
1
^
=
μ
0
^
+
γ
1
^
x
1
(4)
\hat{\mu_{1}}=\hat{\mu_{0}}+\hat{\gamma_{1}}x_{1}\tag{4}
μ1^=μ0^+γ1^x1(4)
然后再计算:
c
1
(
μ
1
)
=
x
1
(
y
2
^
−
μ
1
^
)
(5)
c_{1}(\mu_{1})=x_{1}(\hat{y_{2}}-\hat{\mu_{1}})\tag{5}
c1(μ1)=x1(y2^−μ1^)(5)
c
2
(
μ
1
)
=
x
2
(
y
2
^
−
μ
1
^
)
(6)
c_{2}(\mu_{1})=x_{2}(\hat{y_{2}}-\hat{\mu_{1}})\tag{6}
c2(μ1)=x2(y2^−μ1^)(6)
发现此时:
c
1
(
μ
1
)
=
c
2
(
μ
1
)
(7)
c_{1}(\mu_{1})=c_{2}(\mu_{1})\tag{7}
c1(μ1)=c2(μ1)(7)
怎么解释上面的等式?看图,将
x
2
向
右
平
移
到
μ
1
^
处
,
y
2
^
−
μ
1
^
可
以
看
成
平
分
x
1
和
x
2
之
间
的
夹
角
。
x_{2}向右平移到\hat{\mu_{1}}处,\hat{y_{2}} - \hat{\mu_{1}}可以看成平分x_{1}和x_{2}之间的夹角。
x2向右平移到μ1^处,y2^−μ1^可以看成平分x1和x2之间的夹角。
y
2
^
−
μ
1
^
是
坐
落
在
单
位
向
量
μ
2
的
方
向
上
的
\hat{y_{2}}-\hat{\mu_{1}}是坐落在单位向量\mu_{2}的方向上的
y2^−μ1^是坐落在单位向量μ2的方向上的,那么下一步的更新方向是:
μ
2
^
=
μ
1
^
+
γ
2
^
μ
2
\hat{\mu_{2}}=\hat{\mu_{1}}+\hat{\gamma_{2}}\mu_{2}
μ2^=μ1^+γ2^μ2
在两个样本的情况下,
γ
2
^
\hat{\gamma_{2}}
γ2^是需要选择合适的大小(有两种选择算法可供选择
γ
^
\hat{\gamma_{}}
γ^)使得
μ
2
^
=
y
2
^
\hat{\mu_{2}}=\hat{y_{2}}
μ2^=y2^,得到最终的线性回归结果。
这里仅使用二维(两个样本)举例说明,高维情况也是如此。
γ
^
\hat{\gamma}
γ^就是算法需要学习的参数,具体公式见此。LARS 和逐步回归很像。在每一步,它寻找与响应最有关联的 预测。当有很多预测有相同的关联时,它没有继续利用相同的预测,而是在这些预测中找出应该等角的方向。
优点:
- 特别适合于特征维度n 远高于样本数m的情况。
- 算法的最坏计算复杂度和最小二乘法类似,但是其计算速度几乎和前向选择算法一样
- 可以产生分段线性结果的完整路径,这在模型的交叉验证中极为有用
缺点:
- 由于LARS的迭代方向是根据目标的残差而定,所以该算法对样本的噪声极为敏感。
示例代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import datasets
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target
print("Computing regularization path using the LARS ...")
alphas, _, coefs = linear_model.lars_path(X, y, method='lasso', verbose=True)
xx = np.sum(np.abs(coefs.T), axis=1)
xx /= xx[-1]
plt.plot(xx, coefs.T)
ymin, ymax = plt.ylim()
plt.vlines(xx, ymin, ymax, linestyle='dashed')
plt.xlabel('|coef| / max|coef|')
plt.ylabel('Coefficients')
plt.title('LASSO Path')
plt.axis('tight')
plt.show()
##################################
#reg = linear_model.LassoLars(alpha)这块的alpha可使用前面返回的alphas