数学建模社区-数学中国
标题:
主成分分析算法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# t
1. **标准化数据**:
, 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 j
5. **投影到新空间**:
; 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 K
8 `& v) E6 U& G! r- D; b
```python
2 f9 f, G/ O5 ^% v% S- n3 S
import numpy as np
4 m; T3 z; X4 i' B0 d0 J
import matplotlib.pyplot as plt
$ t6 Z4 h9 X4 W" |$ w- {
from sklearn.datasets import load_iris
8 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 X
data = 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 j
eigenvectors_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% r
for 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: l
plt.xlabel('主成分 1')
6 Z: D1 w U( v5 C
plt.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 O
plt.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; n
6 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 @, N
5. **特征值的排序与选择**:
& 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 T
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`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 W
7 X6 A1 F4 e4 t4 B4 I
' Z7 B$ N% ~$ S$ G0 O
) G9 S. H: v; q F+ G0 y
主成分分析算法Python代码.txt
2025-1-13 17:24 上传
点击文件名下载附件
下载积分: 体力 -2 点
930 Bytes, 下载次数: 1, 下载积分: 体力 -2 点
售价:
2 点体力
[
记录
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5