- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
: l+ a# A6 _$ X0 E( R. }6 ?, n6 _# u5 i" N& |
## PCA 的基本步骤- n3 V' l$ q; b' x
6 {# x' [/ P1 ^1. **标准化数据**:
& T a; l8 v$ ^" Z( q! j9 ` - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。' u+ q% g" W( R# F& o% u+ k
' O1 R/ l" W9 ?2 x: ?4 f$ a3 j/ O2. **计算协方差矩阵**:) }" z: E9 L3 U b2 Z3 H6 E
- 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:$ I4 R8 @1 k) z
\[9 {# J6 \, J5 J8 A$ W; x4 d
\text{Cov}(X) = \frac{1}{n-1}(X^TX)
- T! O7 h$ @2 [) s# _ \]: {6 g. k0 H5 y- D% }6 w _
其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。' T* I7 C- c- M! H5 w
/ o6 A/ G! W. n1 x, w9 s* H v3 M
3. **计算特征值和特征向量**:* u; q8 t9 ]; V1 L& c. d/ O
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
5 u% j3 `& w! e( L; I# {
! h8 @7 f# `3 Z6 i* F# N4. **选择主成分**:/ d( q7 }- U7 t& ]
- 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
8 E" U8 L5 A6 R" H( y( h
, f) _# F$ ]$ }- r4 K q: Z- P5. **投影到新空间**:; C. X3 l4 r" B
- 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
* j1 N/ D5 t5 y+ J
- b6 B, U5 E0 V8 _0 Y" o! |## 示例代码6 s" a2 N" `: r* n" h4 ?/ M, ]
0 q! `0 u/ g* G2 g9 k: [) U下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
9 K( U8 o) Y5 e' D) v8 Z. j- F* J% \) C8 p* u( |& F
```python5 Y% I5 m6 P( [2 b K
import numpy as np5 A7 _5 L; K }2 q: {
import matplotlib.pyplot as plt. l; N- ]6 F+ z/ F5 [% R) l
from sklearn.datasets import load_iris
1 K$ B6 T9 U& V: Vfrom sklearn.preprocessing import StandardScaler
+ I x1 }, Z1 u3 v4 F/ g& B+ L; M ?
# 加载数据集(这里使用Iris数据集作为示例)
0 W+ j; f% c5 T: }% A8 Cdata = load_iris()/ ^' U- u D* |. o" M. n# G" e
X = data.data # 特征数据
' `/ K+ a. q- ]- h, I! T. @$ O9 ty = data.target # 标签7 X) D7 w1 I/ S6 l$ H; Q
9 R/ p8 E+ b& }, {6 W) m! H: `8 C8 |# 1. 标准化数据
# N# H a4 w! z$ Zscaler = StandardScaler()- A7 x) B: [/ r) |
X_scaled = scaler.fit_transform(X)
& ~6 `8 q/ H. X* U: J0 s2 i2 J% B3 [% e' e) R# E, \
# 2. 计算协方差矩阵 E6 X9 b0 i+ H5 J! ?5 j% ~6 |; r, g
cov_matrix = np.cov(X_scaled.T). ]2 U% D3 h& h- R: |% n; \
& ~9 k) ^! s% H0 ?$ P6 ?
# 3. 计算特征值和特征向量) K$ J! Z1 M$ _$ K& Q/ l. S! c
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
( q6 L Z1 g. E# U) a. v, g( S6 f" o) l5 P, G
# 4. 按特征值从大到小排序特征向量1 F. Y/ A6 W* E. i2 _7 Y$ Z! I
sorted_indices = np.argsort(eigenvalues)[::-1]( T% g9 \4 }7 n9 n; r
eigenvalues_sorted = eigenvalues[sorted_indices]' g) g N( U5 X% e; v7 H/ r
eigenvectors_sorted = eigenvectors[:, sorted_indices]
/ T$ R; t# f2 ]6 q; q2 T+ h& w( Y9 ?0 g) o) _ Y
# 选择前两个主成分8 V. L% B# W$ I! b6 s5 R% s
n_components = 2
) I# [; w( ~+ j+ n% h, v2 T) @7 hW = eigenvectors_sorted[:, :n_components]* z* Y7 J5 ?8 f2 n
; d. C+ a2 ~+ z* H9 \6 R
# 5. 投影到新空间1 u* Q' E* R8 B; V
X_pca = X_scaled.dot(W)
; F7 L; ~4 O, m
o/ U$ Z2 d6 ]# x! y# 可视化结果. c8 z3 |3 `: T" O: \/ g- N
plt.figure(figsize=(8, 6))* g/ G3 e3 H3 P. v) C7 u# Z
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
/ X/ f- p6 K+ X1 X6 {; ~2 _* d plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])1 W" R) I! W! b+ O( n7 k
plt.xlabel('主成分 1'), V/ s0 F) s2 y, q# k
plt.ylabel('主成分 2')
3 c' ]5 C6 ~1 v; P& T7 X* splt.title('PCA - Iris Dataset')/ a! Q2 F: S# D" H8 V
plt.legend(). F$ Y/ l4 \3 C
plt.grid()
5 `: w( a! A4 l/ \plt.show()% `" n6 S! o; f; J1 b
```" W+ ~& G9 n# D% S9 n# X/ b9 ], p
8 J6 |. W4 [' z0 l% y; J) b### 代码解析
! p& A) j! L: c& A9 r# z
. Z- W; ?, D$ r: @3 i# {" f0 Y1. **数据加载**:5 H5 O! Q. C' z4 m5 J
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
9 u: C. a5 p, O5 P& _
0 E$ ]0 s. Q9 u+ ?) }" Q2. **数据标准化**:
) j/ F# q" y: s - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
$ c# Y9 V' f5 I1 X8 ], W, ~4 [5 c# t( f3 I6 z0 N# s
3. **计算协方差矩阵**:
6 I6 L* Z9 F( G& ^) Y: H - 使用`np.cov`计算标准化数据的协方差矩阵。
/ h. j* F s% M5 H0 f8 R6 n& k' J/ U
# C8 D% ^7 E5 |% V; ~, K, V4. **特征值和特征向量的计算**:4 k. r0 R8 C- `5 {
- 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
2 i* y9 A7 q9 D [- R. Y" S6 d% E% E7 J+ {' Z4 d5 \5 [$ M
5. **特征值的排序与选择**:5 s# Q9 ^* j! V$ ^1 a1 W
- 将特征值按降序排序,并根据排序结果选择相应的特征向量。$ C3 I( x( e3 b4 i5 N9 H3 G: Y0 \
: S# s9 B1 \3 e- E& h( }9 }
6. **数据投影**:5 d; V1 Q' i6 M: K M
- 将标准化后的数据投影到新的特征空间(即主成分空间)。
" l( @* p0 O+ V' _2 y4 Q# \ ?6 N. C! h
7. **结果可视化**:6 s9 f( A* u2 ^( f- k% I
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。0 Y3 g. J4 ]- |, l4 N* ~8 n, F, ~
5 o! x( ^* @9 t6 \; |7 X$ S# O### 总结9 e! [! }- q# [! D: ~% n
: Y# Q* `/ x/ I4 Z5 U3 i3 FPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。: g6 _3 @! y# `7 i3 D& `- Q
+ i) t% @* h( C& P
如果你有具体的应用场景或需要更详细的解释,请告诉我!
0 \0 g' j" J+ _4 y5 u# E6 j2 `+ W. e& V
! H7 @! n. ~& d! a
9 t# w" t% r3 ^1 i. S/ X8 D |
zan
|