偏最小二乘回归(Partial Least Squares Regression,简称PLS)是一种统计方法,用于分析两个多变量数据集之间的相关性。它通过提取数据集中的主要成分,来解释两个数据集之间的最大共享方差。这种方法在处理具有多个相关变量的数据集时特别有用,因为它可以减少变量之间的多重共线性问题。
PLS回归有两种形式:PLS1和PLS2。PLS1是单变量响应的PLS回归,而PLS2是多变量响应的PLS回归。在PLS1中,关注的是一个响应变量与多个预测变量之间的关系;而在PLS2中,关注的是多个响应变量与多个预测变量之间的关系。
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回归(PLS1)中,关注的是一个响应变量与多个预测变量之间的关系。而在多变量响应的PLS回归(PLS2)中,关注的是多个响应变量与多个预测变量之间的关系。这两种形式的PLS回归都可以用于预测和建模,但它们的应用场景和目标不同。