, v2 Z5 a c8 H. {& U# v" Y& W2. **计算协方差矩阵**:' N6 H- e* |% x+ @: H% S
- 协方差矩阵反映了特征之间的关系。使用标准化后的数据计算协方差矩阵,公式为: z6 ?0 Z( t3 K; V; q5 L/ M
\[ 7 R: S$ Q. L6 o1 G5 a* p# m \text{Cov}(X) = \frac{1}{n-1}(X^TX)& u& H( W. z% v6 l% {
\] 7 G" N6 G1 I+ d7 h X1 j. H 其中 \(X\) 为标准化后的数据矩阵,\(n\) 为样本数。, G" f* T ?+ q, ^! _
% O: G4 {! ^) n6 y1 m t0 i3. **计算特征值和特征向量**:5 S: J W2 v* w9 x& [# L- t, D( J
- 通过求解协方差矩阵的特征值和特征向量,特征值表示每个主成分所解释的方差量,特征向量表示主成分的方向。 7 }3 B; k7 H6 I6 |' o6 O* A& I ! ^. G2 a) {9 g3 K' }7 t5 C4. **选择主成分**:3 F5 P8 `9 o( W
- 根据特征值的大小选择最大的几个特征值及其对应的特征向量。这决定了保留的数据维度。6 J/ {0 f: d4 W9 i( G) z
9 Z8 R9 y" ~/ x8 s
5. **投影到新空间**: 2 o3 F1 T0 s$ K# h, z - 将原始数据投影到所选择的特征向量组成的新空间,得到降维后的数据。0 ]6 R3 O0 e' y% X `
0 u. N$ B& W; F1 R; g## 示例代码 2 C( G X+ p5 K, w- n) {9 I 3 e) M3 r" x$ G A2 C下面是一个简单的Python实现PCA的示例,使用`numpy`库来进行计算,并使用`matplotlib`来可视化结果:" K0 r! N) d% k' E) J f
5 B5 h: o* W. p( ~0 V' Z```python $ Z9 M2 @, l8 I0 R- F; G9 |. fimport numpy as np 5 M/ l- K7 V' n0 _# {' h Pimport matplotlib.pyplot as plt : j) b& \% @ C3 W5 }/ a0 P7 ^, f5 c( @from sklearn.datasets import load_iris& |/ ^ s# W* Z" O( z) V( p7 `
from sklearn.preprocessing import StandardScaler ) a* z4 B$ x8 [+ e9 {' ^0 c' P* l; n: ]9 f& t
# 加载数据集(这里使用Iris数据集作为示例)- G* U# v: L0 N1 J1 Z7 M5 _4 V7 N& b
data = load_iris(): Z. h4 Y" \" `6 T1 [4 P1 ^4 ?1 m
X = data.data # 特征数据3 Y6 M* o/ z9 a/ T7 R# h6 w
y = data.target # 标签 J8 Z, K5 n7 f, r3 F
; l2 u0 D9 N8 B* k; e% r
# 1. 标准化数据8 D7 D. U9 D6 R3 u( a
scaler = StandardScaler() : M- ~- u# Q$ MX_scaled = scaler.fit_transform(X) . h ?4 y7 s, Q4 Y$ S4 |7 k' C; \) ~; { _8 M0 S
# 2. 计算协方差矩阵 , [. `' G, N7 u* o6 `% W" Ycov_matrix = np.cov(X_scaled.T)4 f& P& _0 O0 ~ ~/ D5 f" K
. D5 F/ p8 n7 g* b5 ^
# 3. 计算特征值和特征向量 % S' G W; }8 X4 ~5 o9 N$ C0 j, Ieigenvalues, eigenvectors = np.linalg.eig(cov_matrix) & `# x" m6 F! {5 Q% Y + o( a' d8 k+ B* L w K# 4. 按特征值从大到小排序特征向量 ; ~1 i2 V. l3 Y7 I% `4 ~sorted_indices = np.argsort(eigenvalues)[::-1] + e6 A$ q' s5 F4 D% feigenvalues_sorted = eigenvalues[sorted_indices] ! h; k& `% G& t; K. Y8 Xeigenvectors_sorted = eigenvectors[:, sorted_indices]. F9 c* x# c+ h, Y& p
$ x+ f7 Q4 Y1 ~0 O/ ~8 B+ I6 G
# 选择前两个主成分 0 S6 e( ? m E7 I Bn_components = 2: O+ [* y3 N& r& H
W = eigenvectors_sorted[:, :n_components]/ }/ |( Q9 y5 |6 N# P% y
3 T- s- k/ A1 u3 ~+ w# 5. 投影到新空间# D6 Z' J! f |4 G% b3 d
X_pca = X_scaled.dot(W), ]9 q% _+ r$ i( k C
# A$ k! t% w/ b
# 可视化结果 1 y2 k/ X9 x4 r0 _; R* X$ j7 Wplt.figure(figsize=(8, 6)) 1 Q+ ?% p8 E; n# Dfor target, color in zip([0, 1, 2], ['red', 'green', 'blue']): ; ~) x8 X; r, e8 ]* b plt.scatter(X_pca[y == target, 0], X_pca[y == target, 1], color=color, label=data.target_names[target]) " K9 p6 ^; s5 G$ ?plt.xlabel('主成分 1') $ N5 d( f+ v4 A+ m* Splt.ylabel('主成分 2') 7 e$ R) h Y, A, t3 A. ]. L+ w7 Qplt.title('PCA - Iris Dataset')2 F6 z" S6 a" \
plt.legend()9 o I/ Q3 `& F. w) a
plt.grid(). Q f, [7 W/ ~! B& E" s
plt.show()" n, l) c0 ~1 W
``` , r" _% @' Q* e+ a6 E- p4 W, q. ^8 S+ f k6 b+ a1 C
### 代码解析 5 E, b7 F& p1 M: t. q( e0 A# ] / Z _+ |# q/ H {: N1. **数据加载**: ) ?7 n2 |) X8 J( l& {$ E- ~ - 使用`sklearn`库的`load_iris`函数加载Iris数据集,获取特征数据\(X\)和标签\(y\)。( T. H3 U% L7 i: F# d1 c
# ]4 M( n( m$ l s. I) X) Q2. **数据标准化**: ( r. t1 N9 A9 u1 ?, x* r$ r - 使用`StandardScaler`将特征数据标准化,使每个特征的均值为0,方差为1。+ r! \* R! E& a# R |% m
9 c, r0 E- m: T9 w7 n
3. **计算协方差矩阵**:. A( K( q1 w; u6 T: J
- 使用`np.cov`计算标准化数据的协方差矩阵。 o( \+ |7 m/ y ( S$ I: d7 N0 K, m4. **特征值和特征向量的计算**: * A/ Y- }* }$ u/ q+ p! B6 B0 m - 使用`numpy.linalg.eig`计算协方差矩阵的特征值和特征向量。 , i# A. u* V* ~- p + ^7 \/ b: V! R5. **特征值的排序与选择**:; ~" W4 ~# c% J4 l% q$ V
- 将特征值按降序排序,并根据排序结果选择相应的特征向量。5 F- _& N# X. [& [0 K1 \( C
2 Y* ~# o# [! H
6. **数据投影**: 5 v$ P, i8 ~9 l& s1 E, v* Z5 e1 u3 ^ - 将标准化后的数据投影到新的特征空间(即主成分空间)。" L( L+ _; V, Q. V4 p
( M4 `$ Y: S6 M5 J: \
7. **结果可视化**:8 f) p) n6 }2 {/ K m1 B: J
- 使用`matplotlib`绘制降维后的数据点,以展示不同类别的数据分布。 3 m5 u: @& T/ _ 1 U J" U* K E# x* I$ ^' ^) a### 总结; T9 |+ S+ d' S/ c) x
: R5 T1 t7 o2 a, H$ ]$ `* T
PCA是一种有效的降维技术,可以帮助我们在保持数据特征信息的同时,减少数据的维度。它非常适合于数据预处理、特征提取、可视化等任务。在实践中,使用现成的库(如`sklearn`)可以更加方便、普遍地实现PCA,包括数据的标准化、协方差计算和特征选择等。 ! b& A z5 @3 ~- w+ ]) U7 ~6 N8 a& J I, O- ^" `/ R% J
如果你有具体的应用场景或需要更详细的解释,请告诉我!# I9 o6 k0 L7 B- h
% s2 Q8 ~9 N: C8 w" x6 X