QQ登录

只需要一步,快速开始

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

主成分分析算法Python代码

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2025-1-13 17:24 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
主成分分析(Principal Component Analysis, PCA)是一种常用的降维方法,旨在通过线性变换将高维数据投影到低维空间,同时尽可能保留数据的变化性(即信息)。PCA广泛应用于数据预处理、特征提取、可视化和去噪等领域。
# l0 n! J% Y- a: |& H  Q9 z0 c9 Q7 \( |$ H4 U: ?
## PCA 的基本步骤# l& B/ `& F7 Z- [# }4 K  F

( R$ U) t, S1 H: a6 H1. **标准化数据**:3 c8 c  W4 J: D. t: A
   - 将数据集中的每个特征(维度)调整为均值为0,方差为1。这样可以消除不同特征量纲的影响。( o0 V  _5 C0 j! C+ \# |# u

( S' C% M4 ]. s, _. J; ]2 L2. **计算协方差矩阵**:
; [9 }9 d8 B1 T   - 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为:, F1 P+ G6 I) v
   \[
: p5 S' k' V8 v- ?0 O+ e   \text{Cov}(X) = \frac{1}{n-1}(X^TX). W1 l2 U7 Q- ^) S# c7 }
   \]# }2 ]0 O" V- @
   其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。/ Z. E4 @. q! t3 _
3 d% c1 k" M/ Y
3. **计算特征值和特征向量**:9 [6 h1 U  ]  ~2 q& f3 j
   - 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。
+ S" P; ^5 ?% A& n& r6 M/ C: _1 `/ }( j: G- j- h* s1 `+ q( H  H- y
4. **选择主成分**:1 K) X" \0 z0 c  t$ u' g+ {
   - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。& z) M# v; W, {  k! `# o' x
2 ~' c) l  G; I  e, j+ u1 t
5. **投影到新空间**:
% L' A8 J* m$ Q5 E% Y- R   - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。
! @" L' i7 R: w& B, A) ~* @( ]0 g1 c0 h* g8 p7 L
## 示例代码0 n3 A8 e* ~+ ^/ Y4 `0 H. ~
. L6 u7 p0 j& b2 y+ k' }- k
下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:
5 G: n7 G0 c1 l
. \7 y7 y% |( B/ `% v```python
. O  \  s' x1 j; nimport numpy as np! q# M/ ]/ e9 h0 [8 a, w
import matplotlib.pyplot as plt7 W/ I# S* @8 `2 d
from sklearn.datasets import load_iris, y. c- c0 M; w2 Q6 P. Z1 \
from sklearn.preprocessing import StandardScaler
' i* r; p. Q9 p  A9 }5 P/ \4 `/ ]+ r
# 加载数据集(这里使用Iris数据集作为示例)
( J0 Z8 d1 Z, g! u7 ]& rdata = load_iris()  W& k8 k) }8 v+ U! H% ]/ R. G
X = data.data  # 特征数据( ?) p) k& F& b- g! s& l' U
y = data.target  # 标签
: f, Q. @) w! I% l: h8 E" D$ y' z3 E) d% M1 B: ]
# 1. 标准化数据6 J3 K( d5 f. h) ?$ R) D
scaler = StandardScaler()
% V/ r; c% v8 @4 S" OX_scaled = scaler.fit_transform(X)
% T) K) P$ @# G5 @4 w6 ^% x0 ~
* e% b, l; M5 J* S4 y# 2. 计算协方差矩阵
' A$ @2 I& n& ]" w' j4 a! kcov_matrix = np.cov(X_scaled.T)
; ~: [- m6 a: n4 F) o1 c. N6 G) x7 D5 ^& g* }  v! I
# 3. 计算特征值和特征向量
# a: n2 X2 ^" }7 S$ feigenvalues, eigenvectors = np.linalg.eig(cov_matrix)# I) V8 @0 `+ A, p

& P0 Z& p. L* H" J# 4. 按特征值从大到小排序特征向量+ K6 Y7 O, c5 O" Y2 @
sorted_indices = np.argsort(eigenvalues)[::-1]
# V2 y7 @- z7 V3 m- {6 r# L6 N% e! eeigenvalues_sorted = eigenvalues[sorted_indices]9 l# j1 I6 F: n# Z
eigenvectors_sorted = eigenvectors[:, sorted_indices]- V8 B3 @' \$ d% s4 K/ j

2 @# o0 n6 O. n% z9 l0 ~# 选择前两个主成分
9 i/ z0 u4 C0 x  y' gn_components = 2* K5 U" x  z# d3 N$ Z, N
W = eigenvectors_sorted[:, :n_components]
/ _$ q3 V: z5 A
0 F% ?! X% f" _- O/ U8 g+ T# 5. 投影到新空间, i6 A& {4 `2 Y) C
X_pca = X_scaled.dot(W)1 z6 T! l! j) E6 E- u+ q: W

( v2 \; _) g9 d. z( e& c3 T, n/ P# 可视化结果
7 q2 Q& k5 @9 |/ p5 X# ?plt.figure(figsize=(8, 6)). I3 S' i% H) J* N( r& g
for target, color in zip([0, 1, 2], ['red', 'green', 'blue']):
, y% t5 |+ O7 H/ t( \# d    plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target])# ?; ?6 O, b5 V
plt.xlabel('主成分 1')
# m/ E; U: x% Z- ^plt.ylabel('主成分 2')
8 P; i7 M! f/ q( ^6 Uplt.title('PCA - Iris Dataset')
3 e- A4 u9 k- ?( {/ c3 ]plt.legend()0 T0 Z$ G% ]2 ^( P! i9 z$ ?' l3 y
plt.grid()
+ r0 P. J- q4 M2 m# q$ Rplt.show()
2 t+ N+ {" }! D: }0 _```
& I& z3 T  T4 ]* V: E+ |0 L0 X: O/ y
- i- K2 w& F; m9 f1 b7 X& A2 w### 代码解析
/ z8 V& O% w4 U" V# w+ R  }2 _) a% o
6 M' G( S; Y/ V6 `3 h  ^( c1. **数据加载**:: P8 @8 ^* M! q( k, F: e, m/ T
   - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。
9 ]' @. y6 N, E+ J
$ m1 E. z1 J+ F  q' w9 h/ \2. **数据标准化**:
9 R& k4 C( V# l7 q; {% c8 u   - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。
  I; A( A) y$ X2 I; d
& L4 @2 z& ?2 I3. **计算协方差矩阵**:$ q* C+ k( e* i0 K  A$ N# A+ D
   - 使用`np.cov`计算标准化数据的协方差矩阵。% L4 [2 l: c* t3 P& a1 N: r7 x

# ]6 y/ r. |1 A& e- a' T4. **特征值和特征向量的计算**:9 _  z5 c2 D! P+ b- h$ o
   - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。' P" Z4 ?/ E4 H

( }4 X- e- i) ^# T  ?) H- Y$ z5. **特征值的排序与选择**:
7 u& [8 m! I% U1 m/ I   - 将特征值按降序排序,并根据排序结果选择相应的特征向量。6 p* x. b) J) T# H7 o; D, H# k
, i: y& Y+ }1 s( K* m, L4 D; R
6. **数据投影**:# _! g8 [& i8 w& V5 z: G/ e) v& x0 n
   - 将标准化后的数据投影到新的特征空间(即主成分空间)。* B0 d0 G6 g' Y7 E! G+ \! `. }& a
9 z/ ^) X9 }9 R+ W6 G
7. **结果可视化**:) o7 {( @8 {/ x" c# `
   - 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。1 V* D0 Z9 `) v1 \( R
% k2 J* v" \5 {8 y* D$ }9 B
### 总结
7 Y+ R* n( ?# h1 z4 V
/ D+ [3 w) C" {( o3 g. BPCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。
8 X$ d8 y: C9 `$ K$ ~2 ?2 X& y
* @+ D) V, \: T) z+ V& b$ X7 w如果你有具体的应用场景或需要更详细的解释,请告诉我!8 _; z" J: H! f4 S. t& G/ B

5 P) i" o5 Z) C& E+ y% F& r' l% B6 F) E' k- Z- h  x
, A* h' ~% \; P+ K# d

主成分分析算法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, 2025-6-26 12:20 , Processed in 1.103283 second(s), 55 queries .

回顶部