QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
. k7 H  r( d8 Z0 m( t; {
( c& S. ^) C$ h% m4 F9 ]) X$ f## PCA 的基本步骤
0 s1 ^9 k) |1 D- Z! }7 S4 ]( H+ \: M/ P1 a8 D1 J( w
1. **标准化数据**:
. k0 l7 w7 s% O8 P0 @   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。- c; V  p2 o! h' J8 G0 o- [
) e  U0 u6 t  [0 J) t$ H
2. **计算协方差矩阵**:
4 Q# E  m7 A2 ?   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:) ]. A9 M% s% S. c$ W2 i. ^$ E
   \[
+ o( }- E( W2 V* K. z% F+ q/ b4 ~: C   \text{Cov}(X) = \frac{1}{n-1}(X^TX)( c( g+ d4 t( q. R, S
   \]; R, w/ k4 }  g/ C8 T1 q" o
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。% s- `4 ]. X1 y

: p4 Z5 w/ P% T4 i$ F5 m3. **计算特征值和特征向量**:
$ m' `4 f5 L/ [! h/ K4 i   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
6 |6 F* J0 I# J1 l' H8 K  ^4 h5 t  @: Z$ V; p1 |
4. **选择主成分**:
3 A; d* w( m7 T8 X! Y   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。5 |0 ?+ j# q  ^4 \7 Z3 Z$ A

$ e9 z4 f) D/ \" J/ J5. **投影到新空间**:: r5 Y. C) ]) J9 r
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
+ n/ D) P) u& w
- @' o: |$ ?2 u* }## 示例代码1 |7 T* ?1 i+ l

( ~+ r+ N1 h! _2 t下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
/ x, r6 |3 o( {) [7 W7 \  m& H" Z( |# l1 L# i
```python( G# C. i6 b4 m
import numpy as np
$ r. N- j, O6 a+ Q" ]' Bimport matplotlib.pyplot as plt3 A" l  o9 s& |7 T1 v. g; S
from sklearn.datasets import load_iris0 L! g  N; z  N2 n- Z; d
from sklearn.preprocessing import StandardScaler
9 l* u+ n. c& s8 ~. \% Z
5 X/ Z* i# q5 z* s0 D- {# 加载数据集(这里使用Iris数据集作为示例)
' l2 G0 J4 h! t0 Gdata = load_iris()
1 {3 e; i/ n( @& }: zX = data.data  # 特征数据/ K: {, X/ U3 q' f4 ^# p
y = data.target  # 标签
: P% @9 d! J2 |$ z5 W2 v, S- t
3 u, r, G  z/ w# 1. 标准化数据4 F& a9 ~- `5 D. X. |
scaler = StandardScaler()( a, U' T- B8 b
X_scaled = scaler.fit_transform(X)6 m( R- t9 ~6 \7 m

! k: p% R( e; d% P" T+ F( g# 2. 计算协方差矩阵9 t, c$ i7 F0 X
cov_matrix = np.cov(X_scaled.T)  o: w5 ~' t( @' D; i3 W* T7 h; |( h" H3 s
+ x+ J; \7 G& f
# 3. 计算特征值和特征向量) z$ P& `, F+ P4 p* _1 R' d% l& _
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)% S/ N) k$ d' c8 M4 z
) n& j: i2 _0 J! t  G
# 4. 按特征值从大到小排序特征向量0 y2 V( ^1 f6 z+ m9 ^" b& @
sorted_indices = np.argsort(eigenvalues)[::-1]+ B& C1 _, q+ Q. _+ a+ E
eigenvalues_sorted = eigenvalues[sorted_indices]7 v, F1 t+ S" N. [+ ~8 w! ~
eigenvectors_sorted = eigenvectors[:, sorted_indices]6 {% r% u- l) b/ r1 }' L' d& z

, [. C- C- @- i, [) ~# 选择前两个主成分
. r' E' B9 I( f0 {n_components = 2
$ [) u& e( L$ {: U8 s  [/ FW = eigenvectors_sorted[:, :n_components]
8 D6 w* |& \" C/ @" K) S, q$ c0 n8 J0 D! H) b
# 5. 投影到新空间
' a% o! T3 {. }4 W: c/ _. Q  OX_pca = X_scaled.dot(W)4 a, e: t9 _& f: K
% k0 M" l2 l; u+ Y# j1 k6 Q
# 可视化结果5 V% r. s3 D; W! K; F
plt.figure(figsize=(8, 6))* Y9 M2 ~# s1 u% K: C
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
* C5 O3 m: d0 q+ d6 y    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])1 n) ^$ J5 C. _3 w' O
plt.xlabel('主成分 1')
6 f# h  d6 z2 G/ T* S, Nplt.ylabel('主成分 2')( w4 U9 w: `* Y5 e; y* V% {5 x4 @
plt.title('PCA - Iris Dataset')' Y7 b4 y# n, }- P0 W
plt.legend()/ x3 U0 @; Y8 q# s+ v+ d
plt.grid()- I+ o! u% M: `
plt.show()
* r. W) f% Q% d& \0 l0 {0 ]) y3 d```* K0 t# G3 b$ |2 ^9 |
* b1 A- o5 a+ B: Y5 p# e7 L
### 代码解析
% K+ @  i2 O# x# F. r6 }2 h7 b& U' J" A  ]
1. **数据加载**:
9 r5 V& \2 p) @0 d. A4 f   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
, J6 M# A. A. \/ o! \$ i6 o5 V, \/ l. u0 R
2. **数据标准化**:6 K* ~, {5 O& v. u: q
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。' }! d/ S0 z$ h1 B

% c+ V) ~) x: x; w) u- Y3. **计算协方差矩阵**:  U' P0 V, r  L6 g" g0 F
   - 使用`np.cov`计算标准化数据的协方差矩阵。
, L/ N* c" y* E0 [: a& e* S
( l" l2 g' \  g" D" o4. **特征值和特征向量的计算**:& ?( c" p' m* ^# z. {8 P8 a
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
8 R- |, x% t/ ?! ]- L
0 f. D1 j; T- j6 E5. **特征值的排序与选择**:
" d; ?( l  y2 L6 y   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
) w/ ^) z5 `) A& s3 z0 Y" f3 u* \: L" A  j/ O) O
6. **数据投影**:
  T2 T0 h( I. y   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
/ b% A  \- N, f; L; H: M
; ], y* z, y2 |! M7. **结果可视化**:
3 z8 _) e9 z2 i. ^" [# g/ t   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
3 b4 B! m4 A- G1 f, c# A% M. o! h0 z' j6 s; |6 z3 J/ E5 m
### 总结
, ]) y3 N0 K) W+ k( {( Y+ t
' |: Z% ?* B/ z2 s6 Z' J& UPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。4 U1 `3 _/ `5 q. ^" q; K8 p$ @
+ e+ }# j, A, _' T
如果你有具体的应用场景或需要更详细的解释,请告诉我!
( b6 D$ E/ _) Y1 d
9 d( N% Z- W& _3 f% q  m. u5 b2 P0 C; l) G' a3 b$ C: R

3 A* ~4 J" o/ i' i$ N3 ~9 j

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

回顶部