QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
2 G% b: h0 I5 b& z& q8 X: r" G$ |
9 E# Z  H; }, P8 W) E## PCA 的基本步骤
6 M/ ]; o" {3 d7 ~( z6 M) ~4 Y7 G* V6 }; Z& |3 N  a
1. **标准化数据**:1 H" R% X* c" D/ c4 i' s( O
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。, l2 G& v5 g; _' o/ T2 b

: `$ f. {- o& M9 n7 u2. **计算协方差矩阵**:
) ?3 e, V; c5 t1 n( J) G   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
- j" F  f' E% U; ^8 I- R   \[
& o$ V  t% r: }  f% H" {  t% j1 s! k   \text{Cov}(X) = \frac{1}{n-1}(X^TX)0 @" ]- K& d( H6 Y$ l& x+ N. R- M
   \]6 b' X( S! A, U( ]
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。  v9 M5 u) ?6 l

) n. i4 a1 ~8 B; ?3 F; F9 B3. **计算特征值和特征向量**:
1 I) G# D; e$ P0 p* j: J   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
' D: \  {9 g, U7 z) j8 |
! }: |9 _  p# c% d4. **选择主成分**:& B" T: Y4 ]. ~+ q" f
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
5 D% B: \) e5 R! M0 ^8 V0 c
) }" n+ k, P& i5 f; F* C5. **投影到新空间**:
3 J" t' ~' M" U' i) U3 l+ u, O   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
6 i0 _& S) R1 k  s4 O% x; p8 l# A) I6 r7 z- @' \4 }
## 示例代码; m" t9 w  E! b  t( p

+ Q7 ?# A7 H' _) m) j$ }, ]下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
* }% X( s6 R3 n: b0 x" z) G9 F- J$ y* s( n, S2 r9 {2 ]/ K; t
```python+ a$ v- Y1 j  S+ O: |' x' w
import numpy as np
1 q( k0 U8 g! ]& ?9 Dimport matplotlib.pyplot as plt
4 K; j6 q0 J( g0 Wfrom sklearn.datasets import load_iris- u& Y+ m; U2 V  {+ t0 ]: }
from sklearn.preprocessing import StandardScaler5 u0 I. d1 N3 x% [& {* M7 X

" v$ m' c' N" T. J0 Y5 A: |$ k# 加载数据集(这里使用Iris数据集作为示例)& @  ?; L6 j: Y/ s+ {, W
data = load_iris()) X' |% f& r) l0 [3 _9 h
X = data.data  # 特征数据
6 G, k' G. j- `' y$ wy = data.target  # 标签; m& |/ b! N( {3 {/ @/ e7 s2 _* O

% f) D% {. u; \, K% }) s# 1. 标准化数据
4 l5 J$ j/ t7 B+ M. k' _: bscaler = StandardScaler()
' Z0 E& z5 f3 e6 s1 GX_scaled = scaler.fit_transform(X), N1 m. |( p; ?6 z  j
  ?. l. n, ^( @, D! z, R* }
# 2. 计算协方差矩阵
' `4 f$ E! T1 r0 Fcov_matrix = np.cov(X_scaled.T)4 E$ g( l3 J7 O. Z' W( i

  \  j  f& v7 S9 N2 M# 3. 计算特征值和特征向量
" {5 {$ J- f' t; C& k1 reigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
: _! |" G  k: ^9 k- q- E7 Z6 v! `! F, j. k1 _
# 4. 按特征值从大到小排序特征向量  I3 d4 k: k" c- ~
sorted_indices = np.argsort(eigenvalues)[::-1]* v5 z0 h/ i* y. }
eigenvalues_sorted = eigenvalues[sorted_indices]- X; _. l" Y  u6 b0 D8 F& o
eigenvectors_sorted = eigenvectors[:, sorted_indices]1 q1 i5 g( S" k2 {7 ]% t

. A" j0 Q% n: ?# [6 f- \# 选择前两个主成分
* |/ N+ S7 K6 Y. [n_components = 2
0 _9 x1 |5 Y+ ^+ V3 ?W = eigenvectors_sorted[:, :n_components]9 ?; ^& P( s- D# `0 z

: I. p) ?) w) O8 e/ c+ S5 q* Q# 5. 投影到新空间
. M) M: X5 ?( e5 D* CX_pca = X_scaled.dot(W)
9 K5 g! G, n$ u# n; y' u' s) I' j, {! @& _* v
# 可视化结果4 @# Y+ N# }( w. Q
plt.figure(figsize=(8, 6))! B; V& [" x; [
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):, E' q7 m+ j% u
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])4 M, ~* ~9 k/ c7 h6 l
plt.xlabel('主成分 1')3 O* H# C0 U) b
plt.ylabel('主成分 2')* C( \! L* Z( v- V* T
plt.title('PCA - Iris Dataset')
1 p! s. J8 `2 Hplt.legend()2 T3 y$ Q& Q( a, g" {0 c
plt.grid()
0 Z# R5 U$ u) Q7 |& z& z4 |5 vplt.show()
' O7 v6 Y- B* K8 t7 o- V```, i: Q" o2 G  g
" [! a! ]  c- }" Q/ K8 G
### 代码解析
; {' v! p+ @) [- o  K! _; Z' D8 i7 v; r& G
1. **数据加载**:
( Y- f; w) d+ c5 \* }   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
: P: l* |0 U% G2 X6 Q. b5 v: r. h5 L* |, U
2. **数据标准化**:
0 x" V* x+ c: I+ Q% T   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
7 {" o& n3 A# g- b1 Q* G7 u/ I2 _( ^3 X0 U1 h
3. **计算协方差矩阵**:# x. t# k2 U# A# f- ?/ e1 `. c
   - 使用`np.cov`计算标准化数据的协方差矩阵。
$ a( h' s6 ^& o) m9 L$ X3 r' ]8 a& K, t% s7 B
4. **特征值和特征向量的计算**:1 q; @, u" v1 R- F1 g
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。7 f7 ~4 p- V+ H+ O
# w8 f, z6 T9 J) g3 u' c
5. **特征值的排序与选择**:/ i- a; {; |" S1 ?7 T
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
  X1 t9 y" Y" e  {. ?9 b6 F
1 i6 B1 y6 _- Q( ]; A6. **数据投影**:: e$ i- J5 R8 Q; F
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
# T- z6 @& ]& w) Q4 F+ e; D# Z/ C0 x5 Z( X( c
7. **结果可视化**:. b3 U( n* d) n- @; K* H5 p
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
4 A/ q  }6 d- z' R, w8 k) m
. ~/ C$ ^" Y$ A### 总结
3 e/ H7 l$ I/ F& G  [6 Y% ?( \. D
- d3 d, d$ c! e0 D7 y' c( o" |PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。+ q3 t2 b8 e; \/ V' s- R# Z. o+ @: H

- ?. }1 B! ]3 {" I如果你有具体的应用场景或需要更详细的解释,请告诉我!8 L; Z0 y) T4 }; y- z$ O

9 O$ K$ ~2 m' P/ [" Q
' |: H8 E+ Z9 a, m6 G: @7 j( _$ T" k1 }

主成分分析算法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 22:33 , Processed in 0.364225 second(s), 54 queries .

回顶部