- 在线时间
- 463 小时
- 最后登录
- 2025-6-15
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7342 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2781
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1156
- 主题
- 1171
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。3 K+ Z+ R* U3 O" @: {( d
* F; w$ e: a0 B& ]6 ]## PCA 的基本步骤
. {, h2 \" j3 m \3 j& A
$ y6 j) A# }& `& d n1. **标准化数据**:& R, z; E* P( v2 D) U6 _
- 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
3 ?$ x! J9 m/ h1 x. r6 H3 M* \! j& A0 n
8 N$ J2 Q. ?2 L* H/ c2. **计算协方差矩阵**:
, \; U: M$ e% A3 R1 D; X - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:7 Z0 ?% ]! K) I8 A% C( v. ]1 d
\[9 f( Q: k; R1 L/ x% O! V6 |2 p
\text{Cov}(X) = \frac{1}{n-1}(X^TX)8 E: f) G! O! Q
\]
2 A) n, Y; ?6 V% R9 N% e- J" l2 n0 ` 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ k$ f& D: m7 k E! L0 }( Q" R% Z
/ C' k3 G8 @$ Q. j. a
3. **计算特征值和特征向量**:9 c2 B: }1 z0 M; D$ N6 @4 Q
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
0 ~/ |6 o: j0 v$ p% W( m( y$ f; s( {4 k6 M/ N
4. **选择主成分**:" P3 h! T# a( T5 c5 L
- 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
) w; G/ a" y7 F4 B# `) S- h; j" b8 w. f) t% P
5. **投影到新空间**:/ o& r! Y9 |) A6 Y% |
- 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
& j# n( @1 L8 y% _3 o6 r
( Q. b; V! `1 U( x3 P## 示例代码
4 q d+ n& E' p* J" j: M1 k! a- U3 {8 \! r& U' z( `
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
( o$ d, s* M8 b+ q8 x6 J! }7 ]) S/ u1 p' X, \4 {& c! f
```python
$ [3 l8 k" x1 h4 f+ C9 Simport numpy as np
, R! a1 M- {) ~- Kimport matplotlib.pyplot as plt
3 n8 O: [2 X$ K1 v! Ufrom sklearn.datasets import load_iris
$ r/ @5 ^9 u5 O3 tfrom sklearn.preprocessing import StandardScaler+ j( @: u2 W5 Q; Z. _
( f% u$ m+ d, x8 v: u3 |' X* \# 加载数据集(这里使用Iris数据集作为示例)0 E. Z) w% q R+ S8 z h4 e5 _
data = load_iris()
) X w4 e1 m' Y+ L0 @X = data.data # 特征数据6 p; f" }1 U, v' x+ X
y = data.target # 标签
$ L1 j0 S& r. F2 y2 ]5 a9 {4 n6 B$ h5 O( ~& m
# 1. 标准化数据' f) b6 L, q; G4 `# z2 a4 a; y
scaler = StandardScaler()
: ]# x! C6 M, ^! KX_scaled = scaler.fit_transform(X)( Z: N5 I, X0 Y3 H! E$ c% D, H
4 a. B) Q6 Q/ t" \1 w( f' M( f
# 2. 计算协方差矩阵& M: E8 a' {7 z1 A& e
cov_matrix = np.cov(X_scaled.T)8 @9 K8 P6 l; T& @5 {
6 t/ C. K$ J* f4 D0 p* H8 U4 w( v
# 3. 计算特征值和特征向量5 v- I3 C$ f( _ v5 s( E. m) {
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
8 J4 r" t. R/ t0 U5 l7 a! C
& q7 e- A @$ H) C% _. s2 _+ O# 4. 按特征值从大到小排序特征向量7 \: t( d: i$ R- X( X
sorted_indices = np.argsort(eigenvalues)[::-1]$ s# [; h6 {$ e/ {: f( Q
eigenvalues_sorted = eigenvalues[sorted_indices]
, j8 l; }+ ~, M1 Q4 g% W# F( ueigenvectors_sorted = eigenvectors[:, sorted_indices]
' M- c) S# S2 [9 M
: c, Q' Y+ @7 R0 b2 {5 J# 选择前两个主成分0 E0 I+ e! L; d" A; Q3 z: `
n_components = 2
& R; U9 n. W- O! sW = eigenvectors_sorted[:, :n_components]6 o, t6 J/ w7 V( R# Q1 q4 n
0 X9 t; p# u) b4 s4 \
# 5. 投影到新空间; M- E8 v2 @. F$ ~
X_pca = X_scaled.dot(W); t2 {" U8 x! v& l5 ]" i4 P) V5 E# h/ o
) V8 ~& W% Z0 }5 f2 v3 L& A4 S
# 可视化结果8 c" W3 [1 a1 }3 H, C
plt.figure(figsize=(8, 6))9 p; _2 t4 U4 k: m4 M7 L
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
, M7 y5 i3 q. D. ~ plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
2 R" A' A% ?# v/ u+ N8 ^/ a7 splt.xlabel('主成分 1')
) \* a' \( k7 V, t! Eplt.ylabel('主成分 2')
6 K& w1 A0 c0 g+ s4 Vplt.title('PCA - Iris Dataset')0 t. G. k; K8 N0 p- H4 {
plt.legend()* O( p$ \6 M- g, e1 P( i6 i- n' v4 z
plt.grid(). n0 ^# f& G5 c4 o+ D* U6 c/ l, p/ q! u
plt.show()# }: h5 n. X4 p" J0 p" _& \+ {
```
- G# C3 s' U2 O5 N- O# V- w1 Q: Q0 i
2 I$ j% {! `/ g( U# W### 代码解析* x. o* e8 o) u
, o1 @8 o/ D3 \& W$ x
1. **数据加载**:6 l W. U- E7 d1 a6 s
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
$ a+ b6 e: p1 @$ r4 _, X8 o: `% k
2. **数据标准化**:1 N7 Y' D& M5 I, z
- 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。% l+ l4 ~% s; u" I5 u
9 w9 v9 Z; ^ L$ Z& A& z8 F3. **计算协方差矩阵**:
8 I. K& U6 {8 \6 h/ ] - 使用`np.cov`计算标准化数据的协方差矩阵。
8 B4 ]) U( D: k" H' }
P+ p- i+ ]6 s4. **特征值和特征向量的计算**:
4 @% Y. I6 B. l* m - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
% e: b! Z8 c2 b* n6 w$ z _
: _1 z: h8 y% a5 ^$ e+ c) S5. **特征值的排序与选择**:
1 E- M6 C3 G O+ e, f4 x! _ - 将特征值按降序排序,并根据排序结果选择相应的特征向量。+ q7 [( q- C: J4 p- b* ^4 _
8 K$ z" O- [5 H+ K3 \2 s
6. **数据投影**:" E- K( S' U6 p% g3 i/ a* j' h
- 将标准化后的数据投影到新的特征空间(即主成分空间)。
" j% l* I% I9 X: l+ N" G8 ~. O3 k& R1 G
7. **结果可视化**:
1 }! ^" ]7 Z7 T6 E2 N$ | D - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。0 v; l1 e; w- l+ X, H+ r) D
4 v* h1 j9 t; s0 E0 T" D. Y3 @6 ~) r### 总结9 w" o V$ O& ^$ p- W8 c% Y" a x* n
9 @7 _' w( l @# d! K. \% fPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
& E9 G1 r1 g0 v7 q
$ B& N$ X9 P) A2 y0 F如果你有具体的应用场景或需要更详细的解释,请告诉我!
9 C4 t0 H' O+ q/ t4 N( U, @# @4 o* Y6 c2 e1 e
9 c* o1 s& q1 s. ]$ ]; M5 M% ~5 G' H: r, p# E h, d+ h0 i9 `. D
|
zan
|