QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |正序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。2 [+ W- |7 G" V7 j( ^/ ?; ~
& w/ ~' C0 m+ e/ G, V/ {' \
## PCA 的基本步骤- I9 }/ F4 U9 K4 h3 w/ h- Q& j
9 V  H$ }% D1 a# e/ [1 m) T' @$ P
1. **标准化数据**:9 c+ A, z8 I" ?; t
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。' g5 I8 v* _4 }5 j

9 n6 Q. ]4 u: c, }2. **计算协方差矩阵**:. L# g* _1 T# v/ ?# f: F' L
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
2 X- |; S! R% M   \[
# \- m8 a0 u6 Y' H$ A& O1 Y" A/ F   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
" Z# i, B. E9 C- V8 M$ U   \]* ?5 t* @" u' h* V) j
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
* _" s  R% t( U' w" `# n# R, R: L# A( a. W( H% m; j7 r  P$ Y8 g
3. **计算特征值和特征向量**:# [1 h; H! M0 h) [" t
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
! K/ {: t) D3 d8 T. F) S# w0 D" a5 p' }' g4 N& h- d
4. **选择主成分**:
9 r" ~! E  p2 b' `   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。& ^9 A8 S7 {# P; @" H
' a8 G3 }1 L, }- n# F
5. **投影到新空间**:
$ b7 _: o+ Z8 A" R- e   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
8 j% E# r$ }- t: l8 u' n/ y0 o3 a+ Z* N
## 示例代码
0 ~& b6 G% _# O+ j
8 _, n  D$ ~6 r3 r, Y下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:. m0 D( x8 J) W: C/ f. `
% V' `7 r7 `2 S/ J# `
```python/ V$ O) _0 }& F( _7 y$ [
import numpy as np5 k: P" R: C) s0 Q: @2 w
import matplotlib.pyplot as plt
8 j# b& y  \5 a7 w8 R! Y4 Ufrom sklearn.datasets import load_iris# |+ O) F6 V, z, p+ @1 P) g7 L
from sklearn.preprocessing import StandardScaler
( l# ]6 N6 m" r
( Y2 Y( @- o* O% T# 加载数据集(这里使用Iris数据集作为示例)
4 b, l/ {; V! z4 B$ t( Cdata = load_iris()
' l0 p# k/ M( m7 ~X = data.data  # 特征数据$ g# |) F2 V$ E4 s2 a: S( |* }
y = data.target  # 标签
* a' Q' o5 S4 _* X6 u' t, k
0 F4 {5 X; t7 M4 \# 1. 标准化数据9 X" {6 g  f/ V* D8 t$ r4 W
scaler = StandardScaler()# l; M$ M+ D! x/ N6 ^5 ~+ J
X_scaled = scaler.fit_transform(X)9 m/ C; l* F2 U* L7 }5 `

5 x  G$ Q2 r! i3 e0 j# 2. 计算协方差矩阵
' i  K" L; C- q7 e+ A( Hcov_matrix = np.cov(X_scaled.T)+ f; p) u% Q' j; I. ]+ j
; R8 {2 C$ h- S  }; e4 h
# 3. 计算特征值和特征向量* [- \  X! S7 M" X2 `6 J% H
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
, I# S& A/ U0 G: c  {& G+ p6 t
' W: R6 A1 F3 s& f* y! g. ?# 4. 按特征值从大到小排序特征向量
; g7 g  e. W" T5 t: S& ~- gsorted_indices = np.argsort(eigenvalues)[::-1]; x8 h* e" x/ N7 n0 Q
eigenvalues_sorted = eigenvalues[sorted_indices]" N- ~+ B: e! B! Q' K$ p( d# U
eigenvectors_sorted = eigenvectors[:, sorted_indices]: y" A/ M0 a6 k3 w) H
! x7 b( k- S1 a) i6 J% G
# 选择前两个主成分$ D" f5 {7 A) O9 x2 G$ t4 p. p7 H* z
n_components = 2
& e0 ]+ }; |4 A. [" o& FW = eigenvectors_sorted[:, :n_components]
9 v$ T7 r3 r3 ^: R0 I* j: ?, q  H0 X2 L2 _
# 5. 投影到新空间  G" I+ E5 E; u7 m$ u/ h9 a
X_pca = X_scaled.dot(W)
) O8 y0 m; ~) b5 z1 X, \9 C% P1 l
6 A9 M; f( }1 }" P4 n" v# 可视化结果0 S( A8 p/ P8 `2 x% G1 H$ f* o6 \+ f
plt.figure(figsize=(8, 6))+ X4 u, m9 x! j: p
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):1 {" }, d" Z* h& U; B7 L8 \
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])! W) {% J% U5 V. U4 B- i
plt.xlabel('主成分 1')
7 z( K! f! [- R# Oplt.ylabel('主成分 2'): W( f$ _2 D$ k$ m& C
plt.title('PCA - Iris Dataset')
9 t$ G& D! Z6 g: \2 bplt.legend(): [! J' X. T' f7 ?! o
plt.grid()
; N' s  D( X6 ]9 ~; j! U+ T: Zplt.show(): j  n' ]9 R9 @3 h; y( `& i. S. {
```
3 s& n( `0 r6 N7 \/ c/ j: H  n* Q; F  @9 a
### 代码解析
* m' ^) L. w9 L- s% C% s/ E; t2 i0 ?; _. u; x  f& z! \& ]# e
1. **数据加载**:4 h+ h: L2 j' y' V; O
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。( S  v, P$ K# S3 P+ {8 a  c* g
0 |) n3 N1 ?! D
2. **数据标准化**:
$ o* i* d% p% n   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。! k& ]& E" ]3 \% }+ ~$ J3 n. k
( ~& h# p3 K$ k# `1 [" V( Z4 V! C- p
3. **计算协方差矩阵**:
  _* w0 b1 e- S* A# K3 B   - 使用`np.cov`计算标准化数据的协方差矩阵。: H  e& p$ i7 }: |8 m4 ~8 O9 T

' J# f& e% Z/ ?* R# d& w4. **特征值和特征向量的计算**:. O$ p; s- s; S& v  r! [  ]/ e9 g
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
6 K6 r/ d8 c+ Y' n  G. f
2 W: J7 I9 E8 _4 K5. **特征值的排序与选择**:) U) g2 O  G1 j) X' I
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
. e/ A% |, P& R0 Y' D0 l% A+ c* ]7 l; `/ Q7 A- t* g* y
6. **数据投影**:
5 R+ f/ p7 G7 E# }3 f   - 将标准化后的数据投影到新的特征空间(即主成分空间)。# s% e- Z. t& f6 G/ y1 U' y4 V% Q

2 o" u7 W! _* P+ |$ {. p7. **结果可视化**:
' y' {0 T4 t5 Q) G+ i; J+ Q   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
: _  B+ R# p* L$ ?
& S$ Q% R. G' c- V$ o: u1 [### 总结
) {3 V5 M( V/ U) x' \
; _" f6 f: z) j+ Y  E6 j' B: ]* kPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。- ^% y% V3 u5 ~/ j5 y- F  m
$ [$ v/ q0 R+ F6 f3 z
如果你有具体的应用场景或需要更详细的解释,请告诉我!3 m& B; o5 d1 I1 y7 q
& w9 S$ n& t2 A; B) A) J4 o6 J
6 {+ V6 [9 Z0 f3 e$ Z
% b. f* d" R3 q/ `1 `8 w( k3 ~

主成分分析算法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-29 12:38 , Processed in 0.361008 second(s), 55 queries .

回顶部