QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
6 f- ?3 L4 M4 n& V" D* a$ B4 h' r" z& n& e0 \
## PCA 的基本步骤
2 |1 w" i0 E* `' X  [2 Z0 y4 N& W9 s/ b
1. **标准化数据**:
: D; A% ^9 ]5 k; v/ v   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。
: X; U! f$ ]. M1 _- U! t5 \* [( z# z0 T1 B$ d
2. **计算协方差矩阵**:0 z- I0 `, I7 I! [
   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
  c; N9 n* z6 C4 n9 d, M   \[. h( J2 H5 Q# Z6 ]1 N
   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
" A/ D- D. D9 F   \]
: X$ o; u) a+ R8 `4 G' y   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
, e8 X0 Y9 U2 L7 W% j% h  R+ D0 a  j+ M& l0 x% t
3. **计算特征值和特征向量**:
, ~4 P, y# e+ ?) `. g, i   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
. ?' J3 L! p8 y" {6 L# L% ^+ |) `8 h# T, n$ Z4 e* Z
4. **选择主成分**:
# b' d5 w2 o3 p* B. |& l   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。
$ P! i7 c" z$ u7 r0 e: b0 p1 T4 W  O6 Z' W8 U* H
5. **投影到新空间**:
+ x' I+ b; B  z- a  G4 [   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
  E7 D# _% I8 s  F0 a6 L5 U9 G! s# k# g1 F+ x4 o! j0 n8 K
## 示例代码
8 r3 o  a8 S. [
+ P/ p! N' u7 A! }3 N9 {9 S下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:8 ^, h1 w' L1 B- y& \' A% K+ O

. c3 d6 K2 D2 t+ l```python% D- n2 y8 G8 Z# U* [
import numpy as np
' u8 E0 h0 I4 r7 yimport matplotlib.pyplot as plt4 H8 J3 C- ?& t  T; g
from sklearn.datasets import load_iris" j* i) t1 l! @) ~
from sklearn.preprocessing import StandardScaler
- U: M- o( ]2 k3 q% L+ c- p, X, l2 G7 v/ B0 l; s
# 加载数据集(这里使用Iris数据集作为示例)' N) V$ |8 K& S  E; o1 U% O: b
data = load_iris()
" I8 V  k4 w7 mX = data.data  # 特征数据- o5 H. X2 G: R# r
y = data.target  # 标签
8 i  r9 j2 H2 i, b4 c5 M" A8 G* ~$ i  N5 q0 f; K( K3 w! @
# 1. 标准化数据
- E+ a, }  Y3 v  r$ }, g- fscaler = StandardScaler()
) X. a& M# l- h- W/ E3 JX_scaled = scaler.fit_transform(X)6 h% b+ [' w* Z

; n& w+ Y) z' D% ~& n# 2. 计算协方差矩阵
9 g+ t# k) n: V7 F) ^4 f% N1 bcov_matrix = np.cov(X_scaled.T)
- w) i2 I# _$ d) E  [, d- E7 L8 w9 {2 h* A+ R7 r) k! E) b0 b
# 3. 计算特征值和特征向量
# x% R2 J7 c+ teigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
. a$ E! w% X5 n. n. @7 z/ ]. R9 X5 ^  K4 C1 {
# 4. 按特征值从大到小排序特征向量1 M6 _6 L/ @$ p5 V- x' V  F
sorted_indices = np.argsort(eigenvalues)[::-1]
4 O9 M0 y2 J+ |) i( leigenvalues_sorted = eigenvalues[sorted_indices]
# b( N; k8 M- j3 i7 d+ ]# ^9 v  w, Neigenvectors_sorted = eigenvectors[:, sorted_indices]
* L; B8 S5 R, t0 T6 ^: L9 M1 n
( u0 U& L+ v( s# 选择前两个主成分6 H& {( A. R: y' h5 g" y
n_components = 27 p# d' J0 ]. d& M8 s- L: D* x
W = eigenvectors_sorted[:, :n_components]0 A1 O4 W5 ?9 p' o1 p1 B$ }

# D3 r8 e4 `- U  k( p# 5. 投影到新空间) }4 B3 J# }) i' U- N# j
X_pca = X_scaled.dot(W)
( |7 W% Y4 l2 {0 B
6 C. m0 h# o( u3 Q0 y9 ^2 \# 可视化结果6 O. W% s) d& B4 V
plt.figure(figsize=(8, 6))
1 t( `' u, o/ @for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
* ?2 m4 q- k( _% [% u2 {    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])8 L( m4 ]  l' a, M
plt.xlabel('主成分 1')1 {2 J2 e% k6 p1 ^+ R
plt.ylabel('主成分 2')
4 K6 n' m: [: r5 Z9 f. N9 B9 ]plt.title('PCA - Iris Dataset')8 Y+ ]8 ]8 ]9 A' [7 m' |
plt.legend()
. _7 x+ K, W$ J  z; hplt.grid()
6 j7 o% w3 k9 m( Qplt.show()
/ |* V  X( M8 H3 Q' K5 a# o  S$ Q```
3 q/ `0 Z0 H# @% u
: C: \# M' w  m1 l! K1 G. q- d  S: w### 代码解析' Q6 M) M" v. m8 t. E, g
& A% i' M& y/ p8 B$ j
1. **数据加载**:
/ a$ }5 P2 E8 ]1 D   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
0 C% @: i( H( }
5 O' {' D  J5 ]$ o) ?! {" Q4 f2. **数据标准化**:9 I' d7 D  m5 i3 M0 E, l
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。! t6 V8 O6 u2 l! O

% d9 s" u7 E: O$ D5 q* X& ?3 C3. **计算协方差矩阵**:! }! S3 }5 U5 f
   - 使用`np.cov`计算标准化数据的协方差矩阵。
( }, z$ [8 q% c; H$ G1 z% S: k! E  E/ X! J: D$ ?* z
4. **特征值和特征向量的计算**:% M- `* {" D6 T# i
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
0 H: v  b0 k, t; j2 {
" B+ w5 \; b/ V5. **特征值的排序与选择**:
: Z' L" t6 d, z$ w/ r* V3 N, \" {   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。* s6 r9 `  k0 a3 o( Z, j
4 w! F( Q% l, e1 p
6. **数据投影**:' F# S6 U, ~$ N( Y; w+ `
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。0 ]9 i$ t( [' y9 t2 E& `

. P& M2 V( l6 i* x+ }) y2 D7. **结果可视化**:
/ z% l5 }9 J" M7 o, g( M2 f   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。& g1 \$ m6 n8 \9 m9 I9 z2 \  o; H' Q4 a
! N6 q  i# _; h) E( j
### 总结
. W; _# z- I6 y; Y6 y1 A  v8 k; Z, h6 {2 o+ c1 i
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
' p- x/ Z, z1 r; |  D; @8 V$ V
! U1 f) F+ Y+ @0 j& `' w0 R如果你有具体的应用场景或需要更详细的解释,请告诉我!
; F. m+ B6 ]+ |0 P; s; o
7 L( r1 n/ r1 H
/ G1 H/ y; x* a" V
$ O% y1 E0 ~  k& |) Q2 T+ F

主成分分析算法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-24 02:40 , Processed in 0.442528 second(s), 54 queries .

回顶部