偏最小二乘回归分析

偏最小二乘回归(Partial Least Squares Regression,简称PLS)是一种统计方法,用于分析两个多变量数据集之间的相关性。它通过提取数据集中的主要成分,来解释两个数据集之间的最大共享方差。这种方法在处理具有多个相关变量的数据集时特别有用,因为它可以减少变量之间的多重共线性问题。

PLS的两种形式

PLS回归有两种形式:PLS1和PLS2。PLS1是单变量响应的PLS回归,而PLS2是多变量响应的PLS回归。在PLS1中,关注的是一个响应变量与多个预测变量之间的关系;而在PLS2中,关注的是多个响应变量与多个预测变量之间的关系。

典型相关分析(Canonical Correlation Analysis,CCA

CCA是另一种多变量统计方法,它寻找两组变量之间的典型相关关系。在给定两个多变量且相互协变的二维数据集X和Y的情况下,PLS提取的是“协方差方向”,即每个数据集中解释两个数据集之间最多共享方差的组成部分。

基于数据集的潜在变量模型

在下面的Python代码示例中,首先生成了两个包含潜在变量的数据集X和Y,然后使用numpy库计算了它们的相关性矩阵。接着,使用sklearn库中的PLSCanonical类来执行典型相关分析,并绘制了得分的散点图。

import numpy as np import matplotlib.pyplot as plt from sklearn.cross_decomposition import PLSCanonical # 设置样本数量和潜在变量数量 n = 500 latents = np.random.normal(size=n), np.random.normal(size=n) X = np.array([latents[0], latents[0], latents[1], latents[1]]).T + np.random.normal(size=4*n).reshape((n, 4)) Y = np.array([latents[0], latents[0], latents[1], latents[1]]).T + np.random.normal(size=4*n).reshape((n, 4)) # 划分训练集和测试集 X_train, Y_train = X[:n//2], Y[:n//2] X_test, Y_test = X[n//2:], Y[n//2:] # 计算相关性矩阵 print("Corr(X)") print(np.round(np.corrcoef(X.T), 2)) print("Corr(Y)") print(np.round(np.corrcoef(Y.T), 2)) # 执行典型相关分析 plsca = PLSCanonical(n_components=2) plsca.fit(X_train, Y_train) X_train_r, Y_train_r = plsca.transform(X_train, Y_train) X_test_r, Y_test_r = plsca.transform(X_test, Y_test) # 绘制得分的散点图 plt.figure(figsize=(12, 8)) plt.subplot(221) plt.scatter(X_train_r[:, 0], Y_train_r[:, 0], label="训练集", marker="o", s=25) plt.scatter(X_test_r[:, 0], Y_test_r[:, 0], label="测试集", marker="o", s=25) plt.xlabel("X得分") plt.ylabel("Y得分") plt.title("第1成分: X vs Y (测试集相关性 = %.2f)" % np.corrcoef(X_test_r[:, 0], Y_test_r[:, 0])[0, 1]) plt.xticks(()) plt.yticks(()) plt.legend(loc="best") plt.subplot(224) plt.scatter(X_train_r[:, 1], Y_train_r[:, 1], label="训练集", marker="o", s=25) plt.scatter(X_test_r[:, 1], Y_test_r[:, 1], label="测试集", marker="o", s=25) plt.xlabel("X得分") plt.ylabel("Y得分") plt.title("第2成分: X vs Y (测试集相关性 = %.2f)" % np.corrcoef(X_test_r[:, 1], Y_test_r[:, 1])[0, 1]) plt.xticks(()) plt.yticks(()) plt.legend(loc="best") plt.subplot(222) plt.scatter(X_train_r[:, 0], X_train_r[:, 1], label="训练集", marker="*", s=50) plt.scatter(X_test_r[:, 0], X_test_r[:, 1], label="测试集", marker="*", s=50) plt.xlabel("X第1成分") plt.ylabel("X第2成分") plt.title("X第1成分 vs X第2成分 (测试集相关性 = %.2f)" % np.corrcoef(X_test_r[:, 0], X_test_r[:, 1])[0, 1]) plt.legend(loc="best") plt.xticks(()) plt.yticks(()) plt.subplot(223) plt.scatter(Y_train_r[:, 0], Y_train_r[:, 1], label="训练集", marker="*", s=50) plt.scatter(Y_test_r[:, 0], Y_test_r[:, 1], label="测试集", marker="*", s=50) plt.xlabel("Y第1成分") plt.ylabel("Y第2成分") plt.title("Y第1成分 vs Y第2成分 (测试集相关性 = %.2f)" % np.corrcoef(Y_test_r[:, 0], Y_test_r[:, 1])[0, 1]) plt.legend(loc="best") plt.xticks(()) plt.yticks(()) plt.show()

在上述代码中,首先生成了两个包含潜在变量的数据集X和Y,并计算了它们的相关性矩阵。然后,使用sklearn库中的PLSCanonical类来执行典型相关分析,并通过matplotlib库绘制了得分的散点图。这些散点图展示了不同成分之间的相关性,以及训练集和测试集之间的关系。

PLS回归的单变量响应和多变量响应

在单变量响应的PLS回归(PLS1)中,关注的是一个响应变量与多个预测变量之间的关系。而在多变量响应的PLS回归(PLS2)中,关注的是多个响应变量与多个预测变量之间的关系。这两种形式的PLS回归都可以用于预测和建模,但它们的应用场景和目标不同。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485