" s4 s* G' }, ?; B2 X# Q* @4. **选择主成分**: # ^( K& D% {% ]. B1 T. I - 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。( _, V$ J2 Q, M; p4 u! V
1 j, Y% P) v# i
5. **投影到新空间**: $ A6 z0 h7 I# q! F% F0 e - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。- T. G. U1 m5 E. I& j9 b
/ [+ O) F1 p9 \( `. N
## 示例代码& u. g7 K' K2 i g, v
( k. Y; K! V$ p' K下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果: : j6 i" ~" j( Y/ q; p: z, C4 T% ~+ _. y" c) b# l
```python8 e6 ^3 f. V6 \
import numpy as np ' p7 K3 I, ~; F; |* D8 l, Uimport matplotlib.pyplot as plt8 z6 _' E4 n6 S2 B
from sklearn.datasets import load_iris 5 w( B1 w+ N: Y' \" B3 Mfrom sklearn.preprocessing import StandardScaler3 r$ {. C. D! f: g6 ?
0 m& T, j2 p5 K0 `/ E- v) \
# 加载数据集(这里使用Iris数据集作为示例) , \' F& C- O/ o* n% q. W& @data = load_iris(); i* o0 H( [- S% A
X = data.data # 特征数据% L2 j7 s# x+ l; I' c% z
y = data.target # 标签4 U1 |) \ g5 z" ^0 N# @0 _8 V
% l4 e) P: L" x/ W- F* E# A
# 1. 标准化数据 6 [0 B7 b) T7 K1 i( z! D5 h7 h5 f. A+ Vscaler = StandardScaler() ! @. F5 `( ?/ C3 I2 g" XX_scaled = scaler.fit_transform(X) ' L6 M( b ^" b7 b 9 W# B, l6 Z( N5 W3 ]5 p, j# 2. 计算协方差矩阵8 j3 {6 h5 f I) d
cov_matrix = np.cov(X_scaled.T) : ]( }% }$ Q) ~2 P1 W& x) c$ K! ?0 A. E# Y5 Q1 z( q
# 3. 计算特征值和特征向量 , g3 L# I5 G5 }4 K3 c. I! Y0 feigenvalues, eigenvectors = np.linalg.eig(cov_matrix)" B3 F+ }1 b# F+ O: K
8 u$ n1 K# S6 l5 j2 ]5 ?1 P
# 4. 按特征值从大到小排序特征向量 5 @% E$ ?6 C/ Lsorted_indices = np.argsort(eigenvalues)[::-1] 6 O* k. g# Y+ V$ q- neigenvalues_sorted = eigenvalues[sorted_indices] W5 z1 g1 y0 g k; z" l& ieigenvectors_sorted = eigenvectors[:, sorted_indices] 7 u( w& ^7 x3 J6 A9 m) O# S& q( \6 {3 E3 j
# 选择前两个主成分 * ?! n [ f$ un_components = 23 R" [. q- P" w1 h9 t
W = eigenvectors_sorted[:, :n_components]0 s" _* c! @) G- v& J1 b# h: R
6 |: N, v# ^) k5 W8 L; A: n
# 5. 投影到新空间 ( v/ ]# ?3 \# o, B6 S2 z/ Q! o% zX_pca = X_scaled.dot(W)& E6 f+ Z9 x& L/ ]7 X
) R* H( y2 I r( |" O* c# 可视化结果5 l1 [1 O8 N2 t$ X- \6 q; j
plt.figure(figsize=(8, 6)) , z* e% q: d4 m6 {; i+ `2 D" Qfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']):) M9 P7 j, |; Q& R& J% F' b2 j
plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target]) 4 s! g4 M4 [4 D6 {plt.xlabel('主成分 1')2 ?+ m+ w2 J1 a& a* x$ h
plt.ylabel('主成分 2')4 y( G1 ]1 `, \
plt.title('PCA - Iris Dataset') ; d0 N6 u3 L; `+ n2 a7 F+ a2 Y; dplt.legend() . n5 q- q4 P' J+ Iplt.grid() ) b2 }- v% K' P. Z. nplt.show() 5 S( G( @0 X- k; M. v t) \+ n```' j$ d' ?6 R7 ?% ]" S3 ?8 w
, `+ M$ g9 K ~! d$ X, J( {' q
### 代码解析" c- l. s; E0 v
0 I* D$ d4 {. R& s# }
1. **数据加载**:3 E, a# ~/ X8 R+ i% \% Y. E
- 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。 1 h; \0 H9 f" ` r5 |! f7 Q* U9 E* S2 U- f: x1 b" y1 H
2. **数据标准化**: q' e* B: Y, ]
- 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。 * O n' J `. [) G* \" r 1 B6 R( [$ d! L0 ?3 s) J3. **计算协方差矩阵**: : G) X6 d* n. O! l' D' ^" O8 n - 使用`np.cov`计算标准化数据的协方差矩阵。, [. @( C3 v4 F; r$ W' F5 C
1 l6 {3 d3 A: T" P O4. **特征值和特征向量的计算**: , [4 g$ k8 p2 Y1 F- e$ H! X9 Z - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。) p, u' S& y% J: t