数学建模社区-数学中国

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

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

* D* S" x' ?# W% C% p& S6 T## PCA 的基本步骤
3 P0 H+ z" a$ J, t0 H
( |" P! @- ^" D( v7 V, e1. **标准化数据**:
+ n9 ~  Y+ d1 p1 m   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。1 H% h: }" }1 o6 |

6 D7 C. W  d% k& W  d1 N: Z! ^$ A) w2. **计算协方差矩阵**:
% f' }! o3 H! s2 H   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:& _. _6 b: a1 [" o. T
   \[" E* B1 j6 J; ?  t- H2 u& z5 j
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
/ C  o9 ~9 x5 e* Q8 j   \]$ N0 i) u5 g" w4 H/ x  A# O
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
+ W/ Y; a- o9 _! j
! Z5 K. `5 c7 n5 F3. **计算特征值和特征向量**:5 w5 ]2 Y9 ~+ V; |' k
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。6 }; E6 R  {2 G4 F# J7 ?) i; @4 J
; S. D4 x3 ^. g2 L$ U* d2 `
4. **选择主成分**:- X# ?: T, Q, c7 x  G% _9 M
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
. C7 z/ K# a- N9 W, d3 m" B9 C4 j1 g- T( E& c$ ^
5. **投影到新空间**:; I6 H6 C+ \! V/ V1 z
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
& x6 v6 w+ }! d1 t+ m4 ]
# C  M: v& c! [## 示例代码0 h# `" r$ {' ?6 o
4 d) x7 Y1 g4 E1 K  |" N9 P( D
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:- ~/ ]" e% w3 A1 E

  @1 W, w. Z+ v/ Z1 S```python
7 o' X9 h6 z8 @( C& T  Ximport numpy as np1 o5 C! E1 _5 D) ~: O/ u
import matplotlib.pyplot as plt
" W( @/ |' P( o+ [$ mfrom sklearn.datasets import load_iris
! ~* P8 L) n; S. }& ifrom sklearn.preprocessing import StandardScaler3 `% F! b' T9 X" G
# ]* l# W6 C4 ~
# 加载数据集(这里使用Iris数据集作为示例)4 c4 J- [! K' O2 Q" h- ~+ l
data = load_iris()
* b1 z, i9 z: Q, p  GX = data.data  # 特征数据/ W: h: c! |3 m, g
y = data.target  # 标签9 x% i0 r- O4 J( u8 {5 o, q
/ F1 e8 |# \, h4 g! ~1 b0 O5 D" N! I) W
# 1. 标准化数据
& i+ [  @" z& v5 p1 s; j, Wscaler = StandardScaler()
3 _; }4 i( `% Y) p6 RX_scaled = scaler.fit_transform(X)3 l2 B/ l& O, l" [
5 [: n% Y9 E( F! `2 O
# 2. 计算协方差矩阵
5 H# p5 O) o- }1 {/ A6 o/ e% Z: j9 ocov_matrix = np.cov(X_scaled.T)
+ W$ r% \' q6 r9 s$ N
" ]$ d6 M% w: d7 B0 d1 Y9 A# t# 3. 计算特征值和特征向量
5 J( n9 [* h8 V3 ?" n* @eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)0 C0 y) F8 z$ p. P* `6 ], f; ]
  L1 F& ~- a+ A9 l
# 4. 按特征值从大到小排序特征向量
4 M' }6 z! K1 @/ C3 g( msorted_indices = np.argsort(eigenvalues)[::-1]
2 C2 `! I. T# b: I2 peigenvalues_sorted = eigenvalues[sorted_indices]
5 s. l0 h- P% g1 b4 J: G: Zeigenvectors_sorted = eigenvectors[:, sorted_indices]
: C: ^8 S4 S+ A# V: y- X
2 p$ V2 g" E6 C& d# 选择前两个主成分) Z$ n3 \3 m* a( u# B3 M3 K6 ^. K
n_components = 2" T7 Y6 i* l6 K$ C$ [
W = eigenvectors_sorted[:, :n_components]
$ G1 ~; X' Q  w, |* U/ d* Y! F$ P9 K8 E! [
# 5. 投影到新空间& t. {! {0 ]& d8 f+ x
X_pca = X_scaled.dot(W)! m4 O8 |; E; u: x. X
/ [5 T# v8 J( S+ Z# O
# 可视化结果2 Q6 B, e2 r0 [' q
plt.figure(figsize=(8, 6))
# H- W: B3 s, \- q" W( jfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):- K; Z9 i$ p% M) q
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target]): e1 m8 G$ {( V2 _5 T5 _1 ?
plt.xlabel('主成分 1')+ J5 T: I! x4 U* @. _$ ^* z
plt.ylabel('主成分 2')
* _& ^' {, a9 O0 t4 ?2 uplt.title('PCA - Iris Dataset')9 N) S3 U8 Q& G* C+ O% t' l
plt.legend()0 \, j3 A$ Q1 t' _6 j6 E
plt.grid()" i7 G/ b4 r3 x4 q2 j* p, o* b
plt.show()& n5 I: Y4 g" ~* l: L2 H
```* j, I  _+ N0 L: M
6 @! u: r% ]! E# K% S. h3 v
### 代码解析
: y( }4 X' h& H5 n
, P  D4 ?+ ^' @' |4 M2 L0 G1. **数据加载**:
! o- e" x8 \5 W) `   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
( [2 J- B6 s; L
" l( B' L$ M7 d: x2. **数据标准化**:& k  G- I7 e" N
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。# m, y: W) U: l3 z/ O: b5 j, i8 Q
2 v& I( a9 U+ t! {# S
3. **计算协方差矩阵**:: l# A7 T0 s! L  a( q' }+ D0 H5 W
   - 使用`np.cov`计算标准化数据的协方差矩阵。
% r3 j! F" S. m% h% f7 V2 @8 z# m# A8 C. }4 U% ]. m
4. **特征值和特征向量的计算**:0 r# f2 z, D! P* l
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
' A$ }0 s/ P( q  r- m- U
8 T; ^) I1 R) |' q9 H5. **特征值的排序与选择**:
5 p; I) [2 w- w5 j   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。  s: \- t0 W/ e; |/ r) A! N& y  M
' J/ \$ |$ r6 Q
6. **数据投影**:
7 K9 s8 |3 h$ b) M4 Z' Q+ v   - 将标准化后的数据投影到新的特征空间(即主成分空间)。. V9 M$ J& |, m! ~5 G3 ?' t. Q; s

6 T- c% S9 f! N7 Y: @) y' g6 ~7. **结果可视化**:
6 k; ~$ v! p% G% ^0 o" C   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
* g# v- x* J% U) k3 j/ ^' l# _" J7 n5 Y  \) R. b
### 总结
0 a2 P, f0 H) X- H/ z' z, m7 s' Q2 ]% W% W$ D' W7 Y
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。0 W( b3 ?! v$ |

4 ~# q3 P( x  d+ e+ v( h  y如果你有具体的应用场景或需要更详细的解释,请告诉我!
1 Q: u  f7 m. l- ]
, g) x- y( W' M1 y6 N8 T5 Z
( G& |+ k* X8 K1 W& w% b3 Y) ^# b! |9 Y/ e: c7 `" Y5 X  }$ |  I) _

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

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

售价: 2 点体力  [记录]






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