QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
/ F$ n, [1 H* I  R# m+ n
6 c5 C, t0 ]0 X0 T; h  C. `8 n## PCA 的基本步骤
$ z2 I- ?9 C0 Z+ M
" @  e: O9 G0 x4 z$ E/ C1. **标准化数据**:
/ P; g5 w' t, ^  E3 o   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。/ C% _! }: Z: p7 E+ ^) C4 [

/ t. h4 s% e; \) ~. K0 u1 D2. **计算协方差矩阵**:# m" m9 L7 i3 O$ f# y4 H, ~0 i
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:) p( j/ J: M5 v1 O
   \[9 S( k1 c* l" ^1 F# J
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
$ Q/ F3 R& a& U3 C- q' u$ _   \]8 c" V4 }/ I5 @7 ]! N
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
. {8 V* s7 t3 T" t& E7 ]# u% ^# U2 N, B( s
3. **计算特征值和特征向量**:' O6 k) \; ]9 I9 A' h2 E
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。) d' X* u$ `, v' h9 Y
: S% d- U2 T4 X' x" ]
4. **选择主成分**:
7 F- v# p3 Y7 D' O! G   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。! h: o8 A' a8 W( h/ a- \7 L: A

; N9 K; g. M( ]! p1 ]5. **投影到新空间**:8 \  }* n: \7 W' |) c/ P
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。9 }/ Q6 J% |3 R* ]. r
3 U' H6 o  [+ q7 x6 G9 F
## 示例代码& [. O- ]5 u2 l+ Q
9 x$ V  G7 ?: K2 i
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:$ j; F) o0 N( y. h9 d/ [3 _
- @( M  d; N+ {; J/ r( G, s
```python1 Z1 S/ `/ E( L5 N. \% H
import numpy as np) i  F9 d5 T; k: m4 U  g( ?" j4 f
import matplotlib.pyplot as plt! t" K' D- L5 m& y- V$ p9 u3 e
from sklearn.datasets import load_iris; D: d* b8 z2 }( S& H
from sklearn.preprocessing import StandardScaler' q0 L7 i- S1 K; A) e
" \5 K4 {- {# C
# 加载数据集(这里使用Iris数据集作为示例)
2 U9 q9 P+ b" E  M' gdata = load_iris()# ]$ ~* |, T5 X
X = data.data  # 特征数据
* T3 n/ u5 x7 m, p  ny = data.target  # 标签
0 M5 e  D$ u- S9 {" g$ ?& c7 C9 A
+ ?/ p  O% e: B4 C5 T( A. ]# 1. 标准化数据
) w1 x& ?1 y' r( U+ p7 Sscaler = StandardScaler()
% C# I$ U+ c) CX_scaled = scaler.fit_transform(X)/ T9 K4 G$ _3 a& a6 l
5 k/ A' T* O! W0 M4 S( S0 _; l
# 2. 计算协方差矩阵2 |- v$ b& v6 g: p: f. U8 T" C
cov_matrix = np.cov(X_scaled.T)
1 ]$ j5 U) J, }# R6 i3 D2 _  `
- \4 W! \4 n5 M! o; ?0 y( j  L  c* J# 3. 计算特征值和特征向量  h) z$ X" L" a& p; c
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
9 i1 A" s( s1 F  F) U9 p  V4 Y) d( ]; {' ^
# 4. 按特征值从大到小排序特征向量+ }9 X* d3 j# ~% P
sorted_indices = np.argsort(eigenvalues)[::-1]
) h7 E! ~  l' b4 f& Meigenvalues_sorted = eigenvalues[sorted_indices]8 k) Z% k* R% J0 p$ r% G6 ]) @
eigenvectors_sorted = eigenvectors[:, sorted_indices]7 `+ _+ v' X. R) x# z  y; e

2 t0 r2 b( i- C/ K+ X, L2 }4 c# 选择前两个主成分) |9 h- ]  m$ M3 _; o. h& {
n_components = 2# w4 p2 v2 b' p
W = eigenvectors_sorted[:, :n_components]/ c: i& b3 `  M( m1 w

  x# s5 K% C, ]) M5 P3 v4 l( g, }# 5. 投影到新空间
6 ]) @- R% l* ~- T- HX_pca = X_scaled.dot(W)
8 n( n) \# K4 a0 b( q0 F, C! h& [8 \% h' f) J5 J/ l
# 可视化结果2 c2 S. U7 N# [- M- a
plt.figure(figsize=(8, 6))  w  G# g; Z' r
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
7 W6 J6 K4 [" A    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
8 J# f; q4 |# N! ~/ a/ d3 h- pplt.xlabel('主成分 1'). M9 n# n- c" s8 R
plt.ylabel('主成分 2')
3 N. U. Z- r+ g6 ]- d. |8 Mplt.title('PCA - Iris Dataset')& ^0 |8 P+ K4 S  ^  r0 \: o) X- ^9 v
plt.legend()
0 S+ O' x* _% P1 l5 Cplt.grid()
8 t: ?, E$ N! |plt.show()
2 \8 }( {$ Z8 V```: M3 ?3 x) j& J. b9 O

) H' q( R7 J- ]# S7 C$ t$ k### 代码解析
! E9 k. d) Z9 Y1 |) \, g. K: Q
3 m" n  r- t( i4 I1. **数据加载**:
& G) h# e& L7 Z  ~# |   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。, |/ T+ s& @& Q- b5 ~7 H

2 z. A3 a, G( s2. **数据标准化**:
2 }9 n/ \; }, h" I   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
. |# r1 Z3 e) K/ J8 D3 [: t  {8 n' k! q* A- v2 p, h+ l
3. **计算协方差矩阵**:
6 ?6 K7 y' I$ A, U( b( y   - 使用`np.cov`计算标准化数据的协方差矩阵。
  G1 P& F& y. Q5 U& M$ X) k8 Y% P8 q1 `" e  n2 Q; S
4. **特征值和特征向量的计算**:
' A2 s1 p8 O6 s2 ?  N4 v   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
9 @, r: h# g( _, o: f3 N/ O* G0 }$ n
3 d4 v2 z3 S$ y% A( s) s0 r% V5. **特征值的排序与选择**:
# |% c3 y/ M# Y3 d9 c) T! _   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
8 F% M9 D6 @' y! |- y6 @- K( _" Q; V* P3 Q6 I
6. **数据投影**:
2 Q# e! B. V" O8 ~% S* b   - 将标准化后的数据投影到新的特征空间(即主成分空间)。' e9 ]4 j7 C2 o" Q1 L2 ~
7 q4 q" o( G0 E8 x
7. **结果可视化**:
* j' ]9 Q: S1 g: C   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
& Z8 }7 Y. W" q9 y5 e: w9 N/ n2 M8 K
### 总结; F9 N6 m9 S5 Q, A# x7 g+ ]
: r' w& O9 m$ f) n
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
: o0 J, b: W# K( @
% c; i- c9 l( v$ {' W3 q8 Q0 _如果你有具体的应用场景或需要更详细的解释,请告诉我!
$ b* ^6 {. D. `6 `% @& i$ G; w- c, s" ]" [

+ p( _3 p9 Y7 V( K  O: m* y+ r/ y3 b
3 Q' d, r2 e. O( u9 _! }0 _+ D

主成分分析算法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, 2025-6-25 21:01 , Processed in 0.464620 second(s), 55 queries .

回顶部