数学建模社区-数学中国

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

作者: 2744557306    时间: 2025-1-13 17:24
标题: 主成分分析算法Python代码
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。0 i: l8 `' T& |* O! S

( j/ M6 I* O) C8 |## PCA 的基本步骤
' g8 M0 B6 N/ `+ q
2 i7 s, @9 s" e0 f. p8 |& e1. **标准化数据**:4 E, I$ t0 v+ y# ~# i/ ~4 x8 W! ^
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
5 \) ~+ ~1 B, g* \6 g7 }+ P  K; v& k2 z2 }9 v4 R
2. **计算协方差矩阵**:
5 R* h  w6 U2 V* e8 s4 i   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:6 b/ R- J# r! a$ I
   \[; B9 s9 x% O( [6 |; w' l
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
9 O. l. P$ ^4 `( u3 {: ~' e' L   \]
* @' m8 x1 Z6 K0 y   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。0 M: ^& |7 c0 R# V
; `7 E3 z5 |' S5 h# T; {* f
3. **计算特征值和特征向量**:' i  O6 L+ P0 x! T* D
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
; i( A- j0 @4 c8 K& ?- W% T8 E2 _+ c, |# s# z+ f
4. **选择主成分**:6 x* s, D5 ?& X4 d9 d+ U
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。1 O5 L% J3 o5 J" J% S5 |
$ _: t8 I6 G/ z0 V' g3 S( ~. x6 B
5. **投影到新空间**:
' [. S3 q- {% E5 v1 J   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
+ p' ?+ F* k; V: T! l* l+ t% C4 \& G' X9 }5 h
## 示例代码
% m- s* N0 @. o+ h/ k- i- n" Z8 j! W7 `
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
! c5 t2 s$ V% U6 ^$ q7 k+ j5 K7 y3 u8 `  Y* p+ L
```python/ M% L5 }+ i/ r2 `3 `% K
import numpy as np) E9 B- {1 p" K$ t1 i; N
import matplotlib.pyplot as plt" S: ]! l0 A/ Q8 ~. a
from sklearn.datasets import load_iris
5 V' l2 M$ v1 r4 F4 S5 ~1 ]5 _1 Mfrom sklearn.preprocessing import StandardScaler" @; K( X: e; q+ @2 c  ~5 G
* L4 Q+ @" C$ d
# 加载数据集(这里使用Iris数据集作为示例)# _/ `- |9 D8 c0 V
data = load_iris()
: P; Y( |) q/ ]# c! l2 W* gX = data.data  # 特征数据: g2 N  H8 T! m1 B$ K% K) S$ k
y = data.target  # 标签/ v! z) {$ u3 w/ N0 C7 M* a
+ m/ Q  H# W% I9 z
# 1. 标准化数据4 u4 V9 Q  o4 ^9 k0 w! x
scaler = StandardScaler()7 H3 i, Z4 b" \. S: c6 o$ i+ |: h/ }) X
X_scaled = scaler.fit_transform(X), E- d' G3 Z$ T8 W. |& @( Y" ?
% m* ^* w* @+ K0 h& Y
# 2. 计算协方差矩阵
1 f& A5 Q* Q" [5 ~0 d* R0 Scov_matrix = np.cov(X_scaled.T): s3 Q6 o! l( {# |& N
& r% w# M1 |" w$ l! h; M6 E/ j
# 3. 计算特征值和特征向量# J5 r5 T! O" @2 c
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
8 ~6 N& F% ?0 y, |8 G
( E: ]& x- p/ J( e$ [: q# 4. 按特征值从大到小排序特征向量3 j$ p" H4 V: ~# y' q
sorted_indices = np.argsort(eigenvalues)[::-1]
% k4 D0 J# w5 {! r. R; X+ q. T. neigenvalues_sorted = eigenvalues[sorted_indices]
5 p% x/ h, ?7 ]. b- R1 q. ^eigenvectors_sorted = eigenvectors[:, sorted_indices]3 K; \. ~3 X6 ^$ b1 x( j; ^. V3 v# U

% c7 k3 n! ?( T. E4 J0 f; D8 i# 选择前两个主成分( }+ i$ M! W' W% ]* l
n_components = 2
% ~1 H+ b( S: U/ C* k# m! ^W = eigenvectors_sorted[:, :n_components]: l$ p0 i% v- u

! x0 v2 d+ c! U2 y$ }& j# 5. 投影到新空间
  C3 Z" D; e8 {! TX_pca = X_scaled.dot(W)
. b; N/ i; U( p; A
& a& M9 j7 W/ O  l# 可视化结果
# I2 C$ I3 v5 o& Q/ r4 ^plt.figure(figsize=(8, 6))7 }" A0 H$ R4 M: G
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):2 K+ [* i4 _8 n0 P% L8 {
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])( i6 o5 U) }& N7 E$ N/ m
plt.xlabel('主成分 1')
4 W3 Q4 ]; m/ ~  L/ V) Splt.ylabel('主成分 2')
: \3 z. m+ c/ [) l' H3 Eplt.title('PCA - Iris Dataset')
) H  d7 c" T$ Y+ B9 p1 U+ I* splt.legend()
5 g& A& O. R5 p+ f6 ^plt.grid()
* P1 n' v! {0 R, A# A: tplt.show()$ O) l# M" j' N0 j* S
```9 E; @' V' J. {5 {
% V  ]3 ^+ J: M2 L, T
### 代码解析. i0 G2 t" o7 F6 R! I, P0 I! U

3 A, v7 X* M2 c3 A" |6 @1. **数据加载**:
# D1 T0 k# T4 `9 W- ^2 @   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
" ?% _. Z/ i( |9 D# H8 K+ B/ C. Q2 y! u" t- W6 ^* c
2. **数据标准化**:
! e; U) T4 c: O; D   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
3 F* i8 U: e. f7 O+ W8 q% r4 j2 \# q4 T- m3 y) n; n+ X. y: n
3. **计算协方差矩阵**:
$ k; i6 [9 f1 \8 i; _% v* b   - 使用`np.cov`计算标准化数据的协方差矩阵。7 I- V# q- b) P+ W) V" p! |

3 Z8 ^: L( `0 Y4. **特征值和特征向量的计算**:# y# X/ C" H1 b; b; p: I" R
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
$ `- T5 ~1 X! A) @3 Q- ^" }+ }" A
& \% N, w/ c* y& o% T5 w9 z. ]5. **特征值的排序与选择**:. x# l5 `  ]8 P0 ^! B* |; S1 ^) L
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
6 f6 z3 Y% J+ T  c: O3 ~' \
5 N) ]$ l/ a( u! S6. **数据投影**:7 q. m3 O+ D7 o1 T
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。2 T4 n* O( i, X/ K: y$ O; o/ ~

3 m4 e; Q) n, o6 W7. **结果可视化**:4 `6 v8 G6 z, S
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。- b% Y1 X; O3 ?0 K6 t
+ d% i( O6 E# v/ j1 q6 ?2 H! m
### 总结
5 L/ k& d/ G! B6 k4 L3 l- B+ c7 T" l% O! `! V
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。. j6 H8 t& m7 C) u8 W- X

$ X4 D  R6 z' @  }/ v1 W如果你有具体的应用场景或需要更详细的解释,请告诉我!
$ ]5 C+ Z- r+ U$ V
8 G' D0 J) k) w2 ~& f/ P/ A
  k% t; h* G! G$ n( a0 K& R. b
6 F+ ?9 D: U9 O

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

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

售价: 2 点体力  [记录]






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