- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。6 Y2 Q- {- Y+ U" D
* ^* ^1 C2 W: k0 t
## PCA 的基本步骤
& F1 j4 Q$ m/ |
! J7 _! v# q& l: h" I! w( U! R1. **标准化数据**:' i* k* Q/ m3 o* u1 }' b
- 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。 s) G! ^8 U3 Q* v0 ?% h1 S! g
/ y( K; h# N" w3 M; M2. **计算协方差矩阵**:
/ I. p0 j* ]9 L% x - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:' o- {7 m7 t7 T% {+ |
\[; K; @3 M9 ^; _
\text{Cov}(X) = \frac{1}{n-1}(X^TX)1 }% Y2 `3 K2 r+ v; {1 \
\]
3 Y4 I1 q+ O6 K& y# s7 m 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
( w( @1 Z! T% k8 `5 m5 P, b) F/ g6 x; K+ u% B
3. **计算特征值和特征向量**:5 H `- K F3 l* M( y0 C) |2 V$ k
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。" J2 Q# g* }5 k2 m
4 ?9 x' L; w) \, O
4. **选择主成分**:
]$ R6 R" b2 B' w6 M% c: M - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
) N4 Y2 h- i' B! s5 }
. g$ s8 \5 a' }5. **投影到新空间**:
# A. _! P3 V6 V4 W2 v7 \ - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。 R1 x+ x8 n" f! C. ~& W
1 y0 h; A- D* ^1 {7 L
## 示例代码9 _6 V- Q' o! x. @
9 @! A9 }+ y; k. a% U4 o
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
& |6 ~3 g+ B6 Z( o9 Q: ]8 k3 d3 [- Q
' e. b! h0 {3 V9 V- B4 F1 c```python
, N& B5 g& ~0 m& qimport numpy as np
# }; U! x! [8 A- S5 mimport matplotlib.pyplot as plt
" N# O5 O. x# ~) S0 f0 Mfrom sklearn.datasets import load_iris
* o4 E% V5 X7 H! Z+ c# g2 `7 j: ?: jfrom sklearn.preprocessing import StandardScaler
: n$ I E; r6 E3 w& y% j2 X; r. V# \7 T5 ~) K) Y
# 加载数据集(这里使用Iris数据集作为示例)
) R& }- a1 e& p6 X; Fdata = load_iris()
1 X4 @0 m! N6 K- B3 D5 KX = data.data # 特征数据# `' D5 f3 e3 A. Z7 U
y = data.target # 标签5 V% x; f* j$ w6 N f% ^
( G" e' k2 M6 {: U4 t
# 1. 标准化数据7 P/ A3 B; ~: Z W$ o5 O8 b; L, Z
scaler = StandardScaler()
/ {# E; _# \8 j1 L- W# I6 I- C# {X_scaled = scaler.fit_transform(X)
# U+ E0 x6 Y, U9 H& Z4 T
0 z# J1 Y7 G- F9 X! g; G% {: _' G# 2. 计算协方差矩阵6 P. B ?6 Z, ` m) B- L' s
cov_matrix = np.cov(X_scaled.T)! ]. K# W+ I; W4 L6 \; E8 h
$ q1 A- t+ ?! g+ f5 B) z# 3. 计算特征值和特征向量! _; r! ]" d, n; j
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)( v7 h# Y1 U+ ^7 A8 ^# X
7 b0 I, K5 j, Q* u" ] i Z, b+ c
# 4. 按特征值从大到小排序特征向量$ |" T8 R& e& p2 M% T* X. n
sorted_indices = np.argsort(eigenvalues)[::-1]; d) n1 m, }* z5 V& J& S' m7 w
eigenvalues_sorted = eigenvalues[sorted_indices]9 Y/ {5 [# s% R+ G* Q$ s5 g" ]
eigenvectors_sorted = eigenvectors[:, sorted_indices]
! B! [; k7 D6 W3 f& Q- M6 Z2 q; E9 D2 }, ^
# 选择前两个主成分
9 Z: w+ X. c- x% ^; An_components = 2
8 o2 I% \% b9 P [W = eigenvectors_sorted[:, :n_components]
3 H3 A* R' q8 Z X# _
1 o8 O' o- O1 p0 l/ \' G# 5. 投影到新空间
) D9 @# E+ t+ |. YX_pca = X_scaled.dot(W)
1 U. x( L+ S/ o" b# p" E O5 v: \6 v P. h4 b9 J |2 A% m, E
# 可视化结果
7 v9 l r) S! i# ?, gplt.figure(figsize=(8, 6))
$ q' @; A' U5 {4 a1 kfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):, T; @' l" W8 Q, ~$ e
plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
5 `7 w A9 ], \1 g. O# V; o! R( s9 nplt.xlabel('主成分 1')- g8 t8 k4 o4 ~. p
plt.ylabel('主成分 2')& J# k4 w Z' D
plt.title('PCA - Iris Dataset')1 q0 \$ ?7 ^7 Q0 A
plt.legend()7 L+ f ~+ q6 V" L
plt.grid()
9 G2 J: X+ J$ E2 W6 @4 K4 \plt.show()9 s) ^- {' l* k; w0 z' W- c- u; Z
```
) L7 r2 W" u9 Y, V1 c, y9 u9 n2 j& X6 {
### 代码解析3 ^+ L7 _; H. r6 j5 m U
# e3 k7 f% r9 O5 c; N
1. **数据加载**:9 o3 F$ S, Z3 t2 n {
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。8 V; g, _7 a( H' X$ ^: ?
; G# h1 x7 ]# F0 s! D! d
2. **数据标准化**:
7 d- e9 D1 L) L" n# r4 o: G - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。/ g# j. I/ P. Q. P. A
" R3 x* G; \4 a% k0 |! b! E ?) w3. **计算协方差矩阵**:
& f5 y% U/ m; H4 N2 c - 使用`np.cov`计算标准化数据的协方差矩阵。6 e/ ^ b" T9 @' |# j
) D4 v) `8 p* R) w0 g. S- |4. **特征值和特征向量的计算**:
$ C) w7 h" j9 u9 |3 r - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
9 w& t0 t: L. y) N5 U
* w. L! h( s% L& D% h3 W" z5. **特征值的排序与选择**:
2 F) F3 k5 [5 j3 l$ ^9 X% G: i! T - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
9 y4 Z* Z7 o3 ~" e/ R% ]! y0 Q4 M4 z, e* a& Z* V( ?
6. **数据投影**:+ X$ s# |$ ?* q2 d
- 将标准化后的数据投影到新的特征空间(即主成分空间)。
2 z( n1 v8 C7 Q. b
8 R- z8 u6 y( Q6 g" B9 R5 }8 g4 s7. **结果可视化**:, a9 ]# q' R; g# V
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
, x0 W5 F- e& j: v1 \* C( c8 f2 H3 s- k- g0 l7 a3 \" k
### 总结
5 ?% u$ w8 y: T" e" P# A8 v9 X2 {# |& z: R( h& s4 \
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
: }7 F( @3 L/ e9 ` D6 f) x( y& {" k8 b" u; V
如果你有具体的应用场景或需要更详细的解释,请告诉我!3 ^2 r }9 [% x) Z" f4 c& L
6 ^5 X: G3 l3 I; W8 k1 R& v
, ~: g* Z9 Z* g) d2 R9 \
) `5 d1 e: g W5 Y( ? |
zan
|