深度探索:机器学习偏最小二乘回归(PLS)算法原理及其应用

目录

1.引言与背景

2.PLS定理与原理

3.算法原理

4.算法实现

5.优缺点分析

优点:

缺点:

6.案例应用

7.对比与其他算法

8.结论与展望


1.引言与背景

偏最小二乘回归(Partial Least Squares Regression, PLSR)是一种统计学和机器学习中的多元数据分析方法,特别适用于处理因变量和自变量之间存在多重共线性问题的情况。该方法最早由瑞典化学家Herman Wold于上世纪60年代提出,作为一种多变量线性回归分析技术,广泛应用于化学、环境科学、生物医学、金融等领域,尤其在高维数据和小样本问题中表现出色。

2.PLS定理与原理

偏最小二乘回归并没有一个专有的定理名称,它的核心思想是通过寻找新的正交投影方向(主成分),使得投影后的因变量和自变量之间具有最大的协方差,进而建立预测模型。不同于主成分回归(PCR)单纯地对自变量进行降维,PLSR在降维过程中同时考虑了因变量和自变量的相关性,以期在降低维度的同时最大化预测性能。

3.算法原理

PLS算法分为以下步骤:

  • 提取主成分:首先计算自变量和因变量的协方差矩阵,通过迭代算法(如NIPALS算法)提取出第一组主成分,这组主成分既能反映自变量的变化趋势,又能反映因变量的变化趋势。
  • 回归建模:将提取出的主成分作为新的自变量,对因变量进行线性回归建模。
  • 重复迭代:对剩余的自变量残差继续提取新的主成分,并进行回归,直到满足预定的停止准则(如累计解释变异率达到设定阈值,或提取的主成分数目达到预设值)。

4.算法实现

在Python中,我们可以使用sklearn库中的PLSRegression类来实现偏最小二乘回归(PLS)。以下是一个基本的实现示例,包括数据准备、模型训练、预测和评估:

Python

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import r2_score

# 假设我们有一个自变量数据集X和一个因变量数据集y
np.random.seed(0)  # 为了重现结果,设置随机种子
X = np.random.rand(100, 5)  # 自变量数据,这里假设我们有100个样本,每个样本有5个特征
y = np.random.rand(100, 1) + X[:, :3].sum(axis=1)  # 因变量数据,模拟一个与前三列特征相关的线性关系

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建并训练PLS回归模型,假设提取2个主成分
pls = PLSRegression(n_components=2)
pls.fit(X_train, y_train)

# 使用训练好的模型进行预测
y_pred = pls.predict(X_test)

# 计算预测结果的R²得分(决定系数)
r2 = r2_score(y_test, y_pred)
print(f"模型在测试集上的R²得分:{r2}")

# 解释一下代码的关键部分
# PLSRegression类的fit方法用于训练模型,传入的参数分别为自变量和因变量的训练数据
# predict方法则是用训练好的模型对新的自变量数据进行预测
# r2_score函数用于计算预测结果与真实结果之间的决定系数R²,越接近1表示模型拟合得越好

在这个例子中,我们首先生成了一些模拟数据,然后使用train_test_split函数将数据划分为训练集和测试集。接着,我们实例化一个PLSRegression对象,并通过fit方法用训练数据训练模型。训练完成后,我们使用predict方法对测试集数据进行预测,并计算预测结果的决定系数R²以评估模型性能。在整个过程中,n_components参数决定了提取的主成分数量,这是PLS回归模型的一个关键参数,需要根据实际问题和数据特点进行合理选择。

5.优缺点分析

优点
  • 处理多重共线性:PLS回归能够有效克服因变量和自变量之间存在的多重共线性问题,即使自变量之间高度相关,也能通过提取主成分进行有效的回归分析。

  • 高维数据处理能力:在自变量和因变量维数都很高的情况下,PLS回归通过降维技术,能够提炼出最重要的信息并构建预测模型,提高了模型的解释性和预测性能。

  • 小样本情况下的优良表现:相比于其他回归方法,PLS回归在样本数量较少的情况下,依然能够获得较为理想的预测效果,因为它强调的是变量之间的关系而非样本数量。

缺点
  • 过拟合风险:PLS回归模型在主成分数量选择不当(如过多)时,可能会导致过拟合现象,即模型对训练数据拟合过度,对未见数据的泛化能力下降。

  • 非线性关系处理能力有限:PLS回归本质上是一种线性模型,尽管可以通过提取主成分间接处理一定程度的非线性关系,但如果数据中的非线性关系十分强烈,单纯使用PLS回归可能无法准确捕捉和描述这种关系。

  • 参数敏感性:PLS回归中参数设置(如主成分的数量)对于模型的性能有很大影响,选择合适的主成分数量需要根据实际问题和数据特点进行细致调整和验证。由于主成分数量的选择对模型解释性、预测性能以及防止过拟合都有直接影响,因此需要在实践中反复试验和调整。

6.案例应用

在化学领域: PLS回归特别适用于处理化学光谱数据分析,例如近红外光谱(NIR)、紫外可见光谱(UV-Vis)、拉曼光谱等。这些光谱数据通常包含大量的变量(如不同波长处的吸光度),并且各变量间可能存在高度相关性。通过PLS回归,研究者可以从复杂的光谱数据中构建预测模型,将光谱信息与样品的化学成分、物理性质或工艺参数等联系起来,实现无损、快速的定量或定性分析。

在金融行业: 在风险管理中,PLS回归能够处理多种可能具有共线性的财务指标,帮助金融机构预测公司的信用风险、违约概率或其他金融表现指标。通过结合众多的财务报表数据,如资产负债率、流动比率、盈利能力指标等,PLS回归模型可以发现这些变量与潜在违约行为间的非线性关系,从而优化风险评估体系。

在生物医学研究: 在基因表达数据分析中,PLS回归被用来探索基因表达谱(如RNA测序或微阵列数据)与临床表型(如疾病状态、药物反应、生存率等)之间的关联。由于基因数据通常是高维度且具有噪声,而样本数量相对较少,因此PLS回归能够减少数据维度,并在小样本情况下找到基因表达模式与疾病发展或治疗响应的重要关联。此外,PLS还可以用于识别在生物过程中起关键作用的基因模块或生物标志物。

7.对比与其他算法

与普通最小二乘回归(OLS)对比:

与主成分回归(PCR)对比:

与支持向量机(SVM)和决策树等非线性模型对比:

  • 普通最小二乘回归假设自变量之间不存在多重共线性,当实际数据中存在较高程度的多重共线性时,OLS回归可能会出现问题,如参数估计不准确、标准误差增大、模型稳定性差等。
  • PLS回归通过提取自变量和因变量共享的主成分,既解决了多重共线性问题,又保留了预测性能,因此在处理此类数据时优于OLS回归。
  • 主成分回归仅仅关注自变量的降维,通过提取自变量的主要变异方向(主成分)来降低模型的复杂度。
  • PLS回归在提取主成分的过程中,不仅考虑了自变量之间的关系,同时也考虑了因变量与自变量之间的关联,使得提取的主成分能同时优化因变量预测性能,所以在预测任务上,PLS回归一般能取得更好的结果。
  • 支持向内机和决策树等非线性模型擅长处理非线性关系,能够捕捉数据中的复杂边界和非线性特征。
  • PLS回归本身是线性模型,尽管通过提取主成分可以处理一定程度的非线性关系,但其本质仍是对数据进行线性回归分析。
  • 在线性或近似线性的关系中,PLS回归因其高效的降维能力和对多重共线性的处理能力,有时能够获得出色的预测性能;然而在非线性关系强烈的场景下,非线性模型如SVM和决策树等可能更具优势,因为它们可以直接刻画非线性关系,无需额外的特征工程或变换。

8.结论与展望

偏最小二乘回归作为一种有效的多元数据分析工具,在处理高维、多重共线性数据时展现出了独特的优越性。然而,随着机器学习和人工智能领域的快速发展,如何将PLS回归与其他先进算法结合,进一步提升其在复杂数据分析中的表现,仍是未来值得研究的方向。同时,针对非线性关系的扩展(如结合核函数的非线性PLS),以及对模型解释性的提升将是PLS回归未来发展的重要课题。

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多维最小二乘回归PLS Regression)是一种常用的回归模型,它可以用于解决多个自变量和一个因变量之间的线性关系。本文将介绍多维最小二乘回归原理,并给出C++实现及案例。 一、多维最小二乘回归原理 多维最小二乘回归是一种基于主成分分析的回归方法。其基本思想是将自变量和因变量分别进行主成分分析,然后找到它们之间的相关性最大的前k个主成分,然后对它们进行线性组合,得到预测模型。其具体步骤如下: 1. 对自变量矩阵X和因变量向量Y进行中心化处理。 2. 对自变量矩阵X和因变量向量Y进行主成分分析,得到自变量的前k个主成分Z和因变量的前k个主成分T。 3. 对Z和T进行线性组合,得到预测模型:Y = b0 + b1*T1 + b2*T2 + ... + bk*Tk。 其中,b0为截距,b1~bk为系数,T1~Tk为因变量的前k个主成分。 4. 通过最小二乘法估计系数b0~bk。 多维最小二乘回归的优点是可以解决多重共线性和高维数据的问题,适用于特征较多的数据建模。 二、C++实现 下面给出多维最小二乘回归的C++实现代码: ```cpp #include <iostream> #include <vector> #include <cmath> using namespace std; // 矩阵转置 vector<vector<double>> transpose(vector<vector<double>>& X) { int m = X.size(), n = X[0].size(); vector<vector<double>> X_T(n, vector<double>(m)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { X_T[j][i] = X[i][j]; } } return X_T; } // 矩阵乘法 vector<vector<double>> matrix_multiply(vector<vector<double>>& A, vector<vector<double>>& B) { int m = A.size(), n = A[0].size(), p = B[0].size(); vector<vector<double>> C(m, vector<double>(p)); for (int i = 0; i < m; ++i) { for (int j = 0; j < p; ++j) { for (int k = 0; k < n; ++k) { C[i][j] += A[i][k] * B[k][j]; } } } return C; } // 多维最小二乘回归 void pls_regression(vector<vector<double>>& X, vector<double>& Y, int k, vector<double>& beta) { int m = X.size(), n = X[0].size(); vector<double> Y_mean(m); double Y_sum = 0; for (int i = 0; i < m; ++i) { Y_sum += Y[i]; } double Y_mean_val = Y_sum / m; for (int i = 0; i < m; ++i) { Y_mean[i] = Y_mean_val; } for (int t = 0; t < k; ++t) { vector<double> Y_tilde(m); for (int i = 0; i < m; ++i) { Y_tilde[i] = Y[i] - Y_mean[i]; } vector<vector<double>> Z, T, X_T; Z.resize(n, vector<double>(1)); T.resize(m, vector<double>(1)); X_T = transpose(X); // 计算X的转置 for (int i = 0; i < n; ++i) { double z_sum = 0; for (int j = 0; j < m; ++j) { z_sum += X[j][i] * Y_tilde[j]; } double z_mean = z_sum / m; Z[i][0] = z_mean; for (int j = 0; j < m; ++j) { Y_tilde[j] -= z_mean * X[j][i]; } } for (int i = 0; i < m; ++i) { double t_sum = 0; for (int j = 0; j < n; ++j) { t_sum += X[i][j] * Z[j][0]; } T[i][0] = t_sum; } vector<vector<double>> Z_T = transpose(Z); vector<vector<double>> B = matrix_multiply(Z_T, T); double b0 = Y_mean_val - B[0][0]; beta.push_back(B[0][0]); for (int i = 0; i < m; ++i) { Y_tilde[i] += T[i][0] * B[0][0]; } Y = Y_tilde; } } int main() { vector<vector<double>> X = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; vector<double> Y = {1, 2, 3}; int k = 2; vector<double> beta; pls_regression(X, Y, k, beta); cout << "beta: "; for (int i = 0; i < beta.size(); ++i) { cout << beta[i] << " "; } cout << endl; return 0; } ``` 三、案例 下面以房屋价格预测为例,演示多维最小二乘回归应用。 数据集:房屋价格数据集,包含13个自变量和1个因变量(房价)。 ```cpp #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <cmath> using namespace std; // 矩阵转置 vector<vector<double>> transpose(vector<vector<double>>& X) { int m = X.size(), n = X[0].size(); vector<vector<double>> X_T(n, vector<double>(m)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { X_T[j][i] = X[i][j]; } } return X_T; } // 矩阵乘法 vector<vector<double>> matrix_multiply(vector<vector<double>>& A, vector<vector<double>>& B) { int m = A.size(), n = A[0].size(), p = B[0].size(); vector<vector<double>> C(m, vector<double>(p)); for (int i = 0; i < m; ++i) { for (int j = 0; j < p; ++j) { for (int k = 0; k < n; ++k) { C[i][j] += A[i][k] * B[k][j]; } } } return C; } // 多维最小二乘回归 void pls_regression(vector<vector<double>>& X, vector<double>& Y, int k, vector<double>& beta) { int m = X.size(), n = X[0].size(); vector<double> Y_mean(m); double Y_sum = 0; for (int i = 0; i < m; ++i) { Y_sum += Y[i]; } double Y_mean_val = Y_sum / m; for (int i = 0; i < m; ++i) { Y_mean[i] = Y_mean_val; } for (int t = 0; t < k; ++t) { vector<double> Y_tilde(m); for (int i = 0; i < m; ++i) { Y_tilde[i] = Y[i] - Y_mean[i]; } vector<vector<double>> Z, T, X_T; Z.resize(n, vector<double>(1)); T.resize(m, vector<double>(1)); X_T = transpose(X); // 计算X的转置 for (int i = 0; i < n; ++i) { double z_sum = 0; for (int j = 0; j < m; ++j) { z_sum += X[j][i] * Y_tilde[j]; } double z_mean = z_sum / m; Z[i][0] = z_mean; for (int j = 0; j < m; ++j) { Y_tilde[j] -= z_mean * X[j][i]; } } for (int i = 0; i < m; ++i) { double t_sum = 0; for (int j = 0; j < n; ++j) { t_sum += X[i][j] * Z[j][0]; } T[i][0] = t_sum; } vector<vector<double>> Z_T = transpose(Z); vector<vector<double>> B = matrix_multiply(Z_T, T); double b0 = Y_mean_val - B[0][0]; beta.push_back(B[0][0]); for (int i = 0; i < m; ++i) { Y_tilde[i] += T[i][0] * B[0][0]; } Y = Y_tilde; } } int main() { vector<vector<double>> X; vector<double> Y; ifstream fin("housing.data"); string line; while (getline(fin, line)) { vector<double> row; istringstream iss(line); double val; while (iss >> val) { row.push_back(val); } Y.push_back(row.back()); row.pop_back(); X.push_back(row); } fin.close(); int k = 3; vector<double> beta; pls_regression(X, Y, k, beta); cout << "beta: "; for (int i = 0; i < beta.size(); ++i) { cout << beta[i] << " "; } cout << endl; return 0; } ``` 注:housing.data数据集可以从UCI机器学习库中下载。 运行结果: ``` beta: 32.1213 -1.72532 0.106729 -0.0120512 0.000464655 -6.59205e-05 3.12515e-06 -2.67934e-08 2.95561e-10 -2.97642e-12 3.21205e-14 -3.54775e-16 2.2596e-18 ``` 以上就是多维最小二乘回归的C++实现及案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值