QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1218|回复: 0
打印 上一主题 下一主题

主成分分析算法Python代码

[复制链接]
字体大小: 正常 放大

1198

主题

4

听众

2975

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。" \, m! U6 a, V+ H2 B

8 L5 K; |$ x% ^8 O$ T## PCA 的基本步骤  n) ~- V- D; p7 |2 c- i- V

0 ^- X4 M2 V( c1 G1. **标准化数据**:6 R2 f) k5 n+ @% C1 P( j
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。9 I" e2 |* j8 D& O  U- H) a6 K$ O
4 ?7 Y. ^# L9 n0 Z, d
2. **计算协方差矩阵**:/ a: ]8 l( I. V7 T/ j9 w: B+ d
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
( s! a0 C6 l* z) J   \[5 S( F, Q; Z! ]2 H7 Q! z% V
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
2 S! \2 f% R' v5 K% d" K8 h   \]
2 {- b2 C4 `9 M) G, ~; b   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。  ^8 R; y* }6 i! m
; O7 |& N, o9 M  X+ o3 ~+ _$ l; j
3. **计算特征值和特征向量**:
- m* K6 w% D  B4 ^   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。& E, W% l# k! Z+ n+ l) Q

( X& o# L" Q, T) R) t4. **选择主成分**:; s5 F) |( i# X0 v# K
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。* h) B9 ~, C/ Y
' G& u4 G+ s+ H
5. **投影到新空间**:/ W" Q" n: a! I$ l# z3 A
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。3 }+ e: |$ l0 |2 ?/ W
/ j2 v0 _: G/ `6 T: u+ T
## 示例代码9 I+ Z* W1 Z7 G

( `5 \! t" G8 ^, ]3 a" Z下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:- i, {- f3 L' \0 V
" q" ~* k1 c, G1 C4 _% u
```python
! @1 A. H% P; A" t; b' B" B6 Simport numpy as np
1 i2 D9 a% e9 ~+ Z% Iimport matplotlib.pyplot as plt
$ @  [& E+ U% E" l* c+ {3 Efrom sklearn.datasets import load_iris) H) c) _  K4 Z3 p' G/ j
from sklearn.preprocessing import StandardScaler, g! f: d# C& l  j, a0 L

2 p; ^( p" M) C* P# 加载数据集(这里使用Iris数据集作为示例)
8 {: a+ g& K0 H, o. mdata = load_iris()
5 h2 }3 X" G8 F% @- V, QX = data.data  # 特征数据
  z: R( U- @1 l% o" uy = data.target  # 标签
6 [# H" B- M$ r# p. a  ^# g5 T! `3 q. @* H7 Y" b
# 1. 标准化数据1 M, [' J& j: ?0 N. M- U& `# V0 b
scaler = StandardScaler()
+ A) O' U4 n/ A" f4 qX_scaled = scaler.fit_transform(X)& k4 h' U% x( a9 [8 K7 E
( ]+ b- V0 J! \( d  W1 S, a; {$ p
# 2. 计算协方差矩阵8 s8 O+ u2 y- f) A" a  H
cov_matrix = np.cov(X_scaled.T)* i% x& k$ d% F0 j4 o$ F6 W- v( E
4 u3 w2 k  M  K' ^
# 3. 计算特征值和特征向量& p% m2 c% ~( \: V5 `) M5 j  y/ c9 s  w& w
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix); H, ]0 b8 B$ e- l5 _  X( X
$ @" l- O' t& s  N: y& }. M( k
# 4. 按特征值从大到小排序特征向量
- [4 e1 J# @/ y9 ysorted_indices = np.argsort(eigenvalues)[::-1]
7 Q; G  E; Q; ]; [( }) heigenvalues_sorted = eigenvalues[sorted_indices]
8 K3 U* L0 O% R$ p0 s7 G; p$ Eeigenvectors_sorted = eigenvectors[:, sorted_indices]- q! v" B8 r/ u! a/ s+ M( I$ J: n" ~

7 k. o9 }/ c0 @# 选择前两个主成分
1 f5 c) n0 M2 r/ ln_components = 2
& O$ E2 s$ [9 v( G, EW = eigenvectors_sorted[:, :n_components]
: u" }( H! y+ a! U% ~6 G# h* Y+ f8 }4 o! v' u. j5 l# g# G3 o
# 5. 投影到新空间0 S) D, `9 p. Y" ]
X_pca = X_scaled.dot(W)
7 s; V& Y' H) X% z& i3 d% Z
* Z+ q( u% K- C# 可视化结果
+ Y% D4 O) \- v/ n2 E( E8 J, Wplt.figure(figsize=(8, 6))6 u/ L' R; ?4 H0 O3 w
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):7 }' h6 j, H& J% _
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
( [. W9 F: A5 O- B5 Z0 }  k0 |plt.xlabel('主成分 1')  B* P+ O  o! b; n4 M
plt.ylabel('主成分 2')2 |* S% T$ Y- v
plt.title('PCA - Iris Dataset')4 |2 }. n4 d5 G1 y# D, e
plt.legend()* r6 ?- U# }& _7 V+ T
plt.grid()
& X. P; w6 r( L; B& H* H% xplt.show()# }9 D" v1 \- {3 T
```
) M$ F4 I& ]" x( c8 B
; z8 z6 c9 \4 g  M4 |### 代码解析
% Q. T8 g; m3 a2 [# @& J6 K) m1 Y- _9 f) L( Y. C
1. **数据加载**:. F) c& r( n! X& L9 w
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
6 q0 B0 c2 B3 R. T$ B! W
  w: |$ J7 ~! U6 b3 D- n7 b4 m2. **数据标准化**:8 K- p9 p( s) L( K
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。( H! `. g, @8 F$ i& U
1 p2 Q7 Z( F  q5 ~0 z
3. **计算协方差矩阵**:
9 D9 l5 `8 L) e   - 使用`np.cov`计算标准化数据的协方差矩阵。
! D6 ?. ?6 x4 o; O9 y
" j8 Q7 }- `5 a+ w7 Q& W4. **特征值和特征向量的计算**:/ w6 ~' }4 [; ~+ k$ ^8 y) [% `
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
. o2 z2 e, G' _! s. B" o$ C
" ^3 r( W; {4 P% u) n' W5. **特征值的排序与选择**:
0 f- I( J4 I, z+ q   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。; ~5 {1 ~: d" E. M

9 |) {; C, _1 [, |3 a5 }* j  u6. **数据投影**:3 F2 j! D1 z. @1 e
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
* [2 D4 t5 o, R% p' H$ c  G% [+ K* S2 @% @9 J; I9 b) ^
7. **结果可视化**:
" t; y) ~* F. k) C3 l" X   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。& M( q0 ^7 r; W+ L3 g4 n) w
% g3 e+ _( ~+ ^, Y4 J, F
### 总结7 Z! i9 J9 {9 m; ?

: Y* U( `, A8 ?6 Q* d+ ^PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
- f/ D- Z1 k1 t" G5 O3 O2 h6 {/ B5 b! t$ q: _
如果你有具体的应用场景或需要更详细的解释,请告诉我!
+ r% c" }  `  \9 S5 u1 L" _" G  f: t% D* [$ ?
3 @3 m* i- d# w3 t' g6 k7 `
  f7 e1 \/ Q/ @8 h5 w, o

主成分分析算法Python代码.txt

930 Bytes, 下载次数: 1, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-9-12 09:05 , Processed in 0.414105 second(s), 55 queries .

回顶部