QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
- o8 G, d+ `6 B8 c  ^" u
9 B' \$ S" P% i; P& x3 D## PCA 的基本步骤
6 G& V- g  g. [: _! r1 X# L" d) C( u6 W* D) Y0 L' c2 s8 h% Z
1. **标准化数据**:$ g8 S0 j! F2 i: l' m
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。: f* ^9 ^, u) d  N8 n

6 `3 S7 g5 D" H2. **计算协方差矩阵**:/ c, J9 V& k8 \) d
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:1 N2 k5 ?/ B8 T, W0 O' A
   \[5 G" b& S& U; A# G
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)! A& A" W) u1 L& [3 S7 l5 A
   \]
& f3 V8 f& K4 s: \   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
0 T% b; f3 j' P2 X4 g0 ^
. k1 V7 U* T+ L8 K. }) g( ?3. **计算特征值和特征向量**:  b# g$ v3 X" j/ E$ `5 u9 D
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
& I! ~3 a# ~# s: V: p; Z
/ y4 @$ S/ o' e3 a* _* W4. **选择主成分**:
$ C1 ~" t$ r& f   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。! k  Z3 z4 ]  x; s

0 W& y$ H1 y9 P5 z9 O5. **投影到新空间**:
* w- v* J! o$ F2 P* n4 h) l   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
" _. m4 M0 Y' E7 P. i; O5 O1 l/ i$ O6 i2 j7 p+ b8 E# K" R' n
## 示例代码
, u& N- z6 }4 D: X! r; j5 ]' f; y
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
8 _/ r9 k1 I6 f2 Y. i7 }9 Z/ l: @- z% U- ]! R5 S# D& Z
```python* l. G3 l0 m+ w. t
import numpy as np- `" g7 z4 Q8 W/ i; w* q, y7 q: K
import matplotlib.pyplot as plt
3 j$ v5 v2 Y' W$ Gfrom sklearn.datasets import load_iris7 g1 G3 M' k) ^3 Y8 I& a
from sklearn.preprocessing import StandardScaler
5 O! c8 F# L! o0 K2 Z) ?7 K  F$ @! q
# 加载数据集(这里使用Iris数据集作为示例)
! ^6 o- B# f( E9 Z8 m: y+ |data = load_iris()! [& V/ l2 R0 a! A  L) {  A
X = data.data  # 特征数据9 |6 z- j& u. p" s0 |( \, D
y = data.target  # 标签
) }9 v' w5 x  y2 w4 \& _  Z; C, n4 n
  D8 h8 I7 b  o# 1. 标准化数据
) w) M. S; b+ wscaler = StandardScaler()  {5 A3 q! _" T5 J. K1 G
X_scaled = scaler.fit_transform(X), i& y+ F6 R) I' @
+ X8 r7 j/ @! `7 l% J
# 2. 计算协方差矩阵& {" n# }- X2 G, l
cov_matrix = np.cov(X_scaled.T)0 w/ _# f4 x4 w, Z9 R' j

7 t. T# T. l" z/ U4 }. z% o5 J! h" z# 3. 计算特征值和特征向量/ I  ^  j) I/ R  x7 m5 q9 b  c
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)- [/ _7 d3 p- D8 f
4 }6 B% x- d+ u: J
# 4. 按特征值从大到小排序特征向量) \5 A4 ~. a3 _% r" x
sorted_indices = np.argsort(eigenvalues)[::-1]
4 R' r4 u! R5 u. |; {4 V* feigenvalues_sorted = eigenvalues[sorted_indices], K5 K6 i- L0 L, N
eigenvectors_sorted = eigenvectors[:, sorted_indices]
, W( v- [: ~4 C& R# T* F- \" u# M/ n. k6 _
# 选择前两个主成分- |. I/ I+ @% G  e6 [
n_components = 2  E7 k( J( l% [8 s) `* }; o
W = eigenvectors_sorted[:, :n_components]
7 N  b* \6 Y% e
( w: Z( E7 _+ J# 5. 投影到新空间
* p( x  u( o, w/ b/ V# L; OX_pca = X_scaled.dot(W)
$ d# j+ n4 ~0 U* W3 i2 g* m  b4 _: r  s8 H* }' \
# 可视化结果) j8 l8 I( w% b4 x+ l# y6 c0 t
plt.figure(figsize=(8, 6))
# `3 d* U1 n+ Y; U" Nfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):! M2 X/ n; M- S5 J1 a$ D: I/ P
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
+ ~+ w3 [3 l& P) t1 ?! O' rplt.xlabel('主成分 1')
# F$ r4 M9 }' ?0 H- {  splt.ylabel('主成分 2')
! |* k: ^/ v4 P5 wplt.title('PCA - Iris Dataset')' u( c# g6 u! g. H; U3 o0 b% D5 p
plt.legend()
- E) r  P# H% e$ c4 Oplt.grid()
6 _2 F; k* A) J) e* Zplt.show()
* s6 W; h6 H" _' F/ v```
( C9 y/ H: B/ T2 ?& T: w. z4 \4 e. j
### 代码解析4 P: a- B. y# ~0 t3 K
  k4 e, h- j8 o- q% `# u- J' F
1. **数据加载**:9 u- ~! g0 H- [- i8 {6 ^6 z
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。* P0 n% u% d8 V

+ A  e9 |) {7 T2. **数据标准化**:
! u8 m: t2 C( u, ?   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。0 M4 |: p0 G( S  h) V

" Z" N# a  ~% \$ q* S3. **计算协方差矩阵**:
, d0 j4 G7 s2 }; x5 m   - 使用`np.cov`计算标准化数据的协方差矩阵。7 `- k3 p5 J' t) o% T
. ]6 [0 E8 w" @4 W: N3 M% `
4. **特征值和特征向量的计算**:- j+ Z  s5 e$ c4 O
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。. i9 ~! i5 q  Q. l) S# M4 f- x) u

& L  N( B, `7 b3 _8 C- S7 F# [3 f* Z5. **特征值的排序与选择**:
8 ?9 x" X! \& L% ?* J$ z( [   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
6 {) L) F  J$ z/ }! S6 O3 D9 C% I2 M- W
6. **数据投影**:$ v7 y) v7 C1 |/ N- @
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。) ]' y1 D; M9 a% m' v" C# t
% a+ W+ P+ w& d4 k& s' w5 B+ R% |  j
7. **结果可视化**:
: d  n" J' D* y) [" Y: h   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。7 a3 x$ w- J& J* A2 i* T- m
( r( y1 C4 |. k9 q& S7 A  s
### 总结
" }' E% s& y1 m2 A9 r7 ]! i; l$ x8 e, A  d  _  v% q
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。; y0 H: J. B6 s9 v$ k& C+ ^+ }
- q+ c" Z3 z& w5 S
如果你有具体的应用场景或需要更详细的解释,请告诉我!
5 p/ {5 i' P; w& J
# G# \/ v- X+ A: B5 }+ `' L6 ]8 T6 R, W) v! V9 v
6 g- f7 F) g& I6 J# M0 S2 ?7 I2 g

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

回顶部