数学建模社区-数学中国

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

作者: 2744557306    时间: 2025-1-13 17:24
标题: 主成分分析算法Python代码
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
( h$ i9 y9 K7 F' ~: i
9 p4 I6 \# Z! [6 Y( `## PCA 的基本步骤- V2 O& z' r8 b% H
( F# M6 B+ {  O( u* x
1. **标准化数据**:
2 o! s1 G8 H! @3 l+ x% Y+ a; n- q   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
; |: Y7 \( z" ^0 O2 a1 y* c: s9 \& ^+ O
2. **计算协方差矩阵**:
# B/ j; b% \- n) n, \   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
8 r; H+ w& A$ v* O0 E  `$ t1 A  Z; ~  ?   \[
* H3 v% D( l" |9 p( L0 y) |7 J# H   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
" X, L: W6 v# A. v. {$ N9 @# C   \]
) y) B. L; C" Z6 v   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
1 `) }) s% X" P( E( [
* X+ h) ?" B: ?7 B3. **计算特征值和特征向量**:
! i  O- y5 F! e; f   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。6 Q% F# o+ ]' O! Y4 S% U8 W
7 W4 \( H' T" M6 U- b5 z! |
4. **选择主成分**:. {& H! e% H6 f- U8 N+ v+ g
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
6 n% d! t/ c% x& ~7 c
3 p: H% A& x; \; o( i0 L) K5. **投影到新空间**:1 y0 d* y# V7 U4 B+ w% w
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。" W9 a$ R' I/ ?* \! V# w
2 O9 V, f! o: r
## 示例代码4 M  v0 I% `0 M) u

$ p' |4 Q% _6 U+ W% c& W下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:: W. F$ ?; C: d, t

, a. e! F3 T% c. T```python
4 }9 s2 c; o( g/ {, f6 Himport numpy as np
  s% _- ^3 s, a! ^' O3 U& g0 rimport matplotlib.pyplot as plt
9 D$ X: B( l! I' j! v/ U3 d% Ofrom sklearn.datasets import load_iris
( V/ h. A( X8 _4 `from sklearn.preprocessing import StandardScaler
! X! D7 G& E$ O* U
3 R" p+ J( [- P; S# 加载数据集(这里使用Iris数据集作为示例)
0 Z' h8 f6 s7 ddata = load_iris()9 p4 J, @1 _) [+ N
X = data.data  # 特征数据
! h* J! ], b' |8 ~  K+ S( B, Z, Cy = data.target  # 标签* s  E* }7 s- [6 w9 `$ D

9 T" b% N5 W( |3 o- o2 ~) f) ]& t, B# 1. 标准化数据1 U" t7 q' ^2 t. [" c- ^
scaler = StandardScaler()
$ O) o$ T6 b2 _1 fX_scaled = scaler.fit_transform(X)
! L. R/ s3 }- R6 G, a
) S% r: q' n$ ^! Q" p' y6 W# 2. 计算协方差矩阵& Z. [0 k' d- P9 U1 |7 B8 m
cov_matrix = np.cov(X_scaled.T)! d; m; c, H/ q, k! J8 q
) q! C. S; O' e* v9 }7 V0 k
# 3. 计算特征值和特征向量1 z5 m8 E. F" k4 s7 i' M% h  {8 u+ |
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
0 k8 k$ [* ]8 f% y; J9 {+ a% \# z9 f5 q$ G" w( ~/ z* k6 |
# 4. 按特征值从大到小排序特征向量) U2 v3 l. A7 ~; j
sorted_indices = np.argsort(eigenvalues)[::-1]* ~, f0 d: U! X- S' `
eigenvalues_sorted = eigenvalues[sorted_indices]
% j" j: S5 Z% ]1 d) feigenvectors_sorted = eigenvectors[:, sorted_indices]
) X* y, e* V* u4 X5 k) |  y
9 O. A9 F. G1 R+ ^6 }$ ?5 j# 选择前两个主成分3 s2 z$ l  G9 w' @. n! t3 a  {- D
n_components = 2
5 c, T: J3 r6 p- GW = eigenvectors_sorted[:, :n_components]! C. ~% z* m' A$ r

0 `' s* o$ _4 ^; a# 5. 投影到新空间- y( n' h* `& q$ m1 a1 X) U
X_pca = X_scaled.dot(W)
4 I0 m" e* [) o8 e/ B! ?
+ Q! r, e/ q9 ^3 E- A  M# 可视化结果
4 K. \* }5 L, o: }; k# V3 lplt.figure(figsize=(8, 6))% y8 o: J8 y* q! D
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):8 Q3 K9 y, S) B/ a' k& N
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])+ P/ V( c& R  u0 _) z
plt.xlabel('主成分 1')
- l/ E# k) }' k: o; dplt.ylabel('主成分 2')% q3 \1 w" q5 L% z- u+ Q( f
plt.title('PCA - Iris Dataset')3 \, i  ^. `+ Q) }3 N8 T, G
plt.legend()
3 [8 q- `2 w: K6 c9 @  splt.grid()
# G2 t  a1 T3 Z1 Z, b1 m# y6 P8 uplt.show()
2 {. R' s5 I) f. \* L9 F7 t```
1 a2 E% N& N+ O; F0 i* l0 S  _# `, R7 y$ f" D( P
### 代码解析+ ~$ x' l9 a; ~: u& w0 j

* ]& t+ S" p  i/ T1. **数据加载**:
' e+ ~! t$ h  l1 N6 t& F8 ^   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
, d( _8 b$ M" q$ n3 @" c( o. ~3 v
2. **数据标准化**:; M+ f/ O1 a8 K/ m& E0 {$ t0 A+ p- ?
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。" C; T' k. ~5 j  ?2 f) d
4 R! F* d9 }, p
3. **计算协方差矩阵**:! l. H% |8 M# ^5 N6 G, f+ l& ]- ^# w
   - 使用`np.cov`计算标准化数据的协方差矩阵。, y; a0 N$ q* }
3 S4 c; |1 D$ O2 Q* w
4. **特征值和特征向量的计算**:
7 n3 }! |% v, x# \5 Z5 A1 D( ]   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
( p' \2 N- O& V& [
$ o: h- G8 }! ~3 g+ Z* l6 B( o5. **特征值的排序与选择**:
5 t9 T0 [1 J' R1 r* O2 H( H   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。4 Z$ ^$ \# ]; L9 R' h

$ p( ]6 x- P4 w9 [: j6. **数据投影**:: \- c: a; k, p  i, o; D  J/ w
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。+ s, N! u: `# m) ]! L

' _4 X( ]$ E- X( }6 B) [9 S* j7 i7. **结果可视化**:
# {) L. |5 h4 h6 V   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
% f( s8 @9 O6 A0 @- x& l8 W5 G
7 a% a- N+ q: P: m* G. o3 S& A2 g### 总结
* B4 Y1 z8 W' p% O/ d6 t( F/ o; q* `4 `4 o
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。( ^3 B5 u/ }6 `3 V; ]
/ A) P. X0 ~2 |# h; O
如果你有具体的应用场景或需要更详细的解释,请告诉我!2 h7 `( I! l, o0 w) l9 ?

; \3 ^7 R* M, F7 @2 k$ r( \1 ~' P
7 }. X0 Q2 [4 p. p4 R

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

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

售价: 2 点体力  [记录]






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