QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1186

主题

4

听众

2923

积分

该用户从未签到

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

+ t. A; n+ }  h7 j" h## PCA 的基本步骤
& F1 X9 R$ R& D+ H* \7 L8 d0 M
  G' K! O) ?& o. j  U1. **标准化数据**:6 p% v. H6 K7 j& Y$ T8 d% z, G' \) x
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。4 \& k! u9 @3 g) `! Y( O$ Q

' _  P% f) }* ~* F. w+ U, H( J2. **计算协方差矩阵**:
  P$ \6 Q. A$ u, N   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:: a6 U3 a" p* d2 }* t7 y
   \[9 E2 b4 Y. I1 H$ g7 q+ D
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
2 z' w1 U4 j3 l% E2 x' P8 _* t. w! p  q   \]
% x1 Q. t  T* ^( M0 E% N3 f2 ~   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。1 Z& x1 f$ B1 W4 P7 P6 g& [/ f

& o$ y8 U! X' f( g- F! D- i4 h3. **计算特征值和特征向量**:
  ~/ d- p* x; g  k: i$ C2 D3 g   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。1 A+ [( j- P! d: {: m# `
; {1 k7 T+ z: v* c
4. **选择主成分**:
1 o" h( y8 v% a" j" m   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
8 G) e6 C. x% A1 C3 P0 }
$ t5 c' `: Y3 h5. **投影到新空间**:
+ Q8 S" P* C1 f$ I7 z   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。: D1 e7 U' |% p7 h

6 S/ B8 o3 u9 O) h## 示例代码: f7 u/ y8 b# K; y1 c

! A2 F1 s6 g: ~' A; }) T8 U下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
6 m/ N! O* a) o. q+ S! Q* Q6 y: p/ r' n( ^
```python* Z6 m- ^# I2 l' u$ g8 }
import numpy as np- t: A1 ?9 t4 E% H) V
import matplotlib.pyplot as plt4 M3 X" T% L) K9 t- H* \
from sklearn.datasets import load_iris
$ K! k$ |- x* o# Y. E6 Ofrom sklearn.preprocessing import StandardScaler
$ N! ~+ Y8 `% i" c
+ f% Q) c8 c* o+ i# 加载数据集(这里使用Iris数据集作为示例)
) c* K) A9 V+ n5 ~data = load_iris()
5 p4 p+ b& Z$ D$ Q9 B, yX = data.data  # 特征数据
4 o" B, i$ A% {3 S. @# ny = data.target  # 标签$ U' Y! a& x; r$ S

# x6 e) A8 X4 F# 1. 标准化数据5 \7 H# e" F+ |& X
scaler = StandardScaler()+ P; f7 Z4 T+ U+ t/ b
X_scaled = scaler.fit_transform(X): O5 Y. }8 Q: g: `3 C" p# ?: n' H
2 M  y! V5 f- i8 t
# 2. 计算协方差矩阵1 @7 [% R3 h/ Q; A
cov_matrix = np.cov(X_scaled.T)
. G% i& ]$ U/ P0 I9 O4 _8 G2 a
; C7 t  H% D. b6 s1 Y# 3. 计算特征值和特征向量
7 ?+ n& F8 Z( O6 \4 G. }( E  aeigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
3 v! D+ w% F% x! y2 \2 o1 r2 g+ ~. [1 G0 V9 k
# 4. 按特征值从大到小排序特征向量
$ C; V, X" U! z4 ssorted_indices = np.argsort(eigenvalues)[::-1]% E" ?5 J6 \. i0 M2 n/ N4 e
eigenvalues_sorted = eigenvalues[sorted_indices]
1 i3 L# f+ O. seigenvectors_sorted = eigenvectors[:, sorted_indices]- @) n' n% g8 I; ^5 X
* W# }  k. J/ M& E  A- y& R
# 选择前两个主成分
' B8 B+ v  G" J& q- {n_components = 2" r+ [# h3 O7 e/ S" E! l
W = eigenvectors_sorted[:, :n_components]
* }8 O. P: B$ B+ ~0 N
* _# z( \& ^" V- q) b# 5. 投影到新空间' n3 W8 y2 G' ^3 w
X_pca = X_scaled.dot(W)0 b: W! t0 T; C/ q. _

0 q' q2 Z* t; B( p# 可视化结果& F7 O, v9 B; ^5 S' |3 s
plt.figure(figsize=(8, 6))0 }3 X. o" v. M8 @7 o6 q. ~! E: @+ F
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
5 z5 t2 U" H% j( b3 p    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])/ B" @' V/ \- w" [8 ^
plt.xlabel('主成分 1'): k  @0 ~% }8 W0 d
plt.ylabel('主成分 2'): B- g3 c- o8 R9 C7 ~, N
plt.title('PCA - Iris Dataset')8 j+ i1 ~& p: N6 w) l. C* Q2 l
plt.legend()
+ L; v) s; b) q. {: \) Nplt.grid()- F7 d0 m# u; G$ S2 s- H  |; @6 z, x
plt.show()
) P" c. I  }5 d5 O' A; H```2 ]+ {8 l2 ^; o7 j9 |$ G0 S8 w
* ?5 c1 A. E7 \. N) g
### 代码解析
- H3 j1 N6 A/ q4 {( t7 L3 n. l7 y0 j: s( J% @8 P- U
1. **数据加载**:8 W' p6 j; O, ~' K% S: d0 K
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
: \8 N* ~' w7 P! o$ O0 U/ G3 [5 R# ?
2. **数据标准化**:. v7 ~8 Z1 |' G) p
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。9 U0 Q( Y, [) x5 b

4 U2 t* F- ~# O. ~3. **计算协方差矩阵**:' i- l+ \; F8 G8 |2 |
   - 使用`np.cov`计算标准化数据的协方差矩阵。7 R+ u3 C! z5 H: c- j

# W$ j! w4 q! L9 N/ X/ r4. **特征值和特征向量的计算**:' u2 _2 r; P5 v3 h( Y# ]
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
7 Q3 v/ Z  q( q
% Y3 E# S3 X% V$ o5. **特征值的排序与选择**:
/ B0 D1 |( `% |. b! h* a   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
9 J! }- n1 x: K- f# E/ ]* @# b) Z+ `& u: L
6. **数据投影**:
# T, d! K3 t$ U7 w   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
- V9 p, t" U' @" C# \8 {2 e  ?0 d* |. A
7. **结果可视化**:* f% J* M* [; a8 v- b: L4 y; M$ Z
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
2 q& t0 @- _0 c! H6 |
- Z$ r) h- H9 A4 I### 总结
% K3 |9 p1 f$ ^+ ?% ^! b- Z  ^( K3 N6 P7 @8 d( R& t
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
/ Q; H9 p7 N8 \( O9 i. O! c
8 D  k" n% U, i3 w1 V如果你有具体的应用场景或需要更详细的解释,请告诉我!
  I0 s; B- P! ~
: }3 K* i  B% ?$ k# @% W6 K. w/ N. B% |- n

; e$ x- w: ?: O& R

主成分分析算法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-4-23 09:07 , Processed in 0.437611 second(s), 55 queries .

回顶部