QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |正序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。% n2 ]6 _; k7 D5 R* ]- {& G
$ o; a+ p5 w1 ~( s
## PCA 的基本步骤7 E" R, ~; Y# y( R7 F9 [

* H/ X- J/ Z: Z) F1 J1. **标准化数据**:" ~% ]% c8 I' m/ ^
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。) V5 r. m2 }- W  i  B

; `; d6 `, x% Z# t5 C) T) K5 ?2. **计算协方差矩阵**:
" A2 V; b2 u' s/ d" W! z* h   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:
6 G0 }8 ?2 Z/ z/ N6 e3 l7 U. L, O1 }   \[
! d  w' r) l# z$ Q' a1 h   \text{Cov}(X) = \frac{1}{n-1}(X^TX)
; @7 C) p$ ~* i) p, H0 ]* s7 l3 W   \]
8 q5 N6 E. j& n   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。
( n, c. |$ M" \& g$ V: f7 k9 o: S* v2 G: z7 t& ^* i1 n. ?7 o
3. **计算特征值和特征向量**:
, u, i7 m' W4 @   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
8 ]' }: V! S, m/ J6 |9 Q- I
  g+ R" B) C' v7 H4 D2 `4. **选择主成分**:* O* r& E$ P) W& |/ J2 c/ l* z2 l
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。. M) b( W; Q( I$ x; @( v

+ A! ~7 s5 n  ~5. **投影到新空间**:7 F; P. g' S7 q! O  ~9 o
   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
6 y# ~  f8 ]9 |# ~
2 Z7 N# D8 ~9 v0 n! I3 V( O6 _) X; \! `## 示例代码$ m, c" Z; h4 e( P" Z% f2 W6 Z

+ q; i( M! f2 p0 u下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:3 b: F) ?! n7 d9 g0 a$ n7 n: m
3 R- b  @$ p( V, ?* l, o$ V/ P
```python
' L1 I% O) Q; k. @import numpy as np
# Z+ |0 b/ n$ s  X- H1 Q" h# Iimport matplotlib.pyplot as plt
! e: i% ?" ^1 b6 ^5 Q, V6 @from sklearn.datasets import load_iris& T- ^4 |5 R' K5 a
from sklearn.preprocessing import StandardScaler0 s3 t- J: n  r/ I( N5 h

! N% H5 \3 x( o- Z) D# 加载数据集(这里使用Iris数据集作为示例)
: V* `+ j7 J8 l+ _data = load_iris()
/ ]# s. _* {5 S: S  F2 BX = data.data  # 特征数据, s0 y% l. F# E/ Q
y = data.target  # 标签
" A0 }. ^/ |* y: A) ^# U: E/ O/ T& U( h2 h
# 1. 标准化数据
  |' Y* z1 [2 Y+ c  Tscaler = StandardScaler()- H; k! }! ]3 L4 E6 w7 v
X_scaled = scaler.fit_transform(X)
4 D3 ^6 L9 n( D
- H" ?# a$ O: j( J0 n6 C# p; Q6 G# 2. 计算协方差矩阵
2 H( ~+ b* R7 P8 \0 n: tcov_matrix = np.cov(X_scaled.T)9 ^' d# c  z& q7 j
4 ~, ^) w6 \/ {
# 3. 计算特征值和特征向量
6 z0 H& \6 L3 y9 o( oeigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
5 J* n- v6 @6 l6 i# ]1 `/ P
( V3 n( v/ r0 g+ }8 h! N# 4. 按特征值从大到小排序特征向量
4 V6 \8 L4 C8 O% X1 L$ nsorted_indices = np.argsort(eigenvalues)[::-1]: q* E: [9 N* b$ Q: P3 K8 w
eigenvalues_sorted = eigenvalues[sorted_indices]& j9 j* t1 B5 H  l& T4 [: M9 Y2 Q
eigenvectors_sorted = eigenvectors[:, sorted_indices]0 o0 x5 m* v! ]$ A2 F( y& Z& s

; T) O, C, c7 ~6 f6 H# 选择前两个主成分
! ?: i0 _. f% y8 C: _n_components = 2/ ^( [9 ]& _9 w" O
W = eigenvectors_sorted[:, :n_components]. S# J$ e7 O4 O2 D7 {1 f
) y! r  C, g1 z5 X% ]& V) F
# 5. 投影到新空间
+ R. J* z* G# p; QX_pca = X_scaled.dot(W)0 V9 O# w1 X4 M9 U
/ l/ y- L( T( g, J/ A; z& h
# 可视化结果% i: x, L7 R+ q/ H5 L# @) F
plt.figure(figsize=(8, 6))9 b( q4 m' g" R3 |4 C( x
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):% c# n7 O1 ?( j9 D/ ]# z
    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])
' Z% ^4 w1 P4 [8 w" Splt.xlabel('主成分 1')
; Z# c6 m7 ]1 C0 z3 _plt.ylabel('主成分 2')+ m3 @( g( o: P- x
plt.title('PCA - Iris Dataset')/ K, f: \2 X0 L% d2 L
plt.legend()6 j# z6 x/ K/ ~( @7 [  w
plt.grid()3 Q  x8 F$ N' ^' i5 u
plt.show()
" Q6 Q7 h! j! X* S- Z% U- v```
$ _3 m# ?1 {# g* K( E5 |' h, G" H$ q  i4 J# ?
### 代码解析7 k* I1 V2 r$ a' k0 i  A: [% R* e

( g# I4 f7 g( G. n; \0 X1. **数据加载**:
# z9 b) C8 d1 t+ r' w/ j+ c   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。) z9 X0 E0 Q8 Z" C& m+ H
) n' }3 N' k$ B
2. **数据标准化**:- F. Y9 D" i% }8 M! c( X0 v/ ?
   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
. \0 e, K! a, U9 D- j4 N0 {3 a) }: `# U1 l; Q- C( L4 A
3. **计算协方差矩阵**:
, `- @5 }1 n* X' A: |1 Q% A   - 使用`np.cov`计算标准化数据的协方差矩阵。
8 `% l% H% R" {* P. q: F# O: u$ H0 k& c3 y, H
4. **特征值和特征向量的计算**:
- M. {) k2 ?- w1 ?3 {) N7 Z: t! b: l   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。
# V9 w+ [1 X9 S8 P+ I. x/ j0 J' t; m* F$ p
5. **特征值的排序与选择**:  U' I, n) u4 Y$ P6 V
   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。
& J- L) g9 O4 G8 f( s
& H  M2 i* m: X% v% ^4 @! T6. **数据投影**:
; `+ _$ G) q3 W1 ^* v   - 将标准化后的数据投影到新的特征空间(即主成分空间)。
# q9 b; J% T6 Z
5 m# o* T! x: l' i7. **结果可视化**:0 ^9 `1 {4 i1 w  ^9 A* J& Z
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。
. ]9 E* S. Z1 s: k, p
5 `/ K5 W0 [* K$ L### 总结& z! o& K# H) E- ^
0 Y( {! j/ W1 ?: C( X. W
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。" ]1 E5 ]3 y; T5 ]$ M$ \0 W& U

$ y, B8 c8 R3 ]5 I# \1 p. H如果你有具体的应用场景或需要更详细的解释,请告诉我!
& i) {0 |$ Y! i. O- d5 O9 z  u$ a2 ~. U
' u$ f- N# M9 P/ w+ T
7 c9 ?# M5 F0 z- x" Q; w

主成分分析算法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-13 18:05 , Processed in 0.418825 second(s), 55 queries .

回顶部