QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。8 R) y8 f$ y3 @
5 F4 h) V* e. i
## PCA 的基本步骤
8 p6 q# _' A! H4 O& M- ]. h" ~" C6 F4 _# B; l1 A/ i5 X) k; M8 T
1. **标准化数据**:
( e4 W9 }; d& g0 S   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
; i9 G6 F' n" t& T; y
8 I9 }0 `+ D/ l2. **计算协方差矩阵**:: T  c( D4 D; y; w/ j
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:1 f6 X  P4 \% r7 \5 M; ?8 T. z
   \[
8 J  L; N+ m1 `8 o, t   \text{Cov}(X) = \frac{1}{n-1}(X^TX)5 l( o. h0 O! V
   \]1 F; _9 r/ z- h- b( L+ ^3 n% P+ w
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。9 |6 p6 R/ B& A# A, @
$ {1 P, M* y# X) x* `* Z) A
3. **计算特征值和特征向量**:2 \) ?. d; K1 n2 i. o0 s% D$ N6 b! H
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。9 w9 W6 |" h( c. f. v0 j) b) w- j
! P' V  O" G+ s6 u2 i, N
4. **选择主成分**:
1 Q9 p% s$ a7 G$ s, X   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
; n3 O4 s+ H. a8 T
. ~( U1 g# u5 C/ W$ P" M# B' k5. **投影到新空间**:) w+ Q1 X' h% @' o1 A
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
" z0 q# |  U: a: P- R0 w5 K
. J- i2 M4 W' L0 ]7 N3 l, b1 a3 `. K, f## 示例代码" [8 h: [# j! i5 s5 H  B1 p' }
- ?: l0 C7 P, [& e8 W
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:$ H8 @1 x! M  T9 S

! a  }. S, q/ ?0 K5 B1 T```python
, @2 X, T5 G8 `" n; Q9 p8 L* Pimport numpy as np
: A- P' e2 l* w# f% B2 k2 nimport matplotlib.pyplot as plt2 x% G, i  A. H
from sklearn.datasets import load_iris+ Y- o  g% L# D1 p- y  o
from sklearn.preprocessing import StandardScaler1 u7 J' ~, Q, h

  H& B( f8 b1 d8 F% \- t- m7 C9 }" F6 {4 ~# 加载数据集(这里使用Iris数据集作为示例)8 u; G' ?; C1 D, i1 _
data = load_iris(), K' m  y# g  V( }0 l8 A& N: J' C
X = data.data  # 特征数据
6 T! j6 i7 ]+ O; i( q3 x/ cy = data.target  # 标签( ]. M5 E, m3 I+ N
) [; c( s7 n- M$ \1 d  D
# 1. 标准化数据8 H. d$ e* J, q6 L- F4 X5 _5 @  ?
scaler = StandardScaler()
/ D9 L2 U: g6 N* UX_scaled = scaler.fit_transform(X)# X  O6 j; i6 H* i8 u

) E4 H8 e, g2 K) I" s# 2. 计算协方差矩阵: V5 m  A- H# z5 Y' q1 G6 _
cov_matrix = np.cov(X_scaled.T)$ g0 j+ @- `' Q+ e+ B
; |. m4 J* J2 I2 l7 |4 m( w
# 3. 计算特征值和特征向量: N: b) L/ F" ^
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
5 x0 x- @3 h0 N1 n5 C( @$ H: d8 L: Q' H
# 4. 按特征值从大到小排序特征向量: ^: R' b3 ^7 c, U2 s4 \6 ?
sorted_indices = np.argsort(eigenvalues)[::-1]. v1 w: W  s% d
eigenvalues_sorted = eigenvalues[sorted_indices]; _  `( E! E6 e
eigenvectors_sorted = eigenvectors[:, sorted_indices]
& v  O9 q$ b8 k$ u3 q. ?9 ^# E1 f: e( o
# 选择前两个主成分
7 ?( z7 T$ o4 o% N$ Vn_components = 24 I6 f' T. U& n" J) T0 W9 P
W = eigenvectors_sorted[:, :n_components]
- |8 Q2 w7 c, d) I9 {; q
. ]6 P3 [7 k( @: I8 H( p0 e$ P# 5. 投影到新空间) P$ r7 b3 y* d9 s6 O
X_pca = X_scaled.dot(W)( t' e! P( H4 z9 E% j% s7 C% [

% d& v5 W- E8 C" `" M* I# 可视化结果
3 D+ ]; o* K) ?2 a. splt.figure(figsize=(8, 6))2 w4 }4 E0 x; P4 C2 G$ }+ w7 p
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):7 B2 Q4 P7 v; K3 g
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])5 X0 f1 ?1 y' M8 |- u2 X  k
plt.xlabel('主成分 1')
7 Z# Y6 l  U. p, G6 p# Pplt.ylabel('主成分 2')
' _6 M6 I7 U6 E5 ^9 D& \plt.title('PCA - Iris Dataset')1 u2 l7 o& v6 G' K5 t: C, t
plt.legend()
: o8 x% I1 T4 |5 r! m% iplt.grid(). X! J$ r# L; p. x' `$ L
plt.show()" O/ R; B2 e2 I  K3 _
```  u9 m+ q4 D" n3 B4 @, \2 \1 R
: m. M7 F2 F/ d9 p7 C1 S
### 代码解析
' h) u, h7 _/ I! I" x/ y
: `0 a. S/ y6 `& i: Y+ f1. **数据加载**:' q& i6 x6 o8 E2 r7 }* D
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。2 \* g6 h% Z1 E7 j/ o% A1 g) {* ?( h
/ U$ z! h* M$ S! e$ y4 [( f
2. **数据标准化**:2 I8 B, b, v! H
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。" R& C2 H" Q3 l' g3 x$ L
- F* o! _+ {1 b0 x: M
3. **计算协方差矩阵**:7 c- ?9 r$ h0 Q7 G6 i
   - 使用`np.cov`计算标准化数据的协方差矩阵。/ R  d2 m. m( c( i% h2 m6 d4 Y) a$ B. Y

6 x* F+ j8 }$ T; @4. **特征值和特征向量的计算**:' K, x" Y9 Y: @+ E; O
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
( A' _* h7 X$ x( Z( L# P
+ {5 j7 J+ r0 f1 H5 n9 t5. **特征值的排序与选择**:7 _% N3 a; P7 u+ P7 p& Q
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
! E& h7 N, y2 x: Z# T
. P! {% d5 l0 s9 O7 g2 a2 ^3 g6. **数据投影**:
% R( ^- d" M7 l2 A, ^   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
7 f. [! Y! G& M, M8 s
8 ~1 r3 s3 E7 y8 d, o/ ^7. **结果可视化**:
- ^, D$ @4 d4 f. G5 Y2 |   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。+ r+ {7 j2 N/ I6 ?
2 o' a$ k0 M# e, @3 E% E3 a! T5 @( |
### 总结
, k. a$ G' w5 r' S0 _9 V7 z# k1 X
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
2 H& P2 d. p0 \4 ]* c4 L
( g" a8 g- e, G& _+ b7 p如果你有具体的应用场景或需要更详细的解释,请告诉我!
- K6 F! t9 r9 y  C0 k) _* @& m& e, U( M/ l
3 B& y# k' p& y

3 r) a7 s: }/ ~2 @8 ^* m! u

主成分分析算法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-4-23 07:54 , Processed in 0.461339 second(s), 55 queries .

回顶部