QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(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$ [

主成分分析算法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-8-25 06:21 , Processed in 0.592933 second(s), 55 queries .

回顶部