QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。6 Y2 Q- {- Y+ U" D
* ^* ^1 C2 W: k0 t
## PCA 的基本步骤
& F1 j4 Q$ m/ |
! J7 _! v# q& l: h" I! w( U! R1. **标准化数据**:' i* k* Q/ m3 o* u1 }' b
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。  s) G! ^8 U3 Q* v0 ?% h1 S! g

/ y( K; h# N" w3 M; M2. **计算协方差矩阵**:
/ I. p0 j* ]9 L% x   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:' o- {7 m7 t7 T% {+ |
   \[; K; @3 M9 ^; _
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)1 }% Y2 `3 K2 r+ v; {1 \
   \]
3 Y4 I1 q+ O6 K& y# s7 m   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
( w( @1 Z! T% k8 `5 m5 P, b) F/ g6 x; K+ u% B
3. **计算特征值和特征向量**:5 H  `- K  F3 l* M( y0 C) |2 V$ k
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。" J2 Q# g* }5 k2 m
4 ?9 x' L; w) \, O
4. **选择主成分**:
  ]$ R6 R" b2 B' w6 M% c: M   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
) N4 Y2 h- i' B! s5 }
. g$ s8 \5 a' }5. **投影到新空间**:
# A. _! P3 V6 V4 W2 v7 \   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。  R1 x+ x8 n" f! C. ~& W
1 y0 h; A- D* ^1 {7 L
## 示例代码9 _6 V- Q' o! x. @
9 @! A9 }+ y; k. a% U4 o
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
& |6 ~3 g+ B6 Z( o9 Q: ]8 k3 d3 [- Q
' e. b! h0 {3 V9 V- B4 F1 c```python
, N& B5 g& ~0 m& qimport numpy as np
# }; U! x! [8 A- S5 mimport matplotlib.pyplot as plt
" N# O5 O. x# ~) S0 f0 Mfrom sklearn.datasets import load_iris
* o4 E% V5 X7 H! Z+ c# g2 `7 j: ?: jfrom sklearn.preprocessing import StandardScaler
: n$ I  E; r6 E3 w& y% j2 X; r. V# \7 T5 ~) K) Y
# 加载数据集(这里使用Iris数据集作为示例)
) R& }- a1 e& p6 X; Fdata = load_iris()
1 X4 @0 m! N6 K- B3 D5 KX = data.data  # 特征数据# `' D5 f3 e3 A. Z7 U
y = data.target  # 标签5 V% x; f* j$ w6 N  f% ^
( G" e' k2 M6 {: U4 t
# 1. 标准化数据7 P/ A3 B; ~: Z  W$ o5 O8 b; L, Z
scaler = StandardScaler()
/ {# E; _# \8 j1 L- W# I6 I- C# {X_scaled = scaler.fit_transform(X)
# U+ E0 x6 Y, U9 H& Z4 T
0 z# J1 Y7 G- F9 X! g; G% {: _' G# 2. 计算协方差矩阵6 P. B  ?6 Z, `  m) B- L' s
cov_matrix = np.cov(X_scaled.T)! ]. K# W+ I; W4 L6 \; E8 h

$ q1 A- t+ ?! g+ f5 B) z# 3. 计算特征值和特征向量! _; r! ]" d, n; j
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)( v7 h# Y1 U+ ^7 A8 ^# X
7 b0 I, K5 j, Q* u" ]  i  Z, b+ c
# 4. 按特征值从大到小排序特征向量$ |" T8 R& e& p2 M% T* X. n
sorted_indices = np.argsort(eigenvalues)[::-1]; d) n1 m, }* z5 V& J& S' m7 w
eigenvalues_sorted = eigenvalues[sorted_indices]9 Y/ {5 [# s% R+ G* Q$ s5 g" ]
eigenvectors_sorted = eigenvectors[:, sorted_indices]
! B! [; k7 D6 W3 f& Q- M6 Z2 q; E9 D2 }, ^
# 选择前两个主成分
9 Z: w+ X. c- x% ^; An_components = 2
8 o2 I% \% b9 P  [W = eigenvectors_sorted[:, :n_components]
3 H3 A* R' q8 Z  X# _
1 o8 O' o- O1 p0 l/ \' G# 5. 投影到新空间
) D9 @# E+ t+ |. YX_pca = X_scaled.dot(W)
1 U. x( L+ S/ o" b# p" E  O5 v: \6 v  P. h4 b9 J  |2 A% m, E
# 可视化结果
7 v9 l  r) S! i# ?, gplt.figure(figsize=(8, 6))
$ q' @; A' U5 {4 a1 kfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):, T; @' l" W8 Q, ~$ e
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
5 `7 w  A9 ], \1 g. O# V; o! R( s9 nplt.xlabel('主成分 1')- g8 t8 k4 o4 ~. p
plt.ylabel('主成分 2')& J# k4 w  Z' D
plt.title('PCA - Iris Dataset')1 q0 \$ ?7 ^7 Q0 A
plt.legend()7 L+ f  ~+ q6 V" L
plt.grid()
9 G2 J: X+ J$ E2 W6 @4 K4 \plt.show()9 s) ^- {' l* k; w0 z' W- c- u; Z
```
) L7 r2 W" u9 Y, V1 c, y9 u9 n2 j& X6 {
### 代码解析3 ^+ L7 _; H. r6 j5 m  U
# e3 k7 f% r9 O5 c; N
1. **数据加载**:9 o3 F$ S, Z3 t2 n  {
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。8 V; g, _7 a( H' X$ ^: ?
; G# h1 x7 ]# F0 s! D! d
2. **数据标准化**:
7 d- e9 D1 L) L" n# r4 o: G   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。/ g# j. I/ P. Q. P. A

" R3 x* G; \4 a% k0 |! b! E  ?) w3. **计算协方差矩阵**:
& f5 y% U/ m; H4 N2 c   - 使用`np.cov`计算标准化数据的协方差矩阵。6 e/ ^  b" T9 @' |# j

) D4 v) `8 p* R) w0 g. S- |4. **特征值和特征向量的计算**:
$ C) w7 h" j9 u9 |3 r   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
9 w& t0 t: L. y) N5 U
* w. L! h( s% L& D% h3 W" z5. **特征值的排序与选择**:
2 F) F3 k5 [5 j3 l$ ^9 X% G: i! T   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
9 y4 Z* Z7 o3 ~" e/ R% ]! y0 Q4 M4 z, e* a& Z* V( ?
6. **数据投影**:+ X$ s# |$ ?* q2 d
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
2 z( n1 v8 C7 Q. b
8 R- z8 u6 y( Q6 g" B9 R5 }8 g4 s7. **结果可视化**:, a9 ]# q' R; g# V
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
, x0 W5 F- e& j: v1 \* C( c8 f2 H3 s- k- g0 l7 a3 \" k
### 总结
5 ?% u$ w8 y: T" e" P# A8 v9 X2 {# |& z: R( h& s4 \
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
: }7 F( @3 L/ e9 `  D6 f) x( y& {" k8 b" u; V
如果你有具体的应用场景或需要更详细的解释,请告诉我!3 ^2 r  }9 [% x) Z" f4 c& L

6 ^5 X: G3 l3 I; W8 k1 R& v
, ~: g* Z9 Z* g) d2 R9 \
) `5 d1 e: g  W5 Y( ?

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

回顶部