QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1141|回复: 0
打印 上一主题 下一主题

主成分分析算法Python代码

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。+ J3 u/ D7 P) e
5 u! L" i7 w0 _2 Q! L
## PCA 的基本步骤/ E1 ]/ b9 }( |( |0 L

0 o7 X; c. E8 m! u' |! `1. **标准化数据**:
0 w* S$ i4 s- d8 F4 z   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
/ D' Y: d) ^! j8 u' g( u
0 b! r4 [3 P, W2 i7 P2. **计算协方差矩阵**:% t' Z2 c/ @$ }: a
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:" i  @6 K, E% K
   \[
6 h# E" F! F. X' ~# u   \text{Cov}(X) = \frac{1}{n-1}(X^TX)3 @9 ?3 W+ j, W& ^1 S
   \]
, m0 N: B  Y; H( ]   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。1 D4 ^" o- [9 _* W* m1 j& o- M
) y2 J8 Y. A0 @4 }7 G9 ~, W, W1 }0 ^% b
3. **计算特征值和特征向量**:, l! w: ^4 L8 }5 c. w& i
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
% {8 H0 }- i* m7 l! X+ f$ D! o* T! z. r9 ~7 Z
4. **选择主成分**:
0 v+ F! y2 n6 O, \6 }, {   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。1 c1 i2 n' v8 |( @

( z1 T! O9 w; @4 X5. **投影到新空间**:( d; e( ~3 Y% {9 U8 a* @
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
( o# g- j- `: y$ x7 `6 k: A5 Q# ?$ H: \
## 示例代码
! V( P9 S4 L0 g1 W: E
- L7 P; L4 `9 D4 f下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:# q- t9 C  A. M" c3 \
6 ~% ]& A1 N8 m) O" q9 W
```python
* n8 w% U) Y( W' S% G  g4 Kimport numpy as np( j2 W9 L$ B- q7 C
import matplotlib.pyplot as plt
, `6 I6 r# A. X1 a, R$ yfrom sklearn.datasets import load_iris
! R0 W; h. l1 h( O, ?, [9 V8 E* Lfrom sklearn.preprocessing import StandardScaler% j7 A7 g9 w5 i
$ c) ~6 v3 p0 v9 q# {3 x
# 加载数据集(这里使用Iris数据集作为示例)
+ m- X' W8 v% M5 p- a+ H  }data = load_iris()
+ p' D! M1 c6 b0 j9 q( s; t$ AX = data.data  # 特征数据
$ j# O* `$ d; y( ?" n3 Oy = data.target  # 标签4 Z+ r3 l7 e8 w- P! B1 F

8 X6 J4 [  m! p+ N$ o" ]# 1. 标准化数据
5 V9 J1 F4 F6 `, ]0 |# f  Gscaler = StandardScaler()
+ u+ d- V7 h* w7 v7 h3 SX_scaled = scaler.fit_transform(X)
6 d6 G$ Z3 m1 L, o1 c3 C7 {' W
, P# {2 R# b% r' ^( i( @* s  C# 2. 计算协方差矩阵$ i( W7 N; i$ C' {% n: J
cov_matrix = np.cov(X_scaled.T)
: v( |/ b3 G4 J' ]7 |" m8 {% w- b! P( M/ s2 l# \, f$ ?' h
# 3. 计算特征值和特征向量
; F' n+ V1 O6 |% t) [# L: [" _; _8 veigenvalues, eigenvectors = np.linalg.eig(cov_matrix), t: O( `" g$ a* R8 b( v
- D7 F: T3 P0 Z* E6 Q" G" X
# 4. 按特征值从大到小排序特征向量* e: A. j: i2 U$ M* C1 f0 @! `' W
sorted_indices = np.argsort(eigenvalues)[::-1]
2 \: p: r4 D5 ]) g' Seigenvalues_sorted = eigenvalues[sorted_indices]
1 W5 _. }) W/ k$ B' r9 I* p$ deigenvectors_sorted = eigenvectors[:, sorted_indices]
3 E+ `4 n4 W3 Y  f( b2 v; X* g' ?# j. A- k4 ~
# 选择前两个主成分: o( `, [. E+ U; `9 I
n_components = 27 L( Z+ b3 L# w+ }- J: A2 N: S% C, a
W = eigenvectors_sorted[:, :n_components]. C) S- d3 J% E: P4 R$ K+ M4 _
% |1 [5 b' |! I) Q8 D1 }9 ~4 `
# 5. 投影到新空间# j0 J2 A* n; z
X_pca = X_scaled.dot(W)
0 R$ b1 u7 y$ I- o
/ s. }9 }( Q2 C, Q- O. ~, N# 可视化结果& d1 P2 C( k# v3 D
plt.figure(figsize=(8, 6))/ Z7 Q9 g! H, l
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
5 k  z6 |) F+ s    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
8 ^8 g9 K3 M. O8 xplt.xlabel('主成分 1'). W- {- D5 R7 W3 `; Q8 s, F5 E
plt.ylabel('主成分 2'), ?( T& {6 ?- x
plt.title('PCA - Iris Dataset')
; {; I  r7 }; ]" E' G! @" o/ Oplt.legend()
3 i3 B* p7 O2 N; |: p) cplt.grid()
& H4 i: A4 _$ Z* x3 _plt.show()
, p; w6 U% T# B7 A' t% o```
. x: X6 m- y/ g2 B( s$ k" V  T
# |$ H1 A/ ]5 O. q( \### 代码解析
4 S: F2 O/ Q) @4 h! {5 }: m: Q- i9 \
1. **数据加载**:
  r" B+ S8 v- ]9 K   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
4 h5 B0 A; l' r8 C8 g1 ^, v" }% K. A6 Q4 X; N! r3 \
2. **数据标准化**:
+ F$ o+ n* e  R7 {. Y" h   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。- n8 T6 C4 [: J6 L- p

$ G8 N0 t) L4 b: _: y/ Z3. **计算协方差矩阵**:1 A% k6 n# @1 D2 ~8 S. ^$ |
   - 使用`np.cov`计算标准化数据的协方差矩阵。
( \% |$ R. U# b/ r8 e- n" M5 B* s7 J0 d, p
4. **特征值和特征向量的计算**:, d$ I. {1 q" f1 _. z1 o- u
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
) r* [0 e! b8 W( K8 |) s) |4 f- K; f
5. **特征值的排序与选择**:1 P6 Z' S3 k0 |; y# h" ]5 o
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。( F5 z3 J+ ?. E; w
* C( I! `  X% o  e; E
6. **数据投影**:( ~; D) _) G4 o
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。1 K1 j* f' ?5 Z

9 C" k) X3 |; P; I2 L& X7. **结果可视化**:( _6 H! S( G) ]6 Q9 C; A4 p4 u
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。! g% F1 [7 A3 J. K( x- v0 Y9 O

/ y+ K$ b6 ~- Y$ ^; _### 总结
1 L) B' e0 \# o9 P& M0 x8 P% N8 w8 r  O) D; q3 B# n; |% Y) b
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
4 K8 \5 e) ^( v; o4 E1 K: g( P, k# p; [8 B; q7 j7 D
如果你有具体的应用场景或需要更详细的解释,请告诉我!! E; R! U. x; @, C8 K

- Q% S8 l2 i# t; P6 z( \$ K) t3 d, _* }8 F: e& ]7 G+ e
% O% s' p$ i/ s& C0 t* O! f

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

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

售价: 2 点体力  [记录]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-13 11:00 , Processed in 0.422465 second(s), 54 queries .

回顶部