主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。 1 c+ C$ N+ ~7 n: t3 z 4 [/ _% ~0 Y. [' c. x3 \## PCA 的基本步骤. m7 R3 l1 C' T
' k' r. W5 [" Q8 U
1. **标准化数据**: 3 e/ Y5 n6 r R! V8 X/ D - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。 , E, [! G- ~3 n+ i/ M1 y/ P X, p' h: M' T/ C$ e
2. **计算协方差矩阵**:% f" k. p3 Y [7 v# C$ v, U
- 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:" n4 l5 p \ L, p' r7 F
\[6 b7 Z, b# s4 c- n4 x- H& ^$ o* R
\text{Cov}(X) = \frac{1}{n-1}(X^TX)" P7 H9 W6 y5 b2 g G7 T
\] % E( @2 o% y Z* ]! j5 E4 l. F; i" r0 T 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ e0 ? i+ F" C, a' J/ Z
4 Q% K0 I. q3 r( C5 q5 E3. **计算特征值和特征向量**:8 ~! ~2 i' k7 T2 W5 l
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。$ G) }" X, v! J3 ?. m
" h; q. R. N" J6 g% b1 v; ^/ K4. **选择主成分**:. P. v' U; c! m2 E# |) k' D% R
- 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。 9 \: x5 @3 t7 \* i1 ` * q {/ ~" J8 ]0 d) T, X5. **投影到新空间**: # Z! T/ }* i" b5 S5 a" f - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。 7 Z7 ^3 t i5 ]9 t$ X! N8 V( F, ]' r- c$ _+ U( g: W7 b1 u+ W
## 示例代码! [9 }8 _+ [, r. ^
( d, l& c% t- I( k# [, v- S
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果: 6 \3 B- ~8 X/ x" c' Y$ A; r 7 N* [. s/ a! K, q4 q```python8 b/ T, S6 \1 ^% g+ G; k. ?6 ?
import numpy as np( r/ _1 O9 w3 Q/ k
import matplotlib.pyplot as plt6 z0 F4 C2 q6 f8 P$ `. v1 H- H6 q
from sklearn.datasets import load_iris0 f9 C2 _7 a* }
from sklearn.preprocessing import StandardScaler. `" \& t' G& k5 e2 a6 u
- q4 ^" F) R3 n4 b! P. l
# 加载数据集(这里使用Iris数据集作为示例) ' ?6 R. V+ s! S' p/ T! Y& K3 \& Ddata = load_iris() 9 |9 X$ M1 c4 L% W$ K0 y# Z4 s" cX = data.data # 特征数据 5 b+ T: W- X) X3 a! ^4 q+ u" P3 vy = data.target # 标签: c2 X: e( U& V0 R! B y# W
, O, G9 i& q% R+ O1 ~- J" G) D3 t. U
# 1. 标准化数据0 B C. ~: F* w+ r% R7 T
scaler = StandardScaler() $ s f0 k! V3 d' D' ]* rX_scaled = scaler.fit_transform(X)+ N ]& N% h* K3 ?
) l; W- j# G! P T) R1 O
# 2. 计算协方差矩阵- @& \7 |8 B* l
cov_matrix = np.cov(X_scaled.T) 2 H$ P0 e y" P1 S 3 N0 c( R* ~& m$ }% X! v# 3. 计算特征值和特征向量 * T" J; H) f" X2 Neigenvalues, eigenvectors = np.linalg.eig(cov_matrix)2 ?5 l5 I# m, m. _5 \/ `" t- G g( s
) J( [" d! g8 e4 m5 B
# 4. 按特征值从大到小排序特征向量; ~2 @! E5 H2 A. U3 g/ B. |( H g
sorted_indices = np.argsort(eigenvalues)[::-1] . H; u8 f2 { n; H* h# Seigenvalues_sorted = eigenvalues[sorted_indices]) s3 f! o1 }& h# J+ R) i8 k( d' `" P6 G
eigenvectors_sorted = eigenvectors[:, sorted_indices]; E4 v Z# ?- _ o; W
n. j9 n( C7 R) c# 选择前两个主成分7 f6 @* H t0 l- `) r- C" i4 Q, {
n_components = 2 2 I. T7 j6 ?' }3 z+ f9 J: \W = eigenvectors_sorted[:, :n_components] - g+ h( G" |4 z1 x1 H$ o, P, ~" f# {4 u9 R: I+ G& Q: q* `7 D
# 5. 投影到新空间 ; V# e0 I: |9 U) t% KX_pca = X_scaled.dot(W): a8 B* K; f' P- E( y& S3 b