一、数学原理
1.数据标准化
首先,需要对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。假设有一个的数据矩阵X
,其中每一列是一个样本,每一行是一个特征。
标准化公式如下:
其中,是原始数据矩阵
X
中的元素,是第
j
个特征的均值, 是第
j
个特征的标准差,是标准化后的数据, 标准化后的数据矩阵是
。
2.计算协方差矩阵
接下来,我们需要计算标准化后数据矩阵的协方差矩阵。协方差矩阵是一个对称矩阵,它描述了数据中不同特征之间的线性关系。
协方差矩阵的计算公式如下:
其中,n
是样本数量, 是标准化后的数据矩阵,
是
的转置。
对协方差矩阵的理解:
协方差矩阵听起来可能有点复杂,但其实它的概念很直观。想象一下,你有两个朋友,一个叫小明,另一个叫小华。他们都喜欢玩滑板,但他们的滑板技巧可能不一样。有时候,小明滑得好,小华也滑得好;有时候,小明滑得不好,小华也滑得不好。这种情况下,我们说他们的滑板技巧是“正相关”的。但也有可能,小明滑得好的时候,小华滑得不好;小明滑得不好的时候,小华反而滑得好。这种情况下,我们说他们的滑板技巧是“负相关”的。
协方差矩阵就是用来描述这种“相关性”的数学工具。它是一个表格,里面记录了多个变量(比如小明和小华的滑板技巧)之间的相互关系。如果两个变量一起变好或变坏,协方差矩阵会显示一个正数;如果一个变量变好时另一个变量变坏,协方差矩阵会显示一个负数。这个矩阵还能告诉我们每个变量自身的变化情况,就像小明自己的滑板技巧有多稳定一样。
所以,协方差矩阵就像是一个“相关性地图”,帮助我们理解不同变量是如何一起变化的。在数据分析和统计学中,这个工具非常有用,因为它能帮助我们洞察数据背后的模式和关系。
3.计算特征值和特征向量
协方差矩阵的特征值和特征向量可以通过求解特征方程得到:
其中, 是特征值,
是单位矩阵。
对于每个特征值,我们可以找到对应的特征向量
,满足:
对协方差矩阵的特征值与特征向量的理解:
想象一下,你有一堆彩色的小球,每个小球都有自己的颜色和大小。现在,你想把这些小球整理得更加有序,让它们看起来更整齐,更易于观察。PCA(主成分分析)就像是一个整理小球的工具,而协方差矩阵的特征值和特征向量就是帮助我们整理小球的关键。
首先,我们用协方差矩阵来描述这些小球的颜色和大小之间的关系。特征值和特征向量就像是这些关系的“指南针”。特征向量告诉我们小球应该如何排列,才能让它们的颜色和大小的变化最大程度地展现出来。而特征值则告诉我们每个特征向量所代表的变化有多重要。
在PCA中,我们寻找最大的特征值对应的特征向量,因为这些特征向量指向的方向能让小球的颜色和大小的变化最明显。我们把这些方向叫做“主成分”。通过把这些小球沿着这些主成分方向重新排列,我们就能把小球的颜色和大小的变化最大程度地展现出来,同时减少需要观察的维度。
简单来说,特征值和特征向量在PCA中的作用就是帮助我们找到最能代表数据变化的方向,让我们能够更有效地整理和分析数据,就像把一堆杂乱的小球整理成有序的队列一样。
4.选择主成分
特征值的大小代表了对应特征向量方向上的方差大小。我们通常选择最大的几个特征值(差异性最大的特征)对应的特征向量作为主成分,因为它们包含了数据中的大部分信息。
5.数据投影
最后,我们将原始数据矩阵X
投影到选定的主成分上,得到降维后的数据矩阵。
投影公式如下:
其中, 是降维后的数据矩阵,
是最大的特征值对应的特征向量。
二、代码实现
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import make_classification
from mpl_toolkits.mplot3d import Axes3D
# 目标:(100, 6)———>(100, 3)
# 生成一个随机的二分类数据集,具有6个特征
X, y = make_classification(n_samples=100, n_features=6, n_informative=3, n_redundant=0, random_state=42)
# 原始数据的二维可视化(只使用前两个特征)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
colors = ['navy', 'turquoise']
for color, i, target_name in zip(colors, [0, 1], ['class 0', 'class 1']):
plt.scatter(X[y == i, 0], X[y == i, 1], color=color, alpha=.8, lw=2, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('Visualization of the original dataset (first two features)')
# 选两个特征绘图
# 初始化PCA,设置降至3维
pca = PCA(n_components=3)
# 对数据进行降维
X_r = pca.fit_transform(X)
# 降维后的数据3D可视化
ax = plt.subplot(1, 2, 2, projection='3d')
for color, i, target_name in zip(colors, [0, 1], ['class 1', 'class 2']):
ax.scatter(X_r[y == i, 0], X_r[y == i, 1], X_r[y == i, 2], color=color, alpha=.8, lw=2, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
ax.set_title('PCA of the dataset (3 components)')
plt.show()