1、存在问题
最早的 Linear Regression 的缺点:如果样例数 相比特征数
少,或者特征间线性相关时,由于
(
矩阵)的秩小于特征个数(即
不可逆)。因此最小二乘法
就会失效。
为了解决这个问题,利用 PCA 对样本 (
矩阵)进行降维,假设降维之后的
为
(
矩阵),那么
的秩为
(列不相关)。
2、主成分分析(Principal Component Analysis, PCA)
PCA 是一种常用的数据分析方法。PCA 通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
令 表示样本,含有
个样例
,每个样例特征维度为
,
。假设我们已经做了每个特征均值为 0 处理。
如果 的秩小于
,那么
的协方差矩阵
的秩小于
,因此直接使用线性回归的话不能使用最小二乘法来求解出唯一的
,利用 PCA 来使
可逆,这样就可以用最小二乘法来进行回归了,这样的称为主元回归(PCR)。
PCA的表示形式:
(1)当 为
时,
,则有
即
(假设 秩为
)
(2)当 为
时,需要舍弃特征值较小的特征向量,上式变为:
其中, 为样本
的单个特征量,
为残差矩阵,
是
第
大特征值对应的归一化后的特征向量,
就是
在
上的投影。
3、PLSR思想及步骤
(1)思想来源
典型关联分析(Canonical Correlation Analysis, CCA)是将 和
分别投影到直线得到
和
,然后计算
和
的 Pearson 系数(也就是
),认为相关度越大越好。用公式可表示为:
其中 和
就是要求的投影方向。缺点在于对特征的处理方式比较粗糙,用的是线性回归来表示
和
的关系,
也是
在某条线上的投影,因此会存在线性回归的一些缺点;同时 CCA 是寻找
和
投影后
和
的关系,显然不能通过该关系来还原出
和
,也就是找不到
到
的直接映射。
而 PLSR 结合 PCA 和 CCA 的方法,将样本 中的数据点按特征进行 PCA 之后,拆接出单个映射方向的特征向量及投影,再用投影对
做单个方向的回归即可实现
到
的映射。
(2)主要步骤
1)设 和
都已经过标准化(包括减均值、除标准差等)
2)设 的第一个主成分为
,
的第一个主成分为
,两者都经过了单位化。(这里的主成分并不是通过 PCA 得出的主成分)
3),
4),即在主成分上的投影,期望是方差最大化
5),这个跟 CCA 的思路一致
6)综合 4)和 5),得到优化目标 。
用公式可表示为:
(3)优化问题求解
引入拉格朗日乘子:
分别对 ,
求偏导,得
从上边可以看出 (两边都乘以
或
,再利用 =1 的约束)
下式代入上式得到
上式代入下式得到
目标函数 ,要求最大。
因此 就是对称阵
的最大特征值对应的单位特征向量,
就是
最大特征值对应的单位特征向量。
求得 和
,即可得到
,
利用 PCA 可建立回归方程:
,
(4)残差矩阵求解
1) ,使用
对
进行回归,即先利用
的主成分对
进行回归
2)使用最小二乘法,计算 ,
,
分别为:
(这一步计算出各个投影向量)
和
的关系如下:
3)将剩余的 当做新的
,剩余的
当做新的
,然后按照前面的步骤求出
和
,
得到:,
目标函数 ,这个与前面一样,
和
分别是新的
和
的最大特征值对应的单位特征向量。
4)计算得到第二组回归系数:
这里的 和之前的
是正交的,证明如下:
其实 和不同
都是相互正交的,同样
和不同的
也是正交的,但
和不同的
一般不是正交的
5)从上一步得到回归方程:
,
如果还有残差矩阵的话,可以继续计算下去。
6)如此计算下去,最终得到:
,
写成矩阵形式为:
,
这就是 的回归过程,其中
7)使用 PLSR 来预测:从6)中可以发现 其实是多个回归的叠加(其实
已经回归出
的最主要信息)。在计算模型的过程中,得到了
和
。那么新来的
,首先计算
(这里的
变成了实数,而不是向量),得到
,然后代入
的式子即可求出预测的
向量,或者直接代入
。
8)至此,PLSR 的主要步骤结束。
4、python代码实现
import pandas as pd
import numpy as np
from sklearn.cross_decomposition import PLSRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 读取数据
data = pd.read_csv(‘path’)
# 准备数据, 以回归为例
y = data[:, -1]
x = data[:, :-1]
# 训练集、测试集划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state= 42)
# 回归模型、参数
pls_model = PLSRegression(scale=True)
param_grid = {'n_components': range(1, 20)}
# GridSearchCV 优化参数、训练模型
gsearch = GridSearchCV(pls_model, param_grid)
pls_models = gsearch.fit(x_train, y_train)
# 打印 coef
print('Partial Least Squares Regression coefficients:',pls_models.best_estimator_.coef_)
# 对测试集做预测
pls_prediction = pls_model.predict(x_test)
# 计算 R2,MSE
pls_r2 = r2_score(y_test,pls_prediction)
pls_mse = np.sqrt(mean_squared_error(y_test,pls_prediction))
『本文参考』
[1] 偏最小二乘法回归(Partial Least Squares Regression) - JerryLead - 博客园 (cnblogs.com)
[3] sklearn.cross_decomposition.PLSRegression — scikit-learn 1.3.1 documentation
免责声明:部分文章整合自网络,因内容庞杂无法联系到全部作者,如有侵权,请联系删除,我们会在第一时间予以答复,万分感谢。
最后,祝大家科研顺利!