QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1171

主题

4

听众

2781

积分

该用户从未签到

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

* F; w$ e: a0 B& ]6 ]## PCA 的基本步骤
. {, h2 \" j3 m  \3 j& A
$ y6 j) A# }& `& d  n1. **标准化数据**:& R, z; E* P( v2 D) U6 _
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
3 ?$ x! J9 m/ h1 x. r6 H3 M* \! j& A0 n
8 N$ J2 Q. ?2 L* H/ c2. **计算协方差矩阵**:
, \; U: M$ e% A3 R1 D; X   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:7 Z0 ?% ]! K) I8 A% C( v. ]1 d
   \[9 f( Q: k; R1 L/ x% O! V6 |2 p
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)8 E: f) G! O! Q
   \]
2 A) n, Y; ?6 V% R9 N% e- J" l2 n0 `   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ k$ f& D: m7 k  E! L0 }( Q" R% Z
/ C' k3 G8 @$ Q. j. a
3. **计算特征值和特征向量**:9 c2 B: }1 z0 M; D$ N6 @4 Q
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
0 ~/ |6 o: j0 v$ p% W( m( y$ f; s( {4 k6 M/ N
4. **选择主成分**:" P3 h! T# a( T5 c5 L
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
) w; G/ a" y7 F4 B# `) S- h; j" b8 w. f) t% P
5. **投影到新空间**:/ o& r! Y9 |) A6 Y% |
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
& j# n( @1 L8 y% _3 o6 r
( Q. b; V! `1 U( x3 P## 示例代码
4 q  d+ n& E' p* J" j: M1 k! a- U3 {8 \! r& U' z( `
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
( o$ d, s* M8 b+ q8 x6 J! }7 ]) S/ u1 p' X, \4 {& c! f
```python
$ [3 l8 k" x1 h4 f+ C9 Simport numpy as np
, R! a1 M- {) ~- Kimport matplotlib.pyplot as plt
3 n8 O: [2 X$ K1 v! Ufrom sklearn.datasets import load_iris
$ r/ @5 ^9 u5 O3 tfrom sklearn.preprocessing import StandardScaler+ j( @: u2 W5 Q; Z. _

( f% u$ m+ d, x8 v: u3 |' X* \# 加载数据集(这里使用Iris数据集作为示例)0 E. Z) w% q  R+ S8 z  h4 e5 _
data = load_iris()
) X  w4 e1 m' Y+ L0 @X = data.data  # 特征数据6 p; f" }1 U, v' x+ X
y = data.target  # 标签
$ L1 j0 S& r. F2 y2 ]5 a9 {4 n6 B$ h5 O( ~& m
# 1. 标准化数据' f) b6 L, q; G4 `# z2 a4 a; y
scaler = StandardScaler()
: ]# x! C6 M, ^! KX_scaled = scaler.fit_transform(X)( Z: N5 I, X0 Y3 H! E$ c% D, H
4 a. B) Q6 Q/ t" \1 w( f' M( f
# 2. 计算协方差矩阵& M: E8 a' {7 z1 A& e
cov_matrix = np.cov(X_scaled.T)8 @9 K8 P6 l; T& @5 {
6 t/ C. K$ J* f4 D0 p* H8 U4 w( v
# 3. 计算特征值和特征向量5 v- I3 C$ f( _  v5 s( E. m) {
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
8 J4 r" t. R/ t0 U5 l7 a! C
& q7 e- A  @$ H) C% _. s2 _+ O# 4. 按特征值从大到小排序特征向量7 \: t( d: i$ R- X( X
sorted_indices = np.argsort(eigenvalues)[::-1]$ s# [; h6 {$ e/ {: f( Q
eigenvalues_sorted = eigenvalues[sorted_indices]
, j8 l; }+ ~, M1 Q4 g% W# F( ueigenvectors_sorted = eigenvectors[:, sorted_indices]
' M- c) S# S2 [9 M
: c, Q' Y+ @7 R0 b2 {5 J# 选择前两个主成分0 E0 I+ e! L; d" A; Q3 z: `
n_components = 2
& R; U9 n. W- O! sW = eigenvectors_sorted[:, :n_components]6 o, t6 J/ w7 V( R# Q1 q4 n
0 X9 t; p# u) b4 s4 \
# 5. 投影到新空间; M- E8 v2 @. F$ ~
X_pca = X_scaled.dot(W); t2 {" U8 x! v& l5 ]" i4 P) V5 E# h/ o
) V8 ~& W% Z0 }5 f2 v3 L& A4 S
# 可视化结果8 c" W3 [1 a1 }3 H, C
plt.figure(figsize=(8, 6))9 p; _2 t4 U4 k: m4 M7 L
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
, M7 y5 i3 q. D. ~    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
2 R" A' A% ?# v/ u+ N8 ^/ a7 splt.xlabel('主成分 1')
) \* a' \( k7 V, t! Eplt.ylabel('主成分 2')
6 K& w1 A0 c0 g+ s4 Vplt.title('PCA - Iris Dataset')0 t. G. k; K8 N0 p- H4 {
plt.legend()* O( p$ \6 M- g, e1 P( i6 i- n' v4 z
plt.grid(). n0 ^# f& G5 c4 o+ D* U6 c/ l, p/ q! u
plt.show()# }: h5 n. X4 p" J0 p" _& \+ {
```
- G# C3 s' U2 O5 N- O# V- w1 Q: Q0 i
2 I$ j% {! `/ g( U# W### 代码解析* x. o* e8 o) u
, o1 @8 o/ D3 \& W$ x
1. **数据加载**:6 l  W. U- E7 d1 a6 s
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
$ a+ b6 e: p1 @$ r4 _, X8 o: `% k
2. **数据标准化**:1 N7 Y' D& M5 I, z
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。% l+ l4 ~% s; u" I5 u

9 w9 v9 Z; ^  L$ Z& A& z8 F3. **计算协方差矩阵**:
8 I. K& U6 {8 \6 h/ ]   - 使用`np.cov`计算标准化数据的协方差矩阵。
8 B4 ]) U( D: k" H' }
  P+ p- i+ ]6 s4. **特征值和特征向量的计算**:
4 @% Y. I6 B. l* m   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
% e: b! Z8 c2 b* n6 w$ z  _
: _1 z: h8 y% a5 ^$ e+ c) S5. **特征值的排序与选择**:
1 E- M6 C3 G  O+ e, f4 x! _   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。+ q7 [( q- C: J4 p- b* ^4 _
8 K$ z" O- [5 H+ K3 \2 s
6. **数据投影**:" E- K( S' U6 p% g3 i/ a* j' h
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
" j% l* I% I9 X: l+ N" G8 ~. O3 k& R1 G
7. **结果可视化**:
1 }! ^" ]7 Z7 T6 E2 N$ |  D   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。0 v; l1 e; w- l+ X, H+ r) D

4 v* h1 j9 t; s0 E0 T" D. Y3 @6 ~) r### 总结9 w" o  V$ O& ^$ p- W8 c% Y" a  x* n

9 @7 _' w( l  @# d! K. \% fPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
& E9 G1 r1 g0 v7 q
$ B& N$ X9 P) A2 y0 F如果你有具体的应用场景或需要更详细的解释,请告诉我!
9 C4 t0 H' O+ q/ t4 N( U, @# @4 o* Y6 c2 e1 e

9 c* o1 s& q1 s. ]$ ]; M5 M% ~5 G' H: r, p# E  h, d+ h0 i9 `. 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 03:32 , Processed in 0.384331 second(s), 54 queries .

回顶部