数学建模社区-数学中国

标题: 主成分分析算法Python代码 [打印本页]

作者: 2744557306    时间: 2025-1-13 17:24
标题: 主成分分析算法Python代码
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。1 v, H# F& }% z5 b# Z+ |9 r
7 e0 E2 j4 K) w! C; `$ _7 q
## PCA 的基本步骤
) Y/ e4 _  `' M1 E
1 Q( t! R7 _1 w% v* I1. **标准化数据**:( V- S0 ?( k, N3 t
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。; q. n# d0 i1 @) C

: G3 K( Q6 j, o* v4 a2. **计算协方差矩阵**:
9 o" K# d* N' h* z, k! F   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
& ?7 y. H0 F; {   \[$ B3 Y% [) W# ?  p
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)+ F+ u+ k7 K* @+ f5 E) r3 l
   \]8 f2 S3 {6 |! c4 F
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。+ _8 ?. t: P$ I' E6 \

% Q) h! {* n$ @3. **计算特征值和特征向量**:+ Z/ h; a* C# f& m+ `6 N
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。: M3 M2 ^: e1 N* X

# S. q. ^! r# Q1 V4. **选择主成分**:
6 d7 E1 Q+ s% u7 M   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。: O* d9 b  I) H

0 P, C# R$ I  Z) h7 Z  X0 ?, o( u5. **投影到新空间**:
; `7 \* X) W: ^0 w0 s   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。2 ?2 b+ g& [6 M% y# W7 J6 F
& n8 `/ K- }! \
## 示例代码
" B3 z4 R: }( l- Z/ q* M+ C
  K/ a' }) w$ e+ O, A6 C下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:% U4 C3 R% Y3 w% U

* W6 {* l/ \9 E! p```python0 y; Q1 T' M) {( f. v
import numpy as np/ H& a0 N0 x! I+ E* S
import matplotlib.pyplot as plt
. A- X9 f8 I8 t) E9 I4 Efrom sklearn.datasets import load_iris& c$ q$ \- m. u6 l
from sklearn.preprocessing import StandardScaler% Z8 N; r) Q, q. p
9 P8 I* O% {  M; H
# 加载数据集(这里使用Iris数据集作为示例)& _5 d, o6 `, s9 `7 n' {
data = load_iris()
' h+ Y  T- F2 J7 EX = data.data  # 特征数据' i% u( o4 }0 ~# L
y = data.target  # 标签, y% ]6 `$ V7 _( t- g4 V' m

( C$ i) v) ~- n) f3 j  P2 |# 1. 标准化数据
% l+ I! b  b& p, [9 ~scaler = StandardScaler()3 w% J! i! e* N
X_scaled = scaler.fit_transform(X)( w- s% @2 v; D5 A; z/ j. G3 {
; Q' e2 ^6 G; t3 D$ h! o
# 2. 计算协方差矩阵, J6 b: u, `7 Z' x7 C
cov_matrix = np.cov(X_scaled.T)
) m$ p1 f& b6 H& @; B
' J, L" o' L; E" v8 g. x. f# 3. 计算特征值和特征向量2 F2 u5 `" L4 I. J+ M. n
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)( D9 j: {4 e/ q& b" \

+ N  B  @2 u% ^  S8 p# 4. 按特征值从大到小排序特征向量
* u# o3 f/ T9 O- Osorted_indices = np.argsort(eigenvalues)[::-1]
2 F5 Z! u; e' Y. D$ o; Teigenvalues_sorted = eigenvalues[sorted_indices]( N8 U! F' `& ?  b* k* I' H
eigenvectors_sorted = eigenvectors[:, sorted_indices]0 X6 w2 x, ~# _* k

  z! L3 R$ S8 F. w+ H# 选择前两个主成分
+ [6 x1 z& j" |7 ~- Gn_components = 2
7 g1 q4 F5 W6 jW = eigenvectors_sorted[:, :n_components]2 N3 K8 |9 K0 e; X& ^; C- \

0 @$ U+ y- Y, M' F' ~9 d# 5. 投影到新空间
! F' t% m. p! M/ S" z$ I) UX_pca = X_scaled.dot(W)
2 @, a/ E) N! m8 a- B( G; f4 n2 j  j9 x" Q% W3 p  i4 @1 N
# 可视化结果
; I- g4 z& y. ]9 Q% y4 Iplt.figure(figsize=(8, 6))
0 C( i( m7 V- Q# K/ @for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):. S) {9 B) I( @4 Q/ u
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
% _: j: q( h0 w) T' oplt.xlabel('主成分 1')
, P+ ]* t" U: R5 ]$ }plt.ylabel('主成分 2')
1 w# q# t2 C  U3 o* [1 k4 k' C6 S$ Kplt.title('PCA - Iris Dataset')
* v: F2 s* X3 wplt.legend()/ n5 u+ h: j' m
plt.grid()
* K: }% N  Q2 Wplt.show()
; `! m0 Q) x* C$ G" M" i* C. A```
+ p. P0 Z6 m7 f- G2 Z9 |" `* w) v, W& c: s
### 代码解析+ G, K% W- H8 Q: \( v. s/ |

5 J# y, [: Q2 N1 W9 M- w1. **数据加载**:
. E9 S  T" O( C4 \, t   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。+ o0 Z3 p  z* }% d- m8 r

5 S0 J5 D3 v" O  ?& H2. **数据标准化**:
" ~, B3 [5 l2 n1 f' \. L   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。5 \9 V8 Y: x2 q$ l

- ^* |1 @& y# Q% U( B3. **计算协方差矩阵**:
2 b8 {3 j8 d8 f6 Y& T) G   - 使用`np.cov`计算标准化数据的协方差矩阵。
4 w6 S3 r0 j, O* A/ x
1 w, r" r. [! i) {( O9 \: Y4. **特征值和特征向量的计算**:4 W1 k+ N) k6 ]5 U& g
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。6 R, M; z. u8 n6 Y7 c

+ G* Y, r) \3 ?5. **特征值的排序与选择**:2 I, A# p) R2 p7 n/ `( [
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
. y0 T) e: A- d6 B/ M, _6 N7 B' p4 T4 I$ Q9 u2 t* A# n. G
6. **数据投影**:
. j, i" Q+ R: L: y8 F5 C   - 将标准化后的数据投影到新的特征空间(即主成分空间)。. F, q6 j! [' }  X

$ t# \7 X4 b, T+ L: A7. **结果可视化**:
( e& k6 K4 O, _. ?. g   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。7 Z& f6 L6 \* ]# H& \

& }( C4 e; o/ K) K0 _1 J### 总结
, w, s7 U) Y+ V' ^/ J6 Y- _( r: ]/ X8 p
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。! _5 n$ U4 L0 b! j7 c  j

0 g2 n& a0 h* `# Y7 T* _7 U如果你有具体的应用场景或需要更详细的解释,请告诉我!! t% i. _6 g1 J% x7 j( o) o5 ~3 Y

, d  N- Q) v* P/ F, l1 Y* A$ j) [2 p9 F

" O2 y% z; N( O$ m

主成分分析算法Python代码.txt

930 Bytes, 下载次数: 1, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5