QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
& P1 H- b$ z, X- F2 d' C
/ B5 p( T) C) i, {! V3 A! w+ K9 a* P. M## PCA 的基本步骤
+ T; c0 k; ~2 _+ ]) Q
3 d& ]& z0 ?; w4 `6 H6 n+ f1. **标准化数据**:' }; U- S, t' M( O' E
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
) f( \$ K6 f' r$ S$ O$ z
, {, E7 E( C5 j  X% Z, `1 r- S2. **计算协方差矩阵**:
% u1 j: C+ X" G) T' }4 D   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:  U. M, D' W; w
   \[
4 O  }5 Y5 V3 y. o4 m   \text{Cov}(X) = \frac{1}{n-1}(X^TX)9 |+ }9 V/ t8 z8 C
   \]5 u" U' v' m# p; m" x2 ]
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。& r8 o2 N0 R4 i: I- l

$ K3 i) l/ n0 s9 z% f3. **计算特征值和特征向量**:
1 @2 _1 X8 P/ ?; G* U' u   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。: d" L/ {0 R7 s$ k7 ]" [
' I4 l& e* b8 j  S- U# l: _4 C0 Q
4. **选择主成分**:8 l0 E- ^7 t+ X4 q/ g- O) D& B
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。+ q/ Y- z# q/ @$ H

/ r; l+ u' o. \" T/ z5. **投影到新空间**:3 g# g% K, h1 C
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
6 c. W# Q2 d! L7 l; n" E7 J% o% b2 U
## 示例代码+ z$ M( V* a4 J2 y, r$ A! O0 \$ g
- X" @& E+ |! n6 |1 O5 }( J
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:4 ]* E$ e( H& a, T! H( o7 p) N# t; Z

% j# O1 N3 V# T9 j; s```python
& }1 c9 K/ a! T9 `import numpy as np
# m# B0 G+ i! p' r; b6 A  x3 wimport matplotlib.pyplot as plt
' E1 ]# T' q2 r/ X) ]from sklearn.datasets import load_iris4 @$ m2 A: v; K3 X
from sklearn.preprocessing import StandardScaler
; z& R; J  \! o4 E1 t) n" C' W4 _3 |/ D- F9 ^% I9 b
# 加载数据集(这里使用Iris数据集作为示例)' M, i/ I* ^  k# Z$ r( n7 p
data = load_iris()
% N) e, i3 W$ I9 l" {7 N7 hX = data.data  # 特征数据
/ q! e+ y$ M$ Hy = data.target  # 标签* B$ T+ w! Y: X0 }  T' Z
( z0 w2 I$ Z2 R2 W( o
# 1. 标准化数据( x0 T$ F# y0 E) I
scaler = StandardScaler()
" M, U- T" `- N- g/ cX_scaled = scaler.fit_transform(X)' N8 q- d8 H4 g; ?

3 {" Z& ?6 z8 a( X6 R# 2. 计算协方差矩阵
( k% j8 P+ Q6 j3 R% c( rcov_matrix = np.cov(X_scaled.T)6 m& G& G6 f  }0 a! `5 o& q( Y% b' P
: S% A1 @$ \% P8 d7 T
# 3. 计算特征值和特征向量
1 v4 N0 S+ l% q, A. Ueigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
, I& o% c1 z6 q1 c2 Z" I8 {: ]
" N; b* s5 c2 P# 4. 按特征值从大到小排序特征向量
- X4 k5 ~- ~- S5 V$ hsorted_indices = np.argsort(eigenvalues)[::-1]6 M& f, v: b2 t4 f
eigenvalues_sorted = eigenvalues[sorted_indices]- ~* F1 p* {) [; T  v
eigenvectors_sorted = eigenvectors[:, sorted_indices]
; {$ b* H- X& |4 n/ N) i8 Q# y0 ]4 C; D0 H4 G3 }
# 选择前两个主成分
/ V6 S  [* H4 O* ^3 q. f( P4 m+ An_components = 2
; ~5 M* q4 m8 [/ R. H# AW = eigenvectors_sorted[:, :n_components]
  Y- g8 b: T9 V6 E' m) E7 ?5 h9 O$ f4 H. w% J
# 5. 投影到新空间$ d- g( }; w' R3 a2 Y
X_pca = X_scaled.dot(W)
6 C/ |& s. H# F
6 s5 n. j- X" z- |# 可视化结果2 H8 X5 c' l( F
plt.figure(figsize=(8, 6))5 n- t& ]5 e/ [
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):8 W: c5 E! B; ]! ]0 S/ W5 A
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
! z) v& k3 \  Dplt.xlabel('主成分 1')
, @: R5 E8 ~6 O; X+ e% T$ ]plt.ylabel('主成分 2')7 j- \6 V/ j7 q( s6 {
plt.title('PCA - Iris Dataset')
& Z; W, T: x; D; b, c0 b% ]0 x2 d. n' eplt.legend()
# {: `9 Y% {; F# O, z- e7 Qplt.grid()! [1 R9 O/ t+ c" C, O
plt.show()1 C' i6 K( n6 w) O0 o
```0 T' z0 e$ P7 `- {3 m$ `
2 o( k5 H) r$ v+ l
### 代码解析' Q. F5 n, q9 z- |. j, s

3 Y4 z9 ^4 S9 e" P1. **数据加载**:
* n: j) K+ E; M( Z8 }   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。% H$ o; U) D9 V7 N6 \7 a3 @* G- e

) ~9 K3 W/ N' L  `9 V* g. A# |9 j2. **数据标准化**:/ C5 N/ y' L6 ?- {
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
9 V$ d7 Z" {- B% V. ^& j) s9 V6 h* U/ P) o  j; G; u
3. **计算协方差矩阵**:9 D7 d& |! h3 ?1 J' j+ H
   - 使用`np.cov`计算标准化数据的协方差矩阵。8 W. M; [: V+ D; ^! O' B
) A: m& b' R5 c  g5 o3 N7 W# B
4. **特征值和特征向量的计算**:3 ?6 }9 s0 t5 m# L$ u8 ^
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
, G; X4 g% a, L/ e
( ~8 [& g0 q' Q+ Z0 W# ^; E5. **特征值的排序与选择**:
9 s  N1 c' l" a   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。9 w6 |) l0 @7 w, C3 I5 t
# k5 _! K9 c  H5 z8 N" w
6. **数据投影**:
4 N% J7 h# M5 k# Q' w8 B   - 将标准化后的数据投影到新的特征空间(即主成分空间)。# _+ V* c. ^/ g. |
/ Z- j( B+ U5 \' n0 P8 F, C
7. **结果可视化**:. `& H7 [! [# B+ A) ^3 t4 @
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。: c* I6 V- E* v4 i

- w9 u% _5 y" X9 C) D' l### 总结
5 z! V! }6 G, b  I  x  I9 h! f5 \% b
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。, d( B8 q" W& m

6 a& y$ y* }6 M4 |* j1 g  l" }* M0 z如果你有具体的应用场景或需要更详细的解释,请告诉我!5 j6 C7 ?. l0 r9 T. H6 n* p+ k

0 K$ E# X9 C( H7 i7 l, }0 D4 S5 G
" |4 u, z* {) f/ C2 Q6 C4 f+ o
2 [. T$ f% a+ w, y# 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-6-10 23:34 , Processed in 0.437211 second(s), 54 queries .

回顶部