数学建模社区-数学中国

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

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

$ [: I* @; Q7 l2 X## PCA 的基本步骤
" Q$ U$ e; A" ]) d: s4 X
+ j- N% \/ E0 ]7 Y+ m8 T# t1. **标准化数据**:, O3 _1 h) D; _  P
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。4 A5 K& S  t: W; F

4 ^8 |8 B# Y6 l8 j- _2. **计算协方差矩阵**:9 ~* v2 k; }3 T" Y; {
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
0 J! k. U( N! ~* }  e   \[" B$ d7 V/ b/ g  a; H, i1 y
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)$ q  P4 J* ^6 B2 e9 D! d6 }7 {' u
   \]
0 }+ J& P9 E5 m7 L7 L   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。; P' O6 X' R$ E1 r# J9 v( E0 O, |
9 T! \9 S, C/ H* n1 n$ n
3. **计算特征值和特征向量**:' u- p- \7 N  \% p" m6 H9 Y
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。+ }- A, x4 v5 @3 e# C3 q6 m
4 M: p# \' V% {
4. **选择主成分**:
: j9 d# |6 _1 Z5 O   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
% s5 z' c  c0 a. F, ]$ V
: j- }( c, v+ s3 j5. **投影到新空间**:
; v( V3 z5 O* |& J, }, |   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。0 a; Z+ X9 ]4 ^$ C) U* Y
* a0 }/ r+ X% A  G9 O
## 示例代码1 ^1 h$ j+ z0 S
8 e" C' z; X5 V
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
1 F! @0 G9 z9 L" ~% p% V7 K8 `& v) E6 U& G! r- D; b
```python
2 f9 f, G/ O5 ^% v% S- n3 Simport numpy as np4 m; T3 z; X4 i' B0 d0 J
import matplotlib.pyplot as plt
$ t6 Z4 h9 X4 W" |$ w- {from sklearn.datasets import load_iris8 n+ R9 E9 V$ }- o! l
from sklearn.preprocessing import StandardScaler
0 k* g2 T/ w! @: y, `
* p, z2 K! y' r$ @- x# 加载数据集(这里使用Iris数据集作为示例)
) j) I' g+ I, O( T0 Xdata = load_iris()7 a0 [% t& g7 d' S2 x
X = data.data  # 特征数据2 _- \3 t1 O+ z8 F7 e  l; k! N/ g
y = data.target  # 标签
$ Y! ?' R. A! ~. \' R  t/ G* r0 }% ^) o# p1 k
# 1. 标准化数据# _7 x3 u" v! D; h% V0 }
scaler = StandardScaler()
3 S+ J! t. q4 ~; S( b, Z5 }X_scaled = scaler.fit_transform(X)
" m) R. H# a/ R1 @- k, L
' j2 j9 D4 x+ @; W+ n( t# 2. 计算协方差矩阵0 ?( Y) T$ b. T5 h' s+ M4 _- J% `% a
cov_matrix = np.cov(X_scaled.T)
5 x0 I* v1 n( ^! |- i6 k8 V; v6 @; H- M
# 3. 计算特征值和特征向量  v5 y$ E/ g( ?
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)$ _1 c. V+ Y8 J5 S! P* f' D
9 [  O  n) f5 d+ U
# 4. 按特征值从大到小排序特征向量
$ ?+ R& H8 d& }- x" O5 w9 c! v) {sorted_indices = np.argsort(eigenvalues)[::-1]4 s* _0 V- Q+ y1 {& O% X# f
eigenvalues_sorted = eigenvalues[sorted_indices]
/ \' c- p8 T4 ]3 W1 jeigenvectors_sorted = eigenvectors[:, sorted_indices]! d3 K/ q: y6 }8 d3 V; d7 M4 K

/ s# a/ s: z8 F: o; u: `# 选择前两个主成分% b* n7 r8 U, Y7 L4 a4 ]+ b% h  U, u
n_components = 2! }5 g* I8 x3 I* D
W = eigenvectors_sorted[:, :n_components]
' A2 K/ L- ]! w& Y+ Q- u
- j* S$ G& P8 H7 f# 5. 投影到新空间* Z  f; h1 L" O3 Y
X_pca = X_scaled.dot(W)+ _# b) j" }8 T( j( @. P
# s" I" R5 D5 P3 H1 u, R" j+ V
# 可视化结果$ d; K/ b' Y* t2 [
plt.figure(figsize=(8, 6))
. N" V; r# {% G% rfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
- h8 y) S2 y/ T    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
0 ~! s9 K+ |4 r, i: lplt.xlabel('主成分 1')
6 Z: D1 w  U( v5 Cplt.ylabel('主成分 2')
: B. ]/ I( F" G- i; K) {( o% \plt.title('PCA - Iris Dataset')$ [3 b  ]5 O2 ^$ M
plt.legend()3 i0 [- u# d! U$ `0 P: j) j; d
plt.grid()
- v) |, o. j! L1 l& q" ~9 Oplt.show()5 R; G( d, @, F% i: s. E6 R
```
: M9 P: R, _5 w8 _% N4 C) [# A
8 @$ ?( d/ n) H6 J4 D9 ]$ X### 代码解析: j6 l% w% I  y) ^9 T/ f: ?0 o2 Z5 Z
4 P6 I: |( A( \& |0 y0 g$ {; {. f
1. **数据加载**:8 l6 N% N( D% |" A2 x* p+ j
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
9 t! ~# R  k# t0 l; r2 |
: @0 V! g6 x/ |" t5 D6 n. ^2. **数据标准化**:( p' \- r) d* R' r/ h
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。& Z. |. `+ O1 K. q
* q, j2 Q7 G4 F+ B9 z% N
3. **计算协方差矩阵**:( q: l6 ?9 H1 P* C! ?
   - 使用`np.cov`计算标准化数据的协方差矩阵。
! j' S  ]0 W- `4 W& D5 Q, y; n6 k) `  U& x. G) a! X7 S- u
4. **特征值和特征向量的计算**:2 [# W5 P7 Q& e* w1 ~" ?
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。% }( ]* y) C$ x6 e" B: w" C

: ?6 v, I  @, N5. **特征值的排序与选择**:
& f& e3 M) D5 Z; ?( }: ~6 ?8 p   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
$ u2 |  n) H4 ?6 X" a4 t' z* e! v
6. **数据投影**:
6 m# p  _- v& u1 L   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
6 {3 @! j( s% O& V5 F2 H7 |- L6 s7 }; A; x' S. |8 i; F* i
7. **结果可视化**:
0 e3 l3 O( t0 v; _7 P   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
# k3 F8 F' \# w# x% a! X- z  W4 l! ]1 w( [1 n0 V' `' y
### 总结
7 X3 p% T% ]! M* ]. k0 i2 E6 i
& N3 m6 y: E: K; M, o0 TPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
5 H" y  c5 C' s4 T2 b+ x( Y' j5 C
3 j+ }# M$ Z+ s  p/ x如果你有具体的应用场景或需要更详细的解释,请告诉我!
& F" P5 u8 ~" @/ J2 W7 X6 A1 F4 e4 t4 B4 I
' Z7 B$ N% ~$ S$ G0 O

) G9 S. H: v; q  F+ G0 y

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

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

售价: 2 点体力  [记录]






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