介绍
定义
偏最小二乘回归 ≈ 多元线性回归分析 + 典型相关分析 + 主成分分析
输入:
n×m
的预测矩阵
X
,
输出:
目标:最大化
corr(T,U)
X=TPT+E
,
Y=UQT+F
,其中正交”加载”矩阵
P∈Rm×l,Q∈Rp×l
,假设是独立同分布的随机正态变量的错误项
E
和
起源
来源于瑞典统计学家Herman Wold,然后由他的儿子Svante Wold发展。
优点
用最简的方法求值
1. 能够在自变量存在严重多重相关性的条件下进行回归建模;
2. 允许在样本点个数少于变量个数的条件下进行回归建模;
3. 偏最小二乘回归在最终模型中将包含原有的所有自变量;
4. 偏最小二乘回归模型更易于辨识系统信息与噪声(甚至一些非随机性的噪声);
5. 在偏最小二乘回归模型中,每一个自变量的回归系数将更容易解释。
缺点
TODO
应用领域
社会科学,化学计量学,生物信息学,sensometrics,神经科学,人类学
相关
- 特征提取
- 数据挖掘
- 机器学习
- 回归分析
- 典型相关
- Deming regression
- 多线性子空间学习
- 主成分分析
- 总平方和
解法
- 设
X
和
Y 都已经过标准化(包括减均值、除标准差等) 。 - 设
X
的第一个主成分为
p1 , Y 的第一个主成分为q1 ,两者都经过了单位化(这里的主成分并不是通过PCA得出的主成分) - u1=Xp1,v1=Yq1这一步看起来和CCA是一样的,但是这里的 p 和 q$都有主成分的性质,因此有下面4和5的期望条件。
Var(u1)→max,Var(v1)→max ,即在主成分上的投影,我们期望是方差最大化。- Corr(u1,v1)→max 这个跟CCA的思路一致。
- 综合4和5,得到优化目标 Cov(u1,v1)=Var(u1)Var(v1)−−−−−−−−−−−−−√Corr(u1,v1)→max
形式化一点:
max⟨Xp1,Yq1⟩
s.t.∥p1∥=1,∥q1∥=1
求解:
引入拉格朗日乘子
\mathcal{L} = p_1^TX^TYq_1 - \frac{\lambda}{2} (p_1^Tp_1 - 1) - \frac(\theta}{2} (q_1^Tq_1 - 1)
分别对
p1,q1
求偏导,得
\frac{}
实现
Python
Scikit-Learn
sklearn.cross_decomposition.PLSRegression
http://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.PLSRegression.html- plsr_example.py
python
from sklearn.cross_decomposition import PLSRegression
X = [[0.0, 0.0, 1.0], [1.0, 0.0, 0.0], [1.0, 1.0, 1.0], [0.4, 1.0, 0.8], [0.1, 0.1, 0.1]]
Y = [[0, 0, 1], [1, 0, 0], [1, 1, 1], [0, 1, 1], [0, 0, 0]]
pls2 = PLSRegression(n_components=3)
pls2.fit(X, Y)
Y_pred = pls2.predict(X)
- output
text
>>> Y_pred
array([[ 0.26087869, 0.15302213],
[ 0.60667302, 0.45634164],
[ 6.46856199, 6.48931562],
[ 11.7638863 , 12.00132061]])
- output
sklearn.cross_decomposition.PLSCanonical
http://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.PLSCanonical.html- plsc_example.py
python
from sklearn.cross_decomposition import PLSCanonical
X = [[0., 0., 1.], [1.,0.,0.], [2.,2.,2.], [2.,5.,4.]]
Y = [[0.1, -0.2], [0.9, 1.1], [6.2, 5.9], [11.9, 12.3]]
plsca = PLSCanonical(n_components=2)
plsca.fit(X, Y)
X_c, Y_c = plsca.transform(X, Y)
- output
text
>>> X_c
array([[-1.39700475, 0.1179672 ],
[-1.19678754, -0.17050027],
[ 0.56032252, 0.0991593 ],
[ 2.03346977, -0.04662624]])
>>> Y_c
array([[-1.22601804, 0.01674181],
[-0.9602955 , -0.04216316],
[ 0.32491535, 0.04379 ],
[ 1.86139819, -0.01836865]])
- output
- plsr_example.py
R
- pls
应用
TODO