QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1198

主题

4

听众

2975

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。  ^# L  R* i! \- b  P
, B( b& v* p  ?! i
## PCA 的基本步骤2 r% g8 J1 ~" F4 z! b& b5 a
: s0 X5 e) D$ h* j9 J, C8 }. z
1. **标准化数据**:5 T8 m4 {! q) x9 {6 b
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
0 x- Q1 \, w! B  O4 f% O0 f4 A: X& }  ~* d' b
2. **计算协方差矩阵**:& _7 C; P+ e5 A. l2 f. F
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
0 H# ^8 q3 a) S  A* M   \[, t. [& V  M8 E( K2 x( y
   \text{Cov}(X) = \frac{1}{n-1}(X^TX): V& h- W& q& ~1 @8 P4 U7 R
   \]. P) v( `1 K% P, r4 s8 V0 D, k' p
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。" i8 a# G: e9 R) X
$ N4 I( ]; m- T
3. **计算特征值和特征向量**:, j4 C1 e6 i* b$ w" \4 Z
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。% X  K2 M1 X- k. I3 Z1 B* u
5 Z4 r( {1 @4 `: Q  U
4. **选择主成分**:# e3 G- M4 C' E5 M5 l5 \7 d; h
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
; b, T& Q+ i# J5 r4 A$ {( a
- Q3 H+ w) l% U5. **投影到新空间**:9 ?1 N1 z% ?5 u2 [- i
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。3 L( r% y; ?! S" U; J$ n$ q
4 ^# C7 ]. G* ]) _+ \2 X" V
## 示例代码' j5 |) x$ y! G8 _4 \
4 Z7 A8 p2 A$ b* |- G
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:/ E" f; f2 V* O- G+ h

3 b/ a0 W* T; w```python
3 C; u& {5 c% P  s0 n# w, \import numpy as np  ^! o) ?2 _' O$ N8 S
import matplotlib.pyplot as plt
  s! z3 ^$ @; t( x* t" Kfrom sklearn.datasets import load_iris, O5 I/ B" J. F4 k% O
from sklearn.preprocessing import StandardScaler' R, B' ]& K7 x- s7 B1 k( J
7 `1 F- t0 g% X/ M
# 加载数据集(这里使用Iris数据集作为示例)1 D% K- b! \' W0 ]- `
data = load_iris()
  e" c( z, m% I$ S5 P: d) jX = data.data  # 特征数据
+ f) K7 {! r, w  [y = data.target  # 标签5 M/ v; E7 C+ E# `$ U0 l/ {+ H

) j3 t2 }: y1 N) Y5 [- h# X# 1. 标准化数据. \$ F& t9 |: j) U+ C* H8 y
scaler = StandardScaler()+ W  a( e# _% Q/ `
X_scaled = scaler.fit_transform(X)& y  g5 Z# |0 |
# Z$ {/ [+ g! a; \  `1 D# s2 z
# 2. 计算协方差矩阵& f. U% I2 U  F2 c6 E
cov_matrix = np.cov(X_scaled.T)( p" F, k) `  |3 ]8 s6 {

$ c6 t1 S, p4 D1 D( c+ B4 s( U# 3. 计算特征值和特征向量* A* I  [3 P* P" X# ]0 R
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)) W& z( D! k5 k5 [8 P

  A9 l9 J: o6 r' f# 4. 按特征值从大到小排序特征向量( o! j4 }& e' t8 M+ s( a
sorted_indices = np.argsort(eigenvalues)[::-1]
" r3 g6 \% H- }/ b3 p- B* Z6 Jeigenvalues_sorted = eigenvalues[sorted_indices]
% F8 g6 B; Z1 `1 ^9 p1 H$ Peigenvectors_sorted = eigenvectors[:, sorted_indices]
. P4 A# n$ Z% z; v2 [  _, q0 ?, a9 z. ^* w1 \  b  f# L5 J7 x
# 选择前两个主成分
* e9 }! k/ j# k% R* vn_components = 2
) k/ y2 p- W1 d) a6 x) R0 DW = eigenvectors_sorted[:, :n_components]
  o1 z+ j6 ~0 O: k2 }! G, Y; f# b# J) n5 _+ ]* y1 I2 T
# 5. 投影到新空间* G3 ~7 C7 I" i0 z7 \
X_pca = X_scaled.dot(W)
  t# K' D' l$ c' `, ^7 H( C6 c% f7 p
4 l0 G/ t- P, c9 S# U) _1 s5 n" C# 可视化结果2 }6 E% M. }8 @3 M# c  a% w
plt.figure(figsize=(8, 6))) A- r2 j, W  r1 a9 @' [9 W
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):; n: x  |' y% m
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
0 x$ }; j" _, uplt.xlabel('主成分 1')  U3 S' `( I2 b. m/ p9 E
plt.ylabel('主成分 2'), c% [* x7 l3 j; T3 D# A
plt.title('PCA - Iris Dataset')/ ]  Y5 {2 E7 z$ I3 K
plt.legend()
+ Z) t5 O, g: R( I$ ?plt.grid()4 p( E+ G1 O& z1 P, G
plt.show()3 K9 a; G: p# ?3 M$ V1 }& d! G( r* T# Y
```' p' k/ y, l0 W9 |9 W4 K  a

; P# v7 g4 A/ V% x### 代码解析
9 g9 V' `& H% d. v9 O7 |2 u5 s# ?! ~( i1 b7 A1 `! a& G2 |
1. **数据加载**:5 y7 o$ N% s- n0 A# N! }+ H5 w1 r
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。/ s* [' r' p3 D# ?; J

/ Y1 V& j7 Q0 y! z$ R% }2. **数据标准化**:
( B; T: z, y& Z! f: }% s   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。" f: e" t9 Z% N  ?4 R9 W

! P! l* T+ K0 ?+ L( m3. **计算协方差矩阵**:& k% X0 R! ^3 R2 @0 `6 v3 s5 {
   - 使用`np.cov`计算标准化数据的协方差矩阵。
4 Y/ E9 s$ k) k1 T
. U- u- i+ Z. x+ W2 n) V4. **特征值和特征向量的计算**:; |) m3 L( E2 f/ g* D
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
/ C& i8 X. q7 }+ x! @3 c2 F: x$ C8 f- O$ ^' F8 P4 z
5. **特征值的排序与选择**:; i- `; u0 b, W! _+ n8 d9 v* Q  P
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。8 N& U- w; K' g# h9 Q
6 J2 e" J% K" ?
6. **数据投影**:
. X* G$ p0 }1 x0 J2 Y   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
. G! k" S5 U4 a. Q
) p7 T$ f5 j" j7. **结果可视化**:
0 l& }: Y9 K% B! ]& b3 Y8 n   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
% L0 D# F0 t1 k: a: h- |8 K- [5 c: ^8 S' `5 A
### 总结
  _# l9 ~7 u, B6 o1 n1 n! u. A/ e- y) s# @$ B
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
7 x$ Z, Z$ t% h5 r1 w6 Z, i" X$ I* V/ O# v# \
如果你有具体的应用场景或需要更详细的解释,请告诉我!$ _/ h" d! S& Q" U/ r

( v  u+ E, l- I; a
6 l- K! V) w; l
: K$ t: P  I0 o

主成分分析算法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-9-12 05:01 , Processed in 0.637811 second(s), 54 queries .

回顶部