- 在线时间
- 481 小时
- 最后登录
- 2026-8-23
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7858 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
/ X3 E9 n1 ~, U0 v9 P# m4 L' K: K5 a
) m8 n: [, L6 _. f" w## PCA 的基本步骤
) k3 |& h; N3 ^& y: {. `) k) I7 [+ D( {/ ?* {1 ~
1. **标准化数据**:5 h: m/ z. R0 w% C
- 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。6 X }0 V9 G1 p" Z
' P' s" w/ c9 |4 Z, ]' D2. **计算协方差矩阵**:+ V" ^: B+ z- v7 \$ ~' Q7 C" b
- 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:# A! l9 O4 i& N3 P' j! X- K: ~4 I8 u; f
\[5 L( P. G- h+ z7 ]
\text{Cov}(X) = \frac{1}{n-1}(X^TX)
" K/ G4 A- a- N1 Q# }. v \]
3 k# j" z& K* B: h% ?" w 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。6 m* Y* @% n2 V! V2 {4 G
" e) H& ]. E, [2 g) _8 b
3. **计算特征值和特征向量**:1 r1 e% _0 q/ J4 q3 i
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。. N+ N: Q+ a9 x; B9 C' i
6 g1 @" W0 N$ \% N% C# f7 ~9 ^; W4. **选择主成分**:2 r1 s6 q! S+ Z: e8 I! S( y
- 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。, w4 D, n4 P5 I0 H
2 w% S$ c0 |0 T* }$ I8 U& X o# r
5. **投影到新空间**:
! _! L9 @4 {+ o* c - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
?! {0 M+ [+ l' d9 _1 R- D( _( O& s$ d: x
## 示例代码0 R# J: Q; E$ B! {# G
$ K$ @- |: l' j7 A& a0 b下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:2 T, I! T Y8 k: k5 M
% |6 M( J$ R5 [- K, z```python
/ r8 q7 P; R( T7 Z% Timport numpy as np/ Q- [* O0 y& T, a
import matplotlib.pyplot as plt
0 X6 H. T+ p+ i6 M Afrom sklearn.datasets import load_iris
3 ?2 B* H; ~' G, z6 J: H* Ifrom sklearn.preprocessing import StandardScaler
9 x% O; l: G' g* d- F3 M6 A8 p7 k3 y( m/ I7 q; a* u
# 加载数据集(这里使用Iris数据集作为示例)# P- T* Y3 ~( a6 K. b# l4 I3 H6 X( D7 a
data = load_iris()% l% X! E9 ]0 C1 \4 n
X = data.data # 特征数据
- {6 H C: M! p8 n4 Jy = data.target # 标签9 i- y0 O) ^. f: G" ]+ V3 k
7 @# n9 z5 R1 Y0 d" m7 ]
# 1. 标准化数据4 _% o1 Y- V! C9 x# m3 w [" v6 d
scaler = StandardScaler()3 ]& h p( \+ X3 z4 D! v) E- x
X_scaled = scaler.fit_transform(X)# y# L, E' o; v1 x. ]0 d
- Y, g! {& k4 Y% b$ n$ Q
# 2. 计算协方差矩阵
+ z) Y! |" i- }% \cov_matrix = np.cov(X_scaled.T)0 i2 }9 S( e4 r* p& f- g
6 r1 [; E4 {, Q5 D x U6 T. s
# 3. 计算特征值和特征向量
) @. f) E2 X0 q7 i2 i# Keigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
0 l* z# C& y U) d1 M$ m0 e" I; O8 m# j. I( L0 B0 l J1 Q
# 4. 按特征值从大到小排序特征向量
6 s1 u* A1 p3 x! ^4 j. Nsorted_indices = np.argsort(eigenvalues)[::-1]: ^3 K6 H+ ?. H$ J; l- a2 c
eigenvalues_sorted = eigenvalues[sorted_indices]4 v9 _: h$ V! c4 R$ H% a6 D
eigenvectors_sorted = eigenvectors[:, sorted_indices]
; V- F" h0 Q& O& b
( L& @$ Y! r& e- y- W) `# 选择前两个主成分
* f( a4 T2 d* z5 pn_components = 2
) }) v# Q- @- j/ a) u4 X! W- PW = eigenvectors_sorted[:, :n_components]9 y% i- X" ]% s; J! L# h0 H. c
. _8 z0 r6 R- C+ _# 5. 投影到新空间
8 y3 U1 Z5 u6 j2 P! ^) U9 uX_pca = X_scaled.dot(W)
2 m; g7 K5 e, r x
+ d& t! K* U) d' }/ u, ]# 可视化结果
3 D- E. W: [; y Uplt.figure(figsize=(8, 6))( `0 c9 M) V7 Q& i$ K, b( T& Q
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):. e& z7 J, E4 m \6 Y7 T& S
plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
* C8 J) x. A- a: \# H1 l$ Rplt.xlabel('主成分 1')
# g7 y* \+ u% T! Jplt.ylabel('主成分 2')
) r( B! Z" R, |9 Q, t% eplt.title('PCA - Iris Dataset'). Q) }. S0 S% R
plt.legend()- v' I6 H# R' b0 ^/ y
plt.grid()
6 J3 ?" J) k# t8 H4 eplt.show()) I/ @. C1 k. v z
```
$ c2 `+ p; _3 @; d5 C/ _1 ]
7 J4 _, f9 ~( I4 p$ O### 代码解析6 S/ R$ A: E" ]5 B& {
( [5 G2 a' x0 T7 F1 W
1. **数据加载**:
6 ]+ L4 r% ?" I8 W - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。3 z7 M: o3 [8 _3 p! C- o* n V2 B5 E
0 Z' f6 R H, P, k* C5 b! f
2. **数据标准化**:
& v( R* A) R! U5 Z) s - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。0 f0 s( M, M3 ` b1 J
6 {- t, H$ S6 A' j- ^* p3. **计算协方差矩阵**:
, C4 R8 p* O" ]+ ?. q6 [, p - 使用`np.cov`计算标准化数据的协方差矩阵。! S: C6 p: ^' ~" m; c5 z, |( X D
- G# X! l! ` K# P6 D: F& E, m4. **特征值和特征向量的计算**: b6 _; w. a& w1 H( G. {$ y
- 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。1 d! A7 b$ Y& v6 y8 b0 {8 M% y
6 t, P- K& f: V" X) [; U" v$ `6 [5. **特征值的排序与选择**:
- {4 f/ y4 w/ D: {1 X( n" r$ V! Z8 @ - 将特征值按降序排序,并根据排序结果选择相应的特征向量。& I) N& t# M0 L9 X2 J% U* k
3 C9 i8 T l2 s" p2 x1 d# |6. **数据投影**:
, d/ e9 M& F5 n9 k0 z - 将标准化后的数据投影到新的特征空间(即主成分空间)。
( y+ ?, h: ]# U# i, c2 q0 g
% x5 Y8 h0 B9 k0 C' C# b7. **结果可视化**:. Z( N3 o& I$ h2 w0 I6 n. ]
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。& u7 Y; p' S$ g
+ B, @' _9 v4 v6 K" O8 @, j### 总结
: P$ c- W7 m: Y4 m1 e0 k3 ]6 U. h& J! j5 F' q/ i
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。) y# W& b& O' D! m1 c% y
! ~" ?: t/ \$ e% [" z! ~+ O5 Y
如果你有具体的应用场景或需要更详细的解释,请告诉我!
1 p' B) J9 H/ u! _% C# V' A7 y4 c4 h/ u v2 L0 J
# }+ o/ e" l9 r/ t5 a! Z5 u
1 y" D* s+ L4 e1 G$ [ |
zan
|