QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
: l+ a# A6 _$ X0 E( R. }6 ?, n6 _# u5 i" N& |
## PCA 的基本步骤- n3 V' l$ q; b' x

6 {# x' [/ P1 ^1. **标准化数据**:
& T  a; l8 v$ ^" Z( q! j9 `   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。' u+ q% g" W( R# F& o% u+ k

' O1 R/ l" W9 ?2 x: ?4 f$ a3 j/ O2. **计算协方差矩阵**:) }" z: E9 L3 U  b2 Z3 H6 E
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:$ I4 R8 @1 k) z
   \[9 {# J6 \, J5 J8 A$ W; x4 d
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
- T! O7 h$ @2 [) s# _   \]: {6 g. k0 H5 y- D% }6 w  _
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。' T* I7 C- c- M! H5 w
/ o6 A/ G! W. n1 x, w9 s* H  v3 M
3. **计算特征值和特征向量**:* u; q8 t9 ]; V1 L& c. d/ O
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
5 u% j3 `& w! e( L; I# {
! h8 @7 f# `3 Z6 i* F# N4. **选择主成分**:/ d( q7 }- U7 t& ]
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
8 E" U8 L5 A6 R" H( y( h
, f) _# F$ ]$ }- r4 K  q: Z- P5. **投影到新空间**:; C. X3 l4 r" B
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
* j1 N/ D5 t5 y+ J
- b6 B, U5 E0 V8 _0 Y" o! |## 示例代码6 s" a2 N" `: r* n" h4 ?/ M, ]

0 q! `0 u/ g* G2 g9 k: [) U下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
9 K( U8 o) Y5 e' D) v8 Z. j- F* J% \) C8 p* u( |& F
```python5 Y% I5 m6 P( [2 b  K
import numpy as np5 A7 _5 L; K  }2 q: {
import matplotlib.pyplot as plt. l; N- ]6 F+ z/ F5 [% R) l
from sklearn.datasets import load_iris
1 K$ B6 T9 U& V: Vfrom sklearn.preprocessing import StandardScaler
+ I  x1 }, Z1 u3 v4 F/ g& B+ L; M  ?
# 加载数据集(这里使用Iris数据集作为示例)
0 W+ j; f% c5 T: }% A8 Cdata = load_iris()/ ^' U- u  D* |. o" M. n# G" e
X = data.data  # 特征数据
' `/ K+ a. q- ]- h, I! T. @$ O9 ty = data.target  # 标签7 X) D7 w1 I/ S6 l$ H; Q

9 R/ p8 E+ b& }, {6 W) m! H: `8 C8 |# 1. 标准化数据
# N# H  a4 w! z$ Zscaler = StandardScaler()- A7 x) B: [/ r) |
X_scaled = scaler.fit_transform(X)
& ~6 `8 q/ H. X* U: J0 s2 i2 J% B3 [% e' e) R# E, \
# 2. 计算协方差矩阵  E6 X9 b0 i+ H5 J! ?5 j% ~6 |; r, g
cov_matrix = np.cov(X_scaled.T). ]2 U% D3 h& h- R: |% n; \
& ~9 k) ^! s% H0 ?$ P6 ?
# 3. 计算特征值和特征向量) K$ J! Z1 M$ _$ K& Q/ l. S! c
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
( q6 L  Z1 g. E# U) a. v, g( S6 f" o) l5 P, G
# 4. 按特征值从大到小排序特征向量1 F. Y/ A6 W* E. i2 _7 Y$ Z! I
sorted_indices = np.argsort(eigenvalues)[::-1]( T% g9 \4 }7 n9 n; r
eigenvalues_sorted = eigenvalues[sorted_indices]' g) g  N( U5 X% e; v7 H/ r
eigenvectors_sorted = eigenvectors[:, sorted_indices]
/ T$ R; t# f2 ]6 q; q2 T+ h& w( Y9 ?0 g) o) _  Y
# 选择前两个主成分8 V. L% B# W$ I! b6 s5 R% s
n_components = 2
) I# [; w( ~+ j+ n% h, v2 T) @7 hW = eigenvectors_sorted[:, :n_components]* z* Y7 J5 ?8 f2 n
; d. C+ a2 ~+ z* H9 \6 R
# 5. 投影到新空间1 u* Q' E* R8 B; V
X_pca = X_scaled.dot(W)
; F7 L; ~4 O, m
  o/ U$ Z2 d6 ]# x! y# 可视化结果. c8 z3 |3 `: T" O: \/ g- N
plt.figure(figsize=(8, 6))* g/ G3 e3 H3 P. v) C7 u# Z
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
/ X/ f- p6 K+ X1 X6 {; ~2 _* d    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])1 W" R) I! W! b+ O( n7 k
plt.xlabel('主成分 1'), V/ s0 F) s2 y, q# k
plt.ylabel('主成分 2')
3 c' ]5 C6 ~1 v; P& T7 X* splt.title('PCA - Iris Dataset')/ a! Q2 F: S# D" H8 V
plt.legend(). F$ Y/ l4 \3 C
plt.grid()
5 `: w( a! A4 l/ \plt.show()% `" n6 S! o; f; J1 b
```" W+ ~& G9 n# D% S9 n# X/ b9 ], p

8 J6 |. W4 [' z0 l% y; J) b### 代码解析
! p& A) j! L: c& A9 r# z
. Z- W; ?, D$ r: @3 i# {" f0 Y1. **数据加载**:5 H5 O! Q. C' z4 m5 J
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
9 u: C. a5 p, O5 P& _
0 E$ ]0 s. Q9 u+ ?) }" Q2. **数据标准化**:
) j/ F# q" y: s   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
$ c# Y9 V' f5 I1 X8 ], W, ~4 [5 c# t( f3 I6 z0 N# s
3. **计算协方差矩阵**:
6 I6 L* Z9 F( G& ^) Y: H   - 使用`np.cov`计算标准化数据的协方差矩阵。
/ h. j* F  s% M5 H0 f8 R6 n& k' J/ U
# C8 D% ^7 E5 |% V; ~, K, V4. **特征值和特征向量的计算**:4 k. r0 R8 C- `5 {
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
2 i* y9 A7 q9 D  [- R. Y" S6 d% E% E7 J+ {' Z4 d5 \5 [$ M
5. **特征值的排序与选择**:5 s# Q9 ^* j! V$ ^1 a1 W
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。$ C3 I( x( e3 b4 i5 N9 H3 G: Y0 \
: S# s9 B1 \3 e- E& h( }9 }
6. **数据投影**:5 d; V1 Q' i6 M: K  M
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
" l( @* p0 O+ V' _2 y4 Q# \  ?6 N. C! h
7. **结果可视化**:6 s9 f( A* u2 ^( f- k% I
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。0 Y3 g. J4 ]- |, l4 N* ~8 n, F, ~

5 o! x( ^* @9 t6 \; |7 X$ S# O### 总结9 e! [! }- q# [! D: ~% n

: Y# Q* `/ x/ I4 Z5 U3 i3 FPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。: g6 _3 @! y# `7 i3 D& `- Q
+ i) t% @* h( C& P
如果你有具体的应用场景或需要更详细的解释,请告诉我!
0 \0 g' j" J+ _4 y5 u# E6 j2 `+ W. e& V

! H7 @! n. ~& d! a
9 t# w" t% r3 ^1 i. S/ X8 D

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

回顶部