经典子空间学习——主成分分析(Principal Component Analysis,PCA)

主成分分析(Principal Component Analysis, PCA)是一种常用的数据分析技术主要用于数据降维和特征提取

PCA通过线性变换将原始数据投影到新的坐标轴上,这些新的坐标轴(即主成分)是数据的线性组合,并且彼此正交(相互独立)。PCA的目标是找到数据的“主方向”即数据分布的最大方差方向,从而保留数据的最多信息。

PCA是通过正交变换将存在相关性的变量转换为线性不相关变量转换后的不相关变量称为主成分,目的是将存在密切相关性的变量间的重叠部分删去,建立尽可能少的新综合变量,且新变量能够尽可能多地保持原有的信息。

PCA的基本流程:

  1. 数据预处理:中心化数据(减去均值)。
  2. 计算协方差矩阵:衡量各特征之间的关系。
  3. 计算协方差矩阵的特征值和特征向量。
  4. 选择前k个最大特征值对应的特征向量,形成变换矩阵。
  5. 将原始数据乘以变换矩阵,得到降维后的数据。

PCA的数学公式:

假设我们有 m 个样本,每个样本有 n 个特征,数据矩阵记作 X = [ x 1 , x 2 , . . . , x m ] T \mathbf{X} = [x_1, x_2, ..., x_m]^T X=[x1,x2,...,xm]T,其中 x i x_i xi 是第 i 个样本的 n 维向量。

1. 数据中心化

X c = X − μ \mathbf{X_c} = \mathbf{X} - \mu Xc=Xμ
其中, μ \mu μ是每列特征的平均值向量。

2. 协方差矩阵

C = 1 m − 1 X c T X c \mathbf{C} = \frac{1}{m-1}\mathbf{X_c}^T\mathbf{X_c} C=m11XcTXc

3. 特征值和特征向量

求解协方差矩阵 C \mathbf{C} C的特征值 λ 1 , λ 2 , . . . , λ n \lambda_1, \lambda_2, ..., \lambda_n λ1,λ2,...,λn和相应的特征向量 v 1 , v 2 , . . . , v n \mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_n v1,v2,...,vn

4. 选择主成分

选择最大的k个特征值对应的特征向量,构成矩阵 V k \mathbf{V_k} Vk

5. 数据投影

Y = X c V k \mathbf{Y} = \mathbf{X_cV_k} Y=XcVk
其中, Y \mathbf{Y} Y降维后的数据矩阵。

公式解释:

  • X \mathbf{X} X原始数据矩阵。
  • X c \mathbf{X_c} Xc中心化后的数据矩阵。
  • μ \mu μ特征的平均值向量。
  • C \mathbf{C} C协方差矩阵,用于衡量特征间的线性相关性。
  • λ i \lambda_i λi特征值,表示在对应特征向量方向上的数据方差。
  • v i \mathbf{v}_i vi特征向量,表示数据的主要方向。
  • V k \mathbf{V_k} Vk由前k个特征向量组成的矩阵,用于数据投影。
  • Y \mathbf{Y} Y降维后的数据矩阵

PCA通过以上步骤,可以有效地降低数据的维度同时尽可能地保留数据中的重要信息。

python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib
matplotlib.use('TkAgg')  # 或者尝试 'Agg'

# 加载Iris数据集
data = load_iris()
X = data.data
y = data.target

# 数据中心化
X_centered = X - np.mean(X, axis=0)

# 使用PCA降维至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_centered)

# 输出解释的方差比率
print("Explained variance ratio:", pca.explained_variance_ratio_)

# 可视化结果
plt.figure(figsize=(8, 6))
colors = ['navy', 'turquoise', 'darkorange']
target_names = data.target_names
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, alpha=.8, lw=lw,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS dataset')

plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不易撞的网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值