QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
5 a7 J0 G) ?3 @+ M  y4 G* p7 s
5 i  K/ @! v: r5 N( i8 K## PCA 的基本步骤
5 P, K& y" t# E. W( m4 z' d/ e( `% p/ ~: G* V7 G3 _
1. **标准化数据**:+ ^* n- Q0 Z/ V. ~4 q
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
# r5 ]1 K( L4 o0 ^" d
# X$ y5 G- L6 k4 |2. **计算协方差矩阵**:% k% C  x" M- C9 ~  X6 Q7 N3 j' c; Y/ S
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:; c/ S& O, G7 q* `8 V
   \[
' |' C$ l4 o. |$ p   \text{Cov}(X) = \frac{1}{n-1}(X^TX)# T2 c  d8 `9 u8 O! z0 D4 t
   \]7 K1 {* n* @9 w. f% F
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。& G3 P" W- U9 `' t5 [
! u! K5 `: @& r" C0 }  T  |4 I- R  r
3. **计算特征值和特征向量**:
9 q! \0 l( X, f; j+ n   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
0 V9 f2 m" a5 ]4 e5 F. G
3 y/ U- C  W, Z' o4. **选择主成分**:: Y$ ?) _( l. w+ z6 f( m& O
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。% v: X0 S( X# H: b) l) q
6 M# Y. V. y& J% Q+ v$ j) ]8 v
5. **投影到新空间**:
# e- }: m# B  I   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
+ B- y* Y; ], ^) N0 v/ ]( h' ~1 v) m4 S5 `3 N
## 示例代码7 C9 \$ {. G  v, L

) T2 l) R" E+ {$ f, n下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
/ b* j( h) z6 G% o. A3 c6 L) y8 x0 }0 f
+ \' C. i! z( h1 L/ ^```python
6 y5 S: F/ E7 s7 f. ?import numpy as np) a' n* ^  _8 ~7 o1 A7 N  d" S& E, {/ X
import matplotlib.pyplot as plt; p) E4 D0 t, q6 P) R4 f9 k3 X* J" F
from sklearn.datasets import load_iris: L7 G8 m4 i2 f) d8 U4 g
from sklearn.preprocessing import StandardScaler4 s: N) _6 v2 C

, t* ^( `% a4 ^# 加载数据集(这里使用Iris数据集作为示例)' l' b$ t$ ]4 E9 \" p0 o
data = load_iris()
% X' x  e8 b# x* B& @* O, O# cX = data.data  # 特征数据3 J# W: n$ u  i' p' H) p7 K
y = data.target  # 标签
8 \* K! y! c* ^, _4 K
1 W) o$ z8 ^, m9 w! P+ @0 D* ]3 V# 1. 标准化数据: Z7 R3 E  S! H! W9 }4 a
scaler = StandardScaler()7 i4 U4 W& p% y; L3 R# E; V
X_scaled = scaler.fit_transform(X)
, b1 P5 x2 p  L$ ?$ a
' Y/ w9 l$ `  B. g4 a; ~# 2. 计算协方差矩阵0 x8 x' V3 `7 {& u
cov_matrix = np.cov(X_scaled.T). E( f2 V6 {6 _" j" T% }

2 G/ Y1 C) g. `3 W$ j5 i' q) w- L" \# 3. 计算特征值和特征向量8 `" Y4 x0 f& @4 U; v
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)" V) Y+ D; `) H
4 F/ _* f  i& M1 n+ P
# 4. 按特征值从大到小排序特征向量4 ~' `) }1 k* C, g
sorted_indices = np.argsort(eigenvalues)[::-1]
2 v8 e6 P3 h( k+ d8 l' l- Leigenvalues_sorted = eigenvalues[sorted_indices]
( R# H4 J! ?; ]. w% j1 leigenvectors_sorted = eigenvectors[:, sorted_indices]4 Y+ {% _$ X* c4 H9 v/ q  G& i

; q. G+ k4 U" L# 选择前两个主成分
9 v" Z0 I$ w# `* d& ]8 fn_components = 2: g+ k; r; w: X6 T
W = eigenvectors_sorted[:, :n_components]- \2 \1 d3 p' X- d

! H: w; ~( N9 G1 w; r2 ]; B" k3 ^# 5. 投影到新空间# F! C! B8 x9 {% A" D, }0 e
X_pca = X_scaled.dot(W)
$ i5 n: d- Y& l
. |0 n) G* A4 H8 u+ A& e5 l8 Y# 可视化结果9 ]8 ?  ?$ P. M& Y5 |* C5 i3 r
plt.figure(figsize=(8, 6))
" b+ v; ]1 _) D" _! kfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):$ T5 j- g  R8 E! Y: u& k: `9 R
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])9 J9 f6 P2 g7 W+ {6 o$ Q8 ~" W
plt.xlabel('主成分 1')
- \( P, K2 e" r6 f9 |plt.ylabel('主成分 2'), D3 W- F- \5 _' f# A( }5 i. w
plt.title('PCA - Iris Dataset')+ a2 B3 c6 X7 o
plt.legend(). O% ]3 I  I+ m- _: G
plt.grid()0 l5 g8 Z. J6 P! J' ]! U
plt.show(); E1 g- e$ F" f, d0 x
```% r! D8 t8 O7 W/ f
5 T$ `, k7 s% @: j8 J- b
### 代码解析& d7 t2 {( T5 A- R$ @$ Z- a
0 A* R; S5 G+ K$ k3 Y; L
1. **数据加载**:9 ^* v/ j3 m% y
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
+ c; n8 e$ w- ?) h4 b
* G! K5 _8 V9 g7 {2. **数据标准化**:
) R" ?: |$ y  O   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。. r# l, y& F( q8 ^' M8 e& ^
% ?: G/ R* \& m) n# X# |- s
3. **计算协方差矩阵**:& ]5 P4 p4 U7 o4 j  H3 Z
   - 使用`np.cov`计算标准化数据的协方差矩阵。& P( z5 f' i* G# ?$ a# L( s

  ~3 H: ^: l* [1 ]7 {" P8 X1 ^. l4. **特征值和特征向量的计算**:
% [& m7 f' o0 Z% q! b$ c% h   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。0 W) p5 j" Y1 n
9 v( T% M$ b% c% j
5. **特征值的排序与选择**:6 E% \/ l% r% y! _) v
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。8 F7 L8 Y2 T4 @% k/ S: A/ t/ X
$ i3 b0 x) @, c" |
6. **数据投影**:
" c5 k9 ^. P) E4 i   - 将标准化后的数据投影到新的特征空间(即主成分空间)。: H# y" Y% d9 H5 U' R4 J

1 k$ I6 F' M2 g! Y# M+ P$ p7. **结果可视化**:
& z% b) W# q3 g- r   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
+ S( R5 u  a6 a7 f0 v: n& b6 h& Q& a
### 总结
7 ?" q  q  R3 t$ p4 u/ d& Y
3 Y6 ?& h' u: `PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。$ h4 r- v4 q; @( a+ o8 b8 ]; t9 L

  u: @8 G8 z- _9 w7 q如果你有具体的应用场景或需要更详细的解释,请告诉我!
/ S6 m& m4 L4 w9 i0 D" {7 t/ O# s$ ]5 r1 E; I" f

0 O+ }' Q2 @2 g$ r: N. p/ r1 Q5 \5 `# N% ~: Q7 N

主成分分析算法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-10-13 06:06 , Processed in 0.661679 second(s), 54 queries .

回顶部