QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |正序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
$ k; @, t) J1 @' z' A  ^+ W! v
9 O0 d4 E3 n' L. c/ m## PCA 的基本步骤
* R3 _' M0 X( L' i9 P6 d. z
7 E* _/ F3 h4 H" c. z1. **标准化数据**:
6 D* P7 i1 h# y/ y4 Y   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。# h2 i& l4 Y0 ?7 i
4 h3 H) {! d( N0 L+ ^+ G
2. **计算协方差矩阵**:
, ]5 @" u$ M0 O5 E8 v9 n, Q. M7 w   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:& O" s- d5 a5 S+ p! _
   \[# j* n# a6 {- O& B6 A
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)! t+ j0 H" X% T8 i: Q6 c$ P) s1 U
   \]6 u1 T2 {! ?1 T& }
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。: M  ^2 n5 h# L& Q

& V% w+ t$ s6 @0 `! F* @- {3. **计算特征值和特征向量**:
5 C$ z+ {6 q, }# m0 W   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
1 v- B( Y0 @& o& {# q3 L! g, L) v. ^: [, }
4. **选择主成分**:
% T6 W1 V1 h0 o# Y0 p+ n   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。( C: ]7 [( F3 b  ?
' J& y/ Z- R: \! [
5. **投影到新空间**:9 E: H% M$ n  M! J
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
4 B+ `% I$ \2 F6 I: D& [! j) Y4 X
## 示例代码# n: F* o. O3 c% ~* J9 l
( C& W/ z! {5 k0 U; Z: L
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
  p0 I2 q9 _. b+ f! _; d& r
8 o4 V  d1 |! }  b% L" m```python8 n% Z( ^$ ?; ]: b. W/ }+ Z
import numpy as np$ B, Y9 y, \6 F
import matplotlib.pyplot as plt% }/ U( d  G. K
from sklearn.datasets import load_iris
! N$ d$ k- h7 r3 b* Cfrom sklearn.preprocessing import StandardScaler
4 O% u# q  ?8 F  t$ p) \* T$ g0 O$ D/ v% B# [- E% J
# 加载数据集(这里使用Iris数据集作为示例)
( T/ @2 [' }: S. bdata = load_iris(). p& m0 V# l  o* d5 d9 u' U/ G7 |
X = data.data  # 特征数据
$ d, e' T- H, G9 G& L! T: `' ^1 [0 ky = data.target  # 标签, o% t- r8 l- Y7 |/ L
' U0 G5 u% a2 F
# 1. 标准化数据
' m9 b; |; D# U4 {* rscaler = StandardScaler()* m* M  ]0 _! F$ F; B0 n
X_scaled = scaler.fit_transform(X)+ F, A3 ?9 m; y' ~, `$ n
# k5 [4 m1 i9 M1 f8 x& M9 H5 R
# 2. 计算协方差矩阵
8 Y7 h( s' t# S5 Hcov_matrix = np.cov(X_scaled.T)
: I/ V) w9 p( V' s; @
8 c9 t# }) y0 N/ x# 3. 计算特征值和特征向量: \3 P0 ?) E0 H) Q  u
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
1 W+ H% O; B' U) w9 E+ B$ V2 v9 o$ z
# 4. 按特征值从大到小排序特征向量
5 [5 Y' M% d6 T6 J7 u/ Jsorted_indices = np.argsort(eigenvalues)[::-1]
+ o- s. r  }) i1 Q# P3 k. Zeigenvalues_sorted = eigenvalues[sorted_indices]! v! N2 N* U: L* k6 G3 y! L
eigenvectors_sorted = eigenvectors[:, sorted_indices]
. X1 X* }) a0 D' p& k3 _5 M3 R; y# s1 b1 \$ a8 L
# 选择前两个主成分1 K2 f8 c; m/ W' n# F& t3 Y3 P
n_components = 2
3 {2 S' H* U" v  x" XW = eigenvectors_sorted[:, :n_components]
9 K$ H9 H& e* W
% r& L$ u: a. A* K9 N" F6 g( C8 X# 5. 投影到新空间) @8 Q( E- q3 U7 c- G  a
X_pca = X_scaled.dot(W)9 J) }0 j; K! v  {3 j& i

$ Y1 i' ^  X( B# C9 y# 可视化结果
* F4 z5 g9 _' \9 a* P" G; dplt.figure(figsize=(8, 6))
, n4 P6 B) j* I" Z( r+ k2 Ffor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):) X6 j/ Y% H7 ]8 J
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
+ J5 w& o& Z( r* }. |# ]- Q9 ?plt.xlabel('主成分 1')
- T* J/ P* t% U; [+ {plt.ylabel('主成分 2')
# i0 O- F* r1 Z+ B  fplt.title('PCA - Iris Dataset')
& F; o) R1 p8 H4 i$ g& \; gplt.legend()
: f" z% q# l8 |plt.grid()" m  r+ [0 {5 J# b, `
plt.show()
6 e/ i# g' m! a! |7 I( S```
+ p( ~1 c8 p2 G4 B% L3 q) v7 f: [0 c: u6 X7 y
### 代码解析
+ n$ j0 \, u* B8 U9 a* m( `9 K. Q* i8 N6 ]- N4 E, o
1. **数据加载**:
! v8 f4 o$ o7 x/ H' X2 I; v9 S2 _   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。4 {% I- N- f& I

, I9 l$ H; `2 v  h  V) {2. **数据标准化**:
% D! S1 N  m- `4 U8 H2 [5 ]   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。4 ^9 t5 L5 l  c# N( k% I; d

' o1 x6 i* V- o5 M" K0 A3. **计算协方差矩阵**:
$ c( L% ?" l$ f4 R! a  U& w   - 使用`np.cov`计算标准化数据的协方差矩阵。
- P6 g" H- P4 {- M5 Z
; q8 i8 D  h1 o( b4 t8 ^  C4. **特征值和特征向量的计算**:
* ^5 _- Q5 {/ c' y% e5 o1 j, B1 |   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
+ a$ I3 r" q- k7 i( B3 a
6 u; o4 X8 a' l1 }5. **特征值的排序与选择**:
3 A5 _  G' a0 t( C   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
* q1 w/ T' x! `
5 G, I. p' N9 H1 h6. **数据投影**:  ^; g! T5 b$ k% Z3 Y7 i' p
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。/ U9 m. F: b0 G0 s6 {7 J% `- S
/ l' w$ F$ b8 A9 X* [
7. **结果可视化**:7 M1 X& M" Y0 [: s
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。. u0 v* Q6 e6 p+ ]( G4 a( Z1 k

) f. V2 R; d5 O- D### 总结
9 E% s5 h0 l1 ?% I" J- m0 L1 K  p! x" V8 e" ]# q3 W9 a3 l& q+ Q
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
3 S2 J( [- m) c- H! b2 b- Z8 t
/ r8 F4 g! D8 W( P7 d9 Y如果你有具体的应用场景或需要更详细的解释,请告诉我!
& u8 S2 u9 d7 F# p2 G
* u# m2 G% A6 \/ c3 e
0 {9 x( t6 L; }5 W, `7 n0 l; D& h* M6 H" U  ]6 Y" F& t) 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-4-26 06:13 , Processed in 0.528470 second(s), 55 queries .

回顶部