QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
1 c+ C$ N+ ~7 n: t3 z
4 [/ _% ~0 Y. [' c. x3 \## PCA 的基本步骤. m7 R3 l1 C' T
' k' r. W5 [" Q8 U
1. **标准化数据**:
3 e/ Y5 n6 r  R! V8 X/ D   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
, E, [! G- ~3 n+ i/ M1 y/ P  X, p' h: M' T/ C$ e
2. **计算协方差矩阵**:% f" k. p3 Y  [7 v# C$ v, U
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:" n4 l5 p  \  L, p' r7 F
   \[6 b7 Z, b# s4 c- n4 x- H& ^$ o* R
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)" P7 H9 W6 y5 b2 g  G7 T
   \]
% E( @2 o% y  Z* ]! j5 E4 l. F; i" r0 T   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。$ e0 ?  i+ F" C, a' J/ Z

4 Q% K0 I. q3 r( C5 q5 E3. **计算特征值和特征向量**:8 ~! ~2 i' k7 T2 W5 l
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。$ G) }" X, v! J3 ?. m

" h; q. R. N" J6 g% b1 v; ^/ K4. **选择主成分**:. P. v' U; c! m2 E# |) k' D% R
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
9 \: x5 @3 t7 \* i1 `
* q  {/ ~" J8 ]0 d) T, X5. **投影到新空间**:
# Z! T/ }* i" b5 S5 a" f   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
7 Z7 ^3 t  i5 ]9 t$ X! N8 V( F, ]' r- c$ _+ U( g: W7 b1 u+ W
## 示例代码! [9 }8 _+ [, r. ^
( d, l& c% t- I( k# [, v- S
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
6 \3 B- ~8 X/ x" c' Y$ A; r
7 N* [. s/ a! K, q4 q```python8 b/ T, S6 \1 ^% g+ G; k. ?6 ?
import numpy as np( r/ _1 O9 w3 Q/ k
import matplotlib.pyplot as plt6 z0 F4 C2 q6 f8 P$ `. v1 H- H6 q
from sklearn.datasets import load_iris0 f9 C2 _7 a* }
from sklearn.preprocessing import StandardScaler. `" \& t' G& k5 e2 a6 u
- q4 ^" F) R3 n4 b! P. l
# 加载数据集(这里使用Iris数据集作为示例)
' ?6 R. V+ s! S' p/ T! Y& K3 \& Ddata = load_iris()
9 |9 X$ M1 c4 L% W$ K0 y# Z4 s" cX = data.data  # 特征数据
5 b+ T: W- X) X3 a! ^4 q+ u" P3 vy = data.target  # 标签: c2 X: e( U& V0 R! B  y# W
, O, G9 i& q% R+ O1 ~- J" G) D3 t. U
# 1. 标准化数据0 B  C. ~: F* w+ r% R7 T
scaler = StandardScaler()
$ s  f0 k! V3 d' D' ]* rX_scaled = scaler.fit_transform(X)+ N  ]& N% h* K3 ?
) l; W- j# G! P  T) R1 O
# 2. 计算协方差矩阵- @& \7 |8 B* l
cov_matrix = np.cov(X_scaled.T)
2 H$ P0 e  y" P1 S
3 N0 c( R* ~& m$ }% X! v# 3. 计算特征值和特征向量
* T" J; H) f" X2 Neigenvalues, eigenvectors = np.linalg.eig(cov_matrix)2 ?5 l5 I# m, m. _5 \/ `" t- G  g( s
) J( [" d! g8 e4 m5 B
# 4. 按特征值从大到小排序特征向量; ~2 @! E5 H2 A. U3 g/ B. |( H  g
sorted_indices = np.argsort(eigenvalues)[::-1]
. H; u8 f2 {  n; H* h# Seigenvalues_sorted = eigenvalues[sorted_indices]) s3 f! o1 }& h# J+ R) i8 k( d' `" P6 G
eigenvectors_sorted = eigenvectors[:, sorted_indices]; E4 v  Z# ?- _  o; W

  n. j9 n( C7 R) c# 选择前两个主成分7 f6 @* H  t0 l- `) r- C" i4 Q, {
n_components = 2
2 I. T7 j6 ?' }3 z+ f9 J: \W = eigenvectors_sorted[:, :n_components]
- g+ h( G" |4 z1 x1 H$ o, P, ~" f# {4 u9 R: I+ G& Q: q* `7 D
# 5. 投影到新空间
; V# e0 I: |9 U) t% KX_pca = X_scaled.dot(W): a8 B* K; f' P- E( y& S3 b

! L9 Y3 o6 f5 E, ]! I# 可视化结果
0 E5 q0 D, \, `: o- Eplt.figure(figsize=(8, 6))
8 e- ~' x! Q" d4 b8 O4 r8 Dfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
8 z! R+ D5 ?9 h7 i    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
" h* O' w9 R) E( V, Uplt.xlabel('主成分 1')
8 c+ p9 C8 h( ^5 n. C9 u( Xplt.ylabel('主成分 2')
7 ~2 Q" M! T7 D+ A; B2 e$ R$ Yplt.title('PCA - Iris Dataset')
! ]- R- K# E- m& @plt.legend()8 X& I$ ~' m2 N8 W, o
plt.grid()
& z; {+ x# Z! ?# ?' H3 d/ dplt.show()
7 W  k" o, v# z- Y```
0 Y) p3 x# G9 C6 x; D9 a& f1 b' G( x" ?$ I3 E
### 代码解析
5 T! V8 \, J0 V
% E* f; d( n2 a# V, ]7 y, D" y1. **数据加载**:
/ s# K* P0 i; H' h7 N   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。' F+ l$ w9 m5 X) |/ \! a  b

% ~  U3 w7 n' w- W1 J) ^/ G' Q2. **数据标准化**:
# j' y+ i8 c- p1 ]   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
( f! I% t: @* G& A4 v$ a( Z* |$ R7 i/ U, o% `! k9 J. ^: y9 n0 L
3. **计算协方差矩阵**:
- c, F2 ~4 \" m# G   - 使用`np.cov`计算标准化数据的协方差矩阵。/ R0 w0 g' P/ M0 ?3 P2 L- g4 u5 L
* X1 v1 y  P) y9 s4 ^  y
4. **特征值和特征向量的计算**:
0 P* s$ \& B2 y6 D( v   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。% Y2 m3 ^( V- @: ?
4 a& k6 J: ~6 H- |2 ?' V* @) H. Q# I
5. **特征值的排序与选择**:
% ?& X$ ?) x2 p! w, L  m2 v! `' o   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。. |: V) R: R, k+ X
. z; O# f9 S; p3 X  |
6. **数据投影**:0 }( }# M: p; @8 l# Z7 n7 e2 d* S
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。2 B4 z7 Q; U, L7 j

5 |/ _/ T2 f3 M) U3 f9 T7. **结果可视化**:
+ F! D4 H1 n5 M( v; q* P6 u   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。$ H7 W! W3 w8 D3 N

" |7 U$ D; n( G### 总结
" r& w# ?5 z# p$ B: W# a( n1 u6 G  O. u( G% A
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。  s& w, _: D/ l* f! Y( {  ]
' y  W6 D, _3 J/ N- v3 K
如果你有具体的应用场景或需要更详细的解释,请告诉我!! ?) h1 u* P4 E5 V2 ^9 Y2 |4 ]
  x: g" K! H1 \; A+ I" D6 p" v: o

4 g+ J0 A2 M! T) F
2 B2 B5 j0 n7 b3 n& [5 b

主成分分析算法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-8-25 07:14 , Processed in 0.422857 second(s), 55 queries .

回顶部