QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
9 ~, ^  d1 F$ V' a9 B4 N! z$ d- g* @5 }* D
## PCA 的基本步骤
" |0 ?: t9 C( l9 b: {6 r
2 F5 r/ ?4 `! l5 H8 t: j1. **标准化数据**:. Z7 v  M9 E! K( J
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。, N( Z$ d/ U1 q

, v2 Z5 a  c8 H. {& U# v" Y& W2. **计算协方差矩阵**:' N6 H- e* |% x+ @: H% S
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:  z6 ?0 Z( t3 K; V; q5 L/ M
   \[
7 R: S$ Q. L6 o1 G5 a* p# m   \text{Cov}(X) = \frac{1}{n-1}(X^TX)& u& H( W. z% v6 l% {
   \]
7 G" N6 G1 I+ d7 h  X1 j. H   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。, G" f* T  ?+ q, ^! _

% O: G4 {! ^) n6 y1 m  t0 i3. **计算特征值和特征向量**:5 S: J  W2 v* w9 x& [# L- t, D( J
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
7 }3 B; k7 H6 I6 |' o6 O* A& I
! ^. G2 a) {9 g3 K' }7 t5 C4. **选择主成分**:3 F5 P8 `9 o( W
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。6 J/ {0 f: d4 W9 i( G) z
9 Z8 R9 y" ~/ x8 s
5. **投影到新空间**:
2 o3 F1 T0 s$ K# h, z   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。0 ]6 R3 O0 e' y% X  `

0 u. N$ B& W; F1 R; g## 示例代码
2 C( G  X+ p5 K, w- n) {9 I
3 e) M3 r" x$ G  A2 C下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:" K0 r! N) d% k' E) J  f

5 B5 h: o* W. p( ~0 V' Z```python
$ Z9 M2 @, l8 I0 R- F; G9 |. fimport numpy as np
5 M/ l- K7 V' n0 _# {' h  Pimport matplotlib.pyplot as plt
: j) b& \% @  C3 W5 }/ a0 P7 ^, f5 c( @from sklearn.datasets import load_iris& |/ ^  s# W* Z" O( z) V( p7 `
from sklearn.preprocessing import StandardScaler
) a* z4 B$ x8 [+ e9 {' ^0 c' P* l; n: ]9 f& t
# 加载数据集(这里使用Iris数据集作为示例)- G* U# v: L0 N1 J1 Z7 M5 _4 V7 N& b
data = load_iris(): Z. h4 Y" \" `6 T1 [4 P1 ^4 ?1 m
X = data.data  # 特征数据3 Y6 M* o/ z9 a/ T7 R# h6 w
y = data.target  # 标签  J8 Z, K5 n7 f, r3 F
; l2 u0 D9 N8 B* k; e% r
# 1. 标准化数据8 D7 D. U9 D6 R3 u( a
scaler = StandardScaler()
: M- ~- u# Q$ MX_scaled = scaler.fit_transform(X)
. h  ?4 y7 s, Q4 Y$ S4 |7 k' C; \) ~; {  _8 M0 S
# 2. 计算协方差矩阵
, [. `' G, N7 u* o6 `% W" Ycov_matrix = np.cov(X_scaled.T)4 f& P& _0 O0 ~  ~/ D5 f" K
. D5 F/ p8 n7 g* b5 ^
# 3. 计算特征值和特征向量
% S' G  W; }8 X4 ~5 o9 N$ C0 j, Ieigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
& `# x" m6 F! {5 Q% Y
+ o( a' d8 k+ B* L  w  K# 4. 按特征值从大到小排序特征向量
; ~1 i2 V. l3 Y7 I% `4 ~sorted_indices = np.argsort(eigenvalues)[::-1]
+ e6 A$ q' s5 F4 D% feigenvalues_sorted = eigenvalues[sorted_indices]
! h; k& `% G& t; K. Y8 Xeigenvectors_sorted = eigenvectors[:, sorted_indices]. F9 c* x# c+ h, Y& p
$ x+ f7 Q4 Y1 ~0 O/ ~8 B+ I6 G
# 选择前两个主成分
0 S6 e( ?  m  E7 I  Bn_components = 2: O+ [* y3 N& r& H
W = eigenvectors_sorted[:, :n_components]/ }/ |( Q9 y5 |6 N# P% y

3 T- s- k/ A1 u3 ~+ w# 5. 投影到新空间# D6 Z' J! f  |4 G% b3 d
X_pca = X_scaled.dot(W), ]9 q% _+ r$ i( k  C
# A$ k! t% w/ b
# 可视化结果
1 y2 k/ X9 x4 r0 _; R* X$ j7 Wplt.figure(figsize=(8, 6))
1 Q+ ?% p8 E; n# Dfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
; ~) x8 X; r, e8 ]* b    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
" K9 p6 ^; s5 G$ ?plt.xlabel('主成分 1')
$ N5 d( f+ v4 A+ m* Splt.ylabel('主成分 2')
7 e$ R) h  Y, A, t3 A. ]. L+ w7 Qplt.title('PCA - Iris Dataset')2 F6 z" S6 a" \
plt.legend()9 o  I/ Q3 `& F. w) a
plt.grid(). Q  f, [7 W/ ~! B& E" s
plt.show()" n, l) c0 ~1 W
```
, r" _% @' Q* e+ a6 E- p4 W, q. ^8 S+ f  k6 b+ a1 C
### 代码解析
5 E, b7 F& p1 M: t. q( e0 A# ]
/ Z  _+ |# q/ H  {: N1. **数据加载**:
) ?7 n2 |) X8 J( l& {$ E- ~   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。( T. H3 U% L7 i: F# d1 c

# ]4 M( n( m$ l  s. I) X) Q2. **数据标准化**:
( r. t1 N9 A9 u1 ?, x* r$ r   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。+ r! \* R! E& a# R  |% m
9 c, r0 E- m: T9 w7 n
3. **计算协方差矩阵**:. A( K( q1 w; u6 T: J
   - 使用`np.cov`计算标准化数据的协方差矩阵。
  o( \+ |7 m/ y
( S$ I: d7 N0 K, m4. **特征值和特征向量的计算**:
* A/ Y- }* }$ u/ q+ p! B6 B0 m   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
, i# A. u* V* ~- p
+ ^7 \/ b: V! R5. **特征值的排序与选择**:; ~" W4 ~# c% J4 l% q$ V
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。5 F- _& N# X. [& [0 K1 \( C
2 Y* ~# o# [! H
6. **数据投影**:
5 v$ P, i8 ~9 l& s1 E, v* Z5 e1 u3 ^   - 将标准化后的数据投影到新的特征空间(即主成分空间)。" L( L+ _; V, Q. V4 p
( M4 `$ Y: S6 M5 J: \
7. **结果可视化**:8 f) p) n6 }2 {/ K  m1 B: J
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
3 m5 u: @& T/ _
1 U  J" U* K  E# x* I$ ^' ^) a### 总结; T9 |+ S+ d' S/ c) x
: R5 T1 t7 o2 a, H$ ]$ `* T
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
! b& A  z5 @3 ~- w+ ]) U7 ~6 N8 a& J  I, O- ^" `/ R% J
如果你有具体的应用场景或需要更详细的解释,请告诉我!# I9 o6 k0 L7 B- h
% s2 Q8 ~9 N: C8 w" x6 X

  Z: ~, L+ S. H# {6 f. x
) O1 \# I1 r1 o& K

主成分分析算法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-27 11:30 , Processed in 0.426080 second(s), 54 queries .

回顶部