QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。+ J% |& v7 |1 V! J: C

+ l0 ^" C( b0 l) s7 \- C## PCA 的基本步骤% V3 n0 r* P; D9 l2 G' F
  Z5 {8 c- c$ v1 \* p
1. **标准化数据**:3 I3 O9 {: X4 y# ]1 E0 E
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
7 _5 g) E$ ~" C( `% N
: @* d2 K4 I) f2. **计算协方差矩阵**:
# _/ g* A, l9 ?; Q( E$ K   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
0 |: |1 [7 t8 |   \[3 I0 N. [) {8 w0 g" @
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)8 U. q9 _! \! j& f
   \]2 f  y/ p8 l8 P5 o
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ e8 a/ v' ?' T- }" W; b9 v% I+ u
5 S. E3 Q3 B9 S* z+ l" c# ]
3. **计算特征值和特征向量**:3 u% B' L) k' c- B
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。% }4 K' T3 \, p$ U2 v

% g" d+ z: ~% B2 P, c: w9 j8 W( p4. **选择主成分**:* Q4 L: e" a: t
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。9 F! G5 F' W7 o0 Q
. D3 L; Z# b% \& _+ `8 j" E
5. **投影到新空间**:
( J5 c# N/ l" x9 K, m   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。, L  F* N/ @  r0 ?0 r" m

/ M% L: C  M) D' D' `$ `& f% y6 q## 示例代码
" O- }6 O( {5 m9 N3 q8 P7 d- |- {
7 k" ~6 h( b1 i6 u9 T下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:% V& x! l5 j; r( C3 o1 j
# J* N, W% y* R) @( a. m9 V
```python0 V) ]2 n+ [7 b4 C( w* j
import numpy as np1 J, ^2 A+ M+ K5 e% ~( `; ]
import matplotlib.pyplot as plt. I$ t4 J9 o' M1 q: n
from sklearn.datasets import load_iris
  p# A' e; I% X. N5 w* jfrom sklearn.preprocessing import StandardScaler# Q# N& ~1 l8 q, c# v) ]8 p
4 E& [( W. I* I9 s- z
# 加载数据集(这里使用Iris数据集作为示例)- C1 n1 U3 c/ N
data = load_iris()
, y& z& _& c( r  J+ q0 jX = data.data  # 特征数据* Y  F: {) {# O
y = data.target  # 标签6 }7 {" s% p5 k5 Z* ]9 o' [
/ G2 u' J% }$ f, V
# 1. 标准化数据) \/ V' e8 a6 i. [5 K8 m+ x
scaler = StandardScaler()% k) |; Z( r# ]7 \% K0 U' c
X_scaled = scaler.fit_transform(X)3 W% y! _. }. {& J
, F5 [( r- }# z$ b) `
# 2. 计算协方差矩阵$ p- i1 y# ]8 R+ C: s% W. R! y
cov_matrix = np.cov(X_scaled.T)# L+ ~- G9 @; L# U9 s
' ^% [6 n1 U; \6 K+ Y8 o
# 3. 计算特征值和特征向量
7 ^" B7 B2 w, k  G  P; n. Aeigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
; }" `$ `1 e9 S: F0 |: x: N& S. `) t, m0 ^: v# l
# 4. 按特征值从大到小排序特征向量
& q( ^, C8 A5 ~$ ?1 y8 Lsorted_indices = np.argsort(eigenvalues)[::-1]8 w  Y4 T! k5 t" v( t  t' [( M
eigenvalues_sorted = eigenvalues[sorted_indices]. b4 ?+ k- C, r; `# M, y: s
eigenvectors_sorted = eigenvectors[:, sorted_indices]9 b4 ~8 `% G/ U

3 i# O" |$ G; L- |1 Z# 选择前两个主成分4 ^5 ~- D& i3 ?5 K" s, Q/ i0 t
n_components = 2
) A3 C& |' p) Y/ w3 b8 M6 hW = eigenvectors_sorted[:, :n_components]
! \, h8 W" G! A8 Y! H
& n" V5 F2 b- K5 c7 Z! J) Z# 5. 投影到新空间
) e* G$ m0 X5 ~. uX_pca = X_scaled.dot(W)0 @; `' T6 |8 N/ o' ?# k, h) ~

& f- M: |" k6 }1 X- g) t# 可视化结果
5 V: w) {, y( R( [- D# E5 pplt.figure(figsize=(8, 6))
- r* T2 n4 @' p: R- H8 V/ J9 z& {for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):  E, s% g( e7 x6 m
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
# H. C0 w- ?) k, b/ P/ G6 j7 J; u- Aplt.xlabel('主成分 1')8 C; y8 v! d- c) p4 r
plt.ylabel('主成分 2')
0 h) F" S8 ^% J7 mplt.title('PCA - Iris Dataset')
9 N7 A, q" q" t% B& e1 Rplt.legend()
; c" w% b: Q! Y  w7 w3 e" \plt.grid()
- d" K- E! y6 ~- jplt.show()) f$ R( O! Y" _0 S; k7 @
```
: O9 {4 L+ g( E  U& u! L& a3 G' H1 A: L
### 代码解析$ \- N! Z# R8 A1 H0 W
7 c! D9 H6 `7 n% a
1. **数据加载**:
' t$ }3 q" t6 T9 ?2 q   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
5 [6 a. @+ a" H% s
4 y+ _( ?( U) e' I& W2. **数据标准化**:' o7 r/ X0 R! z4 T
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。1 o; g2 }5 U2 F. V
, w- w8 m: t/ K8 o
3. **计算协方差矩阵**:* b/ |) q6 H" a) A, W9 |  U7 ^2 r; {
   - 使用`np.cov`计算标准化数据的协方差矩阵。* T8 c9 p( @% X1 _1 |
3 l* }% M, A7 G" `( }" r: r( M- r
4. **特征值和特征向量的计算**:
- I' t8 z3 h) `% f5 U8 i   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。1 ]4 t! L& A7 `; i

4 w% Q+ O0 I0 a- h5. **特征值的排序与选择**:4 B- P7 t& u6 R; }
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
/ n. \4 W4 m8 t9 C* h7 v# F2 F4 I/ m) N
6. **数据投影**:
3 @. X) t% ?$ |# _3 `7 K   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
% p$ |. X+ \3 R3 i) e+ |: }% {/ M  r) q
7. **结果可视化**:1 }: N* _+ V; }, i0 ]: d- ^& ?8 s
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。& K. G) q7 |5 j) B% s/ ?9 T& N, J
. N$ u$ \0 o5 F% S* T! j
### 总结) d, h0 }! c6 j' U$ _

/ x3 D8 C0 C' V8 ^1 [  B; |PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
- a$ w$ \0 o- ~, k- d9 `3 [
! T8 c  ?: t5 q# v如果你有具体的应用场景或需要更详细的解释,请告诉我!
8 [+ N8 V* `2 K6 w: W. y1 d) M( B2 ^- U, z: t

2 r( f( ^1 L" t6 W5 c4 F; l* B; W, O+ _; Y" z9 Q7 m. I: e

主成分分析算法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-7-9 21:49 , Processed in 0.319829 second(s), 55 queries .

回顶部