QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
) w5 e- p! u$ i5 K/ L3 m* k( W! u" z6 K$ O: T
## PCA 的基本步骤
8 a8 ?  n* w6 @( `7 e2 \
( z: p8 }# G9 g% ~& k' Y1. **标准化数据**:
4 p+ l& }4 V# u, ~- v4 ]1 }$ M2 @   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
- O2 D9 [8 W+ s7 i" p, j" p0 L9 m7 K8 d& g8 l- r. u( ^+ c) z1 h% j% z
2. **计算协方差矩阵**:" V9 _1 O- c. V+ E, J& I
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:2 {- e: j0 T1 g
   \[0 D; ~1 k: {' }3 ^0 d, s
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
$ L6 s: _; S6 U; b   \]$ A6 y% G( [$ |3 B" {
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
# x+ U: b7 W0 v& O
9 G- [# ]- I  @( P3. **计算特征值和特征向量**:
0 ]6 b$ K2 K4 m1 A9 e& P4 h: M5 Q   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。7 ?% B+ z5 o2 y- D7 q, _/ c; }& D) z

" s4 s* G' }, ?; B2 X# Q* @4. **选择主成分**:
# ^( K& D% {% ]. B1 T. I   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。( _, V$ J2 Q, M; p4 u! V
1 j, Y% P) v# i
5. **投影到新空间**:
$ A6 z0 h7 I# q! F% F0 e   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。- T. G. U1 m5 E. I& j9 b
/ [+ O) F1 p9 \( `. N
## 示例代码& u. g7 K' K2 i  g, v

( k. Y; K! V$ p' K下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
: j6 i" ~" j( Y/ q; p: z, C4 T% ~+ _. y" c) b# l
```python8 e6 ^3 f. V6 \
import numpy as np
' p7 K3 I, ~; F; |* D8 l, Uimport matplotlib.pyplot as plt8 z6 _' E4 n6 S2 B
from sklearn.datasets import load_iris
5 w( B1 w+ N: Y' \" B3 Mfrom sklearn.preprocessing import StandardScaler3 r$ {. C. D! f: g6 ?
0 m& T, j2 p5 K0 `/ E- v) \
# 加载数据集(这里使用Iris数据集作为示例)
, \' F& C- O/ o* n% q. W& @data = load_iris(); i* o0 H( [- S% A
X = data.data  # 特征数据% L2 j7 s# x+ l; I' c% z
y = data.target  # 标签4 U1 |) \  g5 z" ^0 N# @0 _8 V
% l4 e) P: L" x/ W- F* E# A
# 1. 标准化数据
6 [0 B7 b) T7 K1 i( z! D5 h7 h5 f. A+ Vscaler = StandardScaler()
! @. F5 `( ?/ C3 I2 g" XX_scaled = scaler.fit_transform(X)
' L6 M( b  ^" b7 b
9 W# B, l6 Z( N5 W3 ]5 p, j# 2. 计算协方差矩阵8 j3 {6 h5 f  I) d
cov_matrix = np.cov(X_scaled.T)
: ]( }% }$ Q) ~2 P1 W& x) c$ K! ?0 A. E# Y5 Q1 z( q
# 3. 计算特征值和特征向量
, g3 L# I5 G5 }4 K3 c. I! Y0 feigenvalues, eigenvectors = np.linalg.eig(cov_matrix)" B3 F+ }1 b# F+ O: K
8 u$ n1 K# S6 l5 j2 ]5 ?1 P
# 4. 按特征值从大到小排序特征向量
5 @% E$ ?6 C/ Lsorted_indices = np.argsort(eigenvalues)[::-1]
6 O* k. g# Y+ V$ q- neigenvalues_sorted = eigenvalues[sorted_indices]
  W5 z1 g1 y0 g  k; z" l& ieigenvectors_sorted = eigenvectors[:, sorted_indices]
7 u( w& ^7 x3 J6 A9 m) O# S& q( \6 {3 E3 j
# 选择前两个主成分
* ?! n  [  f$ un_components = 23 R" [. q- P" w1 h9 t
W = eigenvectors_sorted[:, :n_components]0 s" _* c! @) G- v& J1 b# h: R
6 |: N, v# ^) k5 W8 L; A: n
# 5. 投影到新空间
( v/ ]# ?3 \# o, B6 S2 z/ Q! o% zX_pca = X_scaled.dot(W)& E6 f+ Z9 x& L/ ]7 X

) R* H( y2 I  r( |" O* c# 可视化结果5 l1 [1 O8 N2 t$ X- \6 q; j
plt.figure(figsize=(8, 6))
, z* e% q: d4 m6 {; i+ `2 D" Qfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):) M9 P7 j, |; Q& R& J% F' b2 j
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
4 s! g4 M4 [4 D6 {plt.xlabel('主成分 1')2 ?+ m+ w2 J1 a& a* x$ h
plt.ylabel('主成分 2')4 y( G1 ]1 `, \
plt.title('PCA - Iris Dataset')
; d0 N6 u3 L; `+ n2 a7 F+ a2 Y; dplt.legend()
. n5 q- q4 P' J+ Iplt.grid()
) b2 }- v% K' P. Z. nplt.show()
5 S( G( @0 X- k; M. v  t) \+ n```' j$ d' ?6 R7 ?% ]" S3 ?8 w
, `+ M$ g9 K  ~! d$ X, J( {' q
### 代码解析" c- l. s; E0 v
0 I* D$ d4 {. R& s# }
1. **数据加载**:3 E, a# ~/ X8 R+ i% \% Y. E
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
1 h; \0 H9 f" `  r5 |! f7 Q* U9 E* S2 U- f: x1 b" y1 H
2. **数据标准化**:  q' e* B: Y, ]
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
* O  n' J  `. [) G* \" r
1 B6 R( [$ d! L0 ?3 s) J3. **计算协方差矩阵**:
: G) X6 d* n. O! l' D' ^" O8 n   - 使用`np.cov`计算标准化数据的协方差矩阵。, [. @( C3 v4 F; r$ W' F5 C

1 l6 {3 d3 A: T" P  O4. **特征值和特征向量的计算**:
, [4 g$ k8 p2 Y1 F- e$ H! X9 Z   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。) p, u' S& y% J: t

; ~" y1 z; e' w  |# W' I0 y5. **特征值的排序与选择**:
3 H4 H7 V! L! J2 `/ R+ X. Y   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
; P" i4 o, J6 A( `$ _( Y+ Y" j) A% ]6 k% r7 A
6. **数据投影**:
( L! u5 H: O+ R3 L6 l/ i   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
3 U9 Z* a+ z" i1 J9 O4 {
3 L7 T" ^- @- [/ e& }1 a5 w) |7. **结果可视化**:
. n$ a0 n# ~; X" ^   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
& b- P6 h& S2 S) [/ v. R- r
4 C5 m6 `3 @0 D$ H+ G9 ~4 v) K### 总结( Y- l( x, m0 p9 }+ }! S% d6 P9 R4 A

' q$ }/ e- Z% t% y% qPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
3 W8 }6 U' ~! z; s7 a0 u$ v
2 D9 g: I7 s* |' d+ o如果你有具体的应用场景或需要更详细的解释,请告诉我!
3 R+ Q2 S% E: Q3 ?7 s4 g5 n
; {2 ^3 {0 k4 T1 V) g3 N3 u5 B- I
* D9 M, X  T2 ^+ b" C+ H# d+ V1 ?, P$ n7 r4 h6 ~* R8 g4 N- \2 s

主成分分析算法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 17:27 , Processed in 0.466093 second(s), 54 queries .

回顶部