- 在线时间
- 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广泛应用于数据预处理、特征提取、可视化和去噪等领域。! S I+ d4 k+ l5 j# U
: [6 X, B( {! [## PCA 的基本步骤
3 `, l+ f" L6 p9 [; G: D
% ~' L t8 b y: p' p3 e1. **标准化数据**:
9 `8 x+ N. f8 d+ p# g' d, x7 y - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
. n5 b+ j5 S8 [8 Z$ X6 G' v
; G2 I6 d+ T; O2 G6 t4 z( I8 _5 d5 ]! R2. **计算协方差矩阵**:
. f, @+ N9 J, I - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:/ ^8 Z! y7 W5 \
\[3 S/ d5 U2 K" w- m
\text{Cov}(X) = \frac{1}{n-1}(X^TX), q3 r4 X, t! {1 d1 t9 @7 o( L
\]
$ h6 j9 ^7 o9 h. s, t8 o 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ H- m7 v, {$ _7 D _) Z
2 E5 m) C6 u, B
3. **计算特征值和特征向量**:
- E# t7 z* d; F/ ^: { - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。8 u7 Q2 z* }( t$ M3 w
* e6 J5 R+ ]9 t+ ?- z
4. **选择主成分**:
, d* S; ]$ i+ l9 K, }% d - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。7 ^- `2 E0 d5 v. m4 a5 L
1 o7 E! D0 f1 h+ V* X! M _% y+ k5. **投影到新空间**:
3 Q% L, o% s9 m% { - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
* g3 l" u0 J! }: }
( }4 O1 Z% ]. D8 J3 c## 示例代码5 y* ^1 [- e/ M
7 V/ _* ~5 [% C下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
& k v# N- o1 j0 h ~' A! F t7 k' T) F
```python' D( R0 h1 T; F! t" A
import numpy as np: u6 A( a" M$ D0 s# g# r% m( R
import matplotlib.pyplot as plt
5 O+ j- ^: }( l# s/ m2 Y# ufrom sklearn.datasets import load_iris7 o) R8 f1 Z+ X: ^8 T& @- E, i3 U
from sklearn.preprocessing import StandardScaler% X7 d; d( C% S
' N0 X4 d; Y6 f. y# M) r$ u( B# 加载数据集(这里使用Iris数据集作为示例)
( g4 |) P V2 {3 _ O* A; D6 _2 Ldata = load_iris()) j% i4 w# Z' ^6 k$ S1 y0 t, a
X = data.data # 特征数据& Z5 t: l% e& K2 ^& Q
y = data.target # 标签" g: W0 \6 @- R6 Y3 j; d
3 O5 k2 x; `; O; I
# 1. 标准化数据! n) z I3 F- m4 `. ?
scaler = StandardScaler()
5 h( P# H6 ?# U9 d# n0 ?X_scaled = scaler.fit_transform(X)
" Q% M: t T# d7 m* L, `5 d
5 |1 Q/ `8 c) @7 z8 |# 2. 计算协方差矩阵" d* h( f$ Q% o
cov_matrix = np.cov(X_scaled.T)
1 E6 k( D1 b$ a$ |: k. |# \) k' H- K
# 3. 计算特征值和特征向量
9 A7 ^, a; {5 ueigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
( g5 T- ?6 O" P, }' D( D2 c* D# o0 F0 ~; Q# Z7 B
# 4. 按特征值从大到小排序特征向量4 A9 K9 s9 A9 J" Z" U8 t" O: e
sorted_indices = np.argsort(eigenvalues)[::-1]' a3 J2 R R% w, f. Y- q# y
eigenvalues_sorted = eigenvalues[sorted_indices]
- X$ R! l2 |9 _" k: [$ Deigenvectors_sorted = eigenvectors[:, sorted_indices]* y# {+ \1 r0 z0 w$ e
& g4 ~, y" \8 k" ~( Z
# 选择前两个主成分) O+ s; E: S0 Y7 w
n_components = 2" q1 s3 M0 X% D% ?
W = eigenvectors_sorted[:, :n_components]) L: q& M) A0 b
, d$ J1 Y3 F7 t6 ^% A$ j
# 5. 投影到新空间5 G, I5 P; _" q
X_pca = X_scaled.dot(W)% A& o2 _! j, |2 e. W: y
6 c/ u( X7 ~' y( V1 W. j
# 可视化结果
, |3 k! L' g( l+ S$ N5 K9 P: y- yplt.figure(figsize=(8, 6))+ k$ g0 I) d1 h, d' u( }
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):* P( S+ v" ]" p! |
plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
+ V# | ~' b! S4 s, Q) L# Yplt.xlabel('主成分 1')" T# C' I* a- [0 R
plt.ylabel('主成分 2')) ~8 |4 o- s$ F8 D; _
plt.title('PCA - Iris Dataset')2 K, _& M8 w7 y; V- o0 W- f
plt.legend()
# Z" x+ U+ ?" @* ?plt.grid()4 o; @0 X3 P9 x
plt.show()
' J! g" [) X3 K% q- V```" V3 w+ r6 ?4 e$ p2 g
8 B {5 R% G& X
### 代码解析& b) B0 a, u% i3 F; ]/ d
5 D" k! { m- `' o2 E5 O+ f1 U1. **数据加载**:, s4 ?6 o8 A8 V* q- j% t
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
: @, s& O" E8 ?4 l
4 P0 D3 w9 F8 K3 y h2. **数据标准化**:
- A; q+ w, `; b5 U# f7 d! W - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。- x: p, m/ S9 Q; {6 Y
h0 j3 |% }" E0 f/ z3. **计算协方差矩阵**:! Q' c- _- H$ Y6 Y1 G- J
- 使用`np.cov`计算标准化数据的协方差矩阵。" @+ i; A% B1 K% {5 g% w1 I) M6 ^
! S) T% x; D, ], D6 V4. **特征值和特征向量的计算**:) u+ l9 Y8 [! m+ u" z8 _
- 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
& g+ m5 ^1 X' y0 _& s# n7 S% I" n& f$ B0 |8 {1 a: c, E- o
5. **特征值的排序与选择**:
( n1 y/ R1 C* v4 \- x- m3 W - 将特征值按降序排序,并根据排序结果选择相应的特征向量。- A2 B! L; \8 o1 H: t; K! ^6 \
% T" }4 S2 ~2 a3 f/ p3 z( s2 k/ S: a6. **数据投影**:
6 \+ M+ f9 C5 U- g! K @ - 将标准化后的数据投影到新的特征空间(即主成分空间)。
/ j& k- c& E+ S" b* M) a! O/ G. Y: L
7. **结果可视化**:. L5 A# {8 ]" ]. Z% s8 ]
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。. K( j: g* [% p5 t6 K
. Z$ W, ? k, _' C+ B u
### 总结2 Q0 J6 I5 D. F6 U5 `2 C
3 H# U5 H5 n# Q2 z# L. H( H) tPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。( E# o: @9 i1 `
1 E& z8 d L' q) F; l0 A$ n
如果你有具体的应用场景或需要更详细的解释,请告诉我!
) L( W. [# [) B3 {& M2 j, B2 J/ E: m+ K& T9 m0 ?: b# r2 Q
6 a# Y2 a% I8 \& l3 o
0 @6 n! C. C, b# \& \$ |' N3 | |
zan
|