- 在线时间
- 479 小时
- 最后登录
- 2026-4-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7790 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2923
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
7 x# m) s' K/ v4 D/ \. D! H9 U4 Z0 e; ^& h! Q' Q K2 V
## PCA 的基本步骤4 c) V9 b( L. b A6 U
% @6 ~' ~, B9 y- B+ m5 K1 V
1. **标准化数据**:) b3 X) M c# @* G* G; l5 A
- 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
2 q* V1 s$ m7 b( [' U8 W D' G, ?! D3 T$ M
2. **计算协方差矩阵**:1 K" e3 P. A8 E4 l2 b6 I( e
- 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:$ `' m, |2 s- y# ?, J# U
\[
! l0 N" Y1 H- z: \& w5 b# Z' T \text{Cov}(X) = \frac{1}{n-1}(X^TX)
- o. j. Z- @9 U7 U( i* y5 w, E5 V \]
9 g8 U9 B- \6 w+ e( @% ~! q 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
0 y% n8 M6 p5 k: T i( U1 r, J; ]2 o) u b+ B
3. **计算特征值和特征向量**:
! G- C) E D% [; g* w - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。2 w* o3 @, `8 y9 \" U1 b
6 L1 \. o( d: \ M! J$ @& m
4. **选择主成分**:
# X# o. v1 ?, D8 L: z' x+ n9 s - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。. t; y! e2 A6 r+ K' c& t
- {2 X6 q* u2 Y' H/ [/ Z. Q0 J5. **投影到新空间**:
/ z0 J8 r1 z1 M/ V* ] - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
& A3 p' [. w7 ?& j: n/ |3 N+ j; T* r3 r
## 示例代码
$ C! O' H2 W. n7 c% m v
3 h# s5 t4 J# l8 S7 G! c& i下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
8 h0 _7 L1 s3 ?( R4 J* u4 b- Y& u7 ?* z8 A! R
```python1 y+ N$ Z: A" M
import numpy as np
+ a5 L3 ~! d7 G( K, ?import matplotlib.pyplot as plt
* _# D3 m! F0 q, ~ I" zfrom sklearn.datasets import load_iris- `4 K6 T% d. B# a# m$ d* b" ?0 R8 d" g
from sklearn.preprocessing import StandardScaler
$ _: ~% [5 X2 y
/ z+ P3 |2 F) c1 s5 D0 a9 W# 加载数据集(这里使用Iris数据集作为示例)' F( a8 {6 l" a1 @' L
data = load_iris()4 D" O. x7 W6 c, r$ b+ [, G
X = data.data # 特征数据, C$ P/ g" Z# W2 V" s2 m2 e
y = data.target # 标签
1 M P& B- t; H' ]" `" _3 U5 z; U& u1 W& ]* H4 P% Y, `6 h
# 1. 标准化数据
7 Q/ Q/ T! f! C' E6 w3 hscaler = StandardScaler()
6 ]: D. l; g9 qX_scaled = scaler.fit_transform(X)
. O7 ]0 i2 w# Q8 J$ j/ ~8 N# W8 `+ h8 I# t: p" y. Q8 X8 C' P7 u5 m
# 2. 计算协方差矩阵
0 H, N& c# j% V2 k2 Jcov_matrix = np.cov(X_scaled.T)6 m2 Z5 \% D$ S
; l5 B$ H2 J+ Z7 ]9 M) z# 3. 计算特征值和特征向量5 C5 u0 _5 d6 _2 O
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
3 Y U% U0 V' k/ Y1 C* F& k% l9 s4 o% w; q! T$ ?% V
# 4. 按特征值从大到小排序特征向量
/ y6 ?! f: _* ~sorted_indices = np.argsort(eigenvalues)[::-1]
@( ^! @" M5 R4 j/ j' Veigenvalues_sorted = eigenvalues[sorted_indices]
& `; x4 k6 m7 J! j: e# f0 Z. Xeigenvectors_sorted = eigenvectors[:, sorted_indices]! \; W- N+ m+ j' c
8 P8 _! W9 T+ M
# 选择前两个主成分 r( C" g1 V( E; l1 G0 f. ?
n_components = 2
3 H0 F3 U2 H/ ^9 H4 kW = eigenvectors_sorted[:, :n_components]! G' |7 x. h1 a
2 r3 D8 O; y" J {, a( v. Q# 5. 投影到新空间8 x1 S, H# {& S) x
X_pca = X_scaled.dot(W)$ C) X4 T" U# ^" B# m* q0 j- q
3 U6 I6 O( }, W5 A3 Z# J# S. D3 J
# 可视化结果! g, I$ ^# R0 P- `0 a' I+ q
plt.figure(figsize=(8, 6))
- K! E! S# O2 [3 s2 C$ E$ Afor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):) g, d/ B6 L' ]' R4 D7 Z" A, H2 U
plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])& y. v5 |: z! ?, l" g7 H
plt.xlabel('主成分 1')
& @6 B2 A" ^2 gplt.ylabel('主成分 2')
# V- Z2 t% h7 X# T" tplt.title('PCA - Iris Dataset'): p: F% k3 g& j+ ~" U
plt.legend()! H) o- ]: j3 S! i8 O$ q8 l+ I* y9 [
plt.grid() Q2 d& K: u/ o1 H
plt.show()
3 l' O, |. \! d1 u9 ]```$ R9 W5 c* m0 z; R
" U4 E2 G% b- C4 B+ J s/ P7 X### 代码解析
% K/ I/ l6 |1 R" L" H$ @' r- b6 x
$ ?* k7 h9 M' K) b8 b9 ?1. **数据加载**:) A' n# g$ T4 t6 `( R; [
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。8 X0 ^8 _% a. j) `' X8 {3 L- @- S/ R
) l- c( v/ U' Y5 M2. **数据标准化**:! Z- |+ P7 U, k7 x& `
- 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
* r5 u. d& D' u$ z% _4 }$ C8 U+ B5 p8 D6 }, B
3. **计算协方差矩阵**:
) W8 Z7 J5 q2 P4 _. L- y7 j8 M - 使用`np.cov`计算标准化数据的协方差矩阵。& O! ]( b! S6 s
/ x0 E" T, C7 K1 }
4. **特征值和特征向量的计算**:
$ `& B( C9 A+ T# Z. o ] - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
) B! k) B. J+ H" e" ?5 }% e+ X4 q# y9 ~# Z5 q3 |$ b
5. **特征值的排序与选择**:
* L& x+ s9 J, s3 r o% I! A - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
* p, R) F( x9 b
% z8 p8 _8 |8 G! R6. **数据投影**:
8 t o$ H5 J8 e* o8 A, | - 将标准化后的数据投影到新的特征空间(即主成分空间)。
+ v) X3 [. p) A6 S! k( c0 s5 B5 P+ F
7. **结果可视化**:6 }0 L$ Y- |( ?* A
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。& |$ g$ j# V- s y7 {
( r3 s3 @ O) E% l
### 总结
6 p* t( o M% v) W0 |* z) Y, O) |! _% O% v1 m. n2 v/ l% c5 H
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。# W3 y% E" b. Y7 F
7 `- R6 R4 M% L m5 \* V如果你有具体的应用场景或需要更详细的解释,请告诉我!3 v% `& f- ], e6 u/ W! p5 R
( D! l6 M; w6 @" E4 w' T
% P. c, L B% s4 j0 j, A# P. ~' N( ^: [# g2 f; x0 O
|
zan
|