主成分回归和局部线性嵌入

主成分回归 (Principal Component Regression, PCR)

主成分回归(PCR)是一种结合主成分分析(PCA)和线性回归的降维方法,通过在回归之前使用 PCA 将数据投影到低维空间,可以有效减少多重共线性对模型的影响。

原理

PCR 通过首先对特征矩阵进行 PCA 分解,然后使用前几个主要成分作为新的特征进行线性回归。这样做可以减少特征间的共线性,提升回归模型的稳定性和预测性能。

公式推理
  1. 主成分分析: 给定特征矩阵 X,通过 PCA 进行特征分解,得到主成分矩阵 Z 和投影矩阵 P:

其中,P 是特征向量矩阵,主成分矩阵 Z 只保留前 k 个主成分。

  1. 线性回归: 使用主成分矩阵 Z 进行线性回归:

其中,B 是回归系数,ϵ 是误差项。

  1. 回归系数估计: 通过最小二乘法估计回归系数 B:

经典案例

案例:PCR 在波士顿房价数据集上的应用

加州房价数据集实际上有 20640 个样本,每个样本有 8 个特征,通过 PCR 对数据进行降维,并进行回归预测。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加载加州房价数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用 PCA 进行降维
pca = PCA(n_components=5)
X_pca = pca.fit_transform(X_scaled)

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

# 线性回归
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# 预测
y_pred = regressor.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')

# 可视化回归结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, edgecolor='k', alpha=0.7, color='b')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'k--', lw=2)
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('PCR Predicted vs Actual')
plt.show()
代码解析
  1. 加载房价数据集:使用 load_boston 函数加载房价数据集,包括特征矩阵 X 和目标向量 y
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用 PCA 进行降维:创建 PCA 对象并将数据降到 5 维。
  4. 划分训练集和测试集:使用 train_test_split 函数将数据划分为训练集和测试集。
  5. 线性回归:创建线性回归对象并在训练集上进行训练。
  6. 预测和评估:在测试集上进行预测,并计算均方误差(MSE)评估模型性能。
  7. 可视化回归结果:绘制预测值与实际值的散点图,直观展示模型的预测效果。

修正代码

在进行分析时,我们可以选取一部分数据进行处理,以提高速度和效率。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加载房价数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target

# 为了更快地处理数据,随机选择1000个样本进行分析
np.random.seed(42)
indices = np.random.choice(X.shape[0], 1000, replace=False)
X = X[indices]
y = y[indices]

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用 PCA 进行降维,降到 5 维
pca = PCA(n_components=5)
X_pca = pca.fit_transform(X_scaled)

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

# 线性回归
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# 预测
y_pred = regressor.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.4f}')

# 可视化回归结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, edgecolor='k', alpha=0.7, color='b')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'k--', lw=2)
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('PCR Predicted vs Actual')
plt.grid(True)
plt.show()
代码说明
  1. 数据集加载:使用 fetch_california_housing() 函数加载房价数据集。
  2. 随机样本选择:从中随机选择1000个样本,以加快计算。
  3. 数据标准化:通过 StandardScaler 对特征进行标准化,使数据均值为0,方差为1。
  4. PCA降维:通过 PCA 将特征从原始8维降至5维,以减少特征数量。
  5. 训练测试集划分:使用 train_test_split 将数据集分为训练集和测试集,测试集占20%。
  6. 线性回归模型:使用 LinearRegression 训练模型并进行预测。
  7. 评估及可视化:计算均方误差(MSE),并通过散点图展示实际值和预测值的比较。

代码展示了如何利用 PCR 对高维数据进行降维,并通过线性回归模型进行预测,有助于理解 PCR 在回归任务中的应用。

局部线性嵌入 (Locally Linear Embedding, LLE)

局部线性嵌入(LLE)是一种非线性降维方法,它通过保留数据局部邻域的线性结构,将高维数据嵌入到低维空间,广泛用于数据可视化和流形学习。

原理

LLE 假设高维数据点在低维流形上近似线性关系。通过找到每个数据点的局部邻域并计算其在邻域内的线性重构权重,然后在低维空间中找到这些权重的最佳嵌入,保持局部线性结构不变。

公式推理
  1. 选择邻居: 对于每个数据点 xi,找到其最近的 K 个邻居 xj。
  2. 计算重构权重: 对于每个数据点 xi,计算其邻居 xj 的重构权重 wij,使得 xi 可以用其邻居的线性组合重构:

通过最小化重构误差来计算权重:

约束条件:

  1. 低维嵌入: 在低维空间中找到数据点的嵌入坐标 yi,保持重构权重不变:

通过最小化嵌入误差来计算低维坐标:

经典案例

案例:LLE在手写数字识别数据集上的应用

我们将使用经典的MNIST数据集,它包含了大量的手写数字图片,每张图片是28x28像素的灰度图像,共有10个类别(0到9)。通过LLE将MNIST数据集从784维降到2维,并可视化不同数字在降维空间的分布。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import StandardScaler

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data.astype('float64')
y = mnist.target.astype('int64')

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用LLE进行降维到2维
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10, random_state=42)
X_lle = lle.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_lle[:, 0], X_lle[:, 1], c=y, cmap='tab10', edgecolor='k', s=20)
plt.colorbar(scatter, label='Digit', ticks=range(10))
plt.title('LLE of MNIST Dataset')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.grid(True)
plt.show()
代码解析
  1. 加载MNIST数据集:使用 fetch_openml 函数加载MNIST数据集,包括特征矩阵 X 和目标向量 y
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用LLE进行降维:创建 LLE 对象并将数据降到 2 维。参数 n_components 指定降维后的维度,n_neighbors 指定每个点的邻居数量。
  4. 可视化:绘制降维后的数据分布,不同颜色表示不同数字类别。
修改代码

降维操作,特别是在高维数据集(如MNIST)上使用非线性方法(如LLE)时,可能会非常耗时。为了加快运算速度,可以考虑以下几种方法:

  1. 减少样本数量:只使用部分样本进行LLE计算。例如,随机选择一定数量的样本。
  2. 降低数据维度:在应用LLE之前,使用PCA先将数据降维(例如,降到50维),然后再应用LLE。
  3. 调整LLE参数:减少邻居数量(n_neighbors)或降维后的维度(n_components),但这些可能会影响降维效果。

以下是改进后的代码示例,结合减少样本和应用PCA预降维:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1, parser='liac-arff', as_frame=False)
X = mnist.data.astype('float64')
y = mnist.target.astype('int64')

# 仅使用1000个随机样本
np.random.seed(42)
indices = np.random.choice(X.shape[0], 1000, replace=False)
X_sample = X[indices]
y_sample = y[indices]

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_sample)

# 使用PCA预降维到50维
pca = PCA(n_components=50, random_state=42)
X_pca = pca.fit_transform(X_scaled)

# 使用LLE进行降维到2维
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10, random_state=42)
X_lle = lle.fit_transform(X_pca)

# 可视化
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_lle[:, 0], X_lle[:, 1], c=y_sample, cmap='tab10', edgecolor='k', s=20)
plt.colorbar(scatter, label='Digit', ticks=range(10))
plt.title('LLE of MNIST Dataset (1000 samples)')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.grid(True)
plt.show()
代码说明
  1. 随机抽样:我们使用 np.random.choice 来选择 1000 个随机样本。这显著减少了计算时间。
  2. PCA 预处理:通过先用 PCA 将数据降到 50 维,降低了 LLE 的计算负担。
  3. LLE 计算:应用于降维后的数据,使得计算更加高效。

代码展示了如何利用 LLE 对高维数据进行降维,并通过可视化直观地展示了降维后数据的分布情况,有助于理解 LLE 在数据可视化中的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值