个人技术分享

一、数学原理

1.数据标准化

        首先,需要对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。假设有一个的数据矩阵X,其中每一列是一个样本,每一行是一个特征。

标准化公式如下:

x_{ij}^{'} = \frac{x_{ij} - \mu_j}{\sigma_j}

其中,x_{ij}是原始数据矩阵X中的元素,\mu_j是第j个特征的均值,\sigma_j 是第j个特征的标准差,x_{ij}^{'}是标准化后的数据, 标准化后的数据矩阵是X^{'}

2.计算协方差矩阵

        接下来,我们需要计算标准化后数据矩阵的协方差矩阵。协方差矩阵是一个对称矩阵,它描述了数据中不同特征之间的线性关系。

协方差矩阵的计算公式如下:

C = \frac{1}{n-1} X^{'} X^{'T}

        其中,n 是样本数量,X^{'} 是标准化后的数据矩阵,X^{'T}X^{'}的转置。

对协方差矩阵的理解:

协方差矩阵听起来可能有点复杂,但其实它的概念很直观。想象一下,你有两个朋友,一个叫小明,另一个叫小华。他们都喜欢玩滑板,但他们的滑板技巧可能不一样。有时候,小明滑得好,小华也滑得好;有时候,小明滑得不好,小华也滑得不好。这种情况下,我们说他们的滑板技巧是“正相关”的。但也有可能,小明滑得好的时候,小华滑得不好;小明滑得不好的时候,小华反而滑得好。这种情况下,我们说他们的滑板技巧是“负相关”的。

协方差矩阵就是用来描述这种“相关性”的数学工具。它是一个表格,里面记录了多个变量(比如小明和小华的滑板技巧)之间的相互关系。如果两个变量一起变好或变坏,协方差矩阵会显示一个正数;如果一个变量变好时另一个变量变坏,协方差矩阵会显示一个负数。这个矩阵还能告诉我们每个变量自身的变化情况,就像小明自己的滑板技巧有多稳定一样。

所以,协方差矩阵就像是一个“相关性地图”,帮助我们理解不同变量是如何一起变化的。在数据分析和统计学中,这个工具非常有用,因为它能帮助我们洞察数据背后的模式和关系。

3.计算特征值和特征向量

        协方差矩阵的特征值和特征向量可以通过求解特征方程得到:

|C - \lambda I| = 0

其中,\lambda 是特征值,I是单位矩阵。

对于每个特征值\lambda_i,我们可以找到对应的特征向量v_i,满足:

(C - \lambda_i I) v_i = 0

对协方差矩阵的特征值与特征向量的理解:

        想象一下,你有一堆彩色的小球,每个小球都有自己的颜色和大小。现在,你想把这些小球整理得更加有序,让它们看起来更整齐,更易于观察。PCA(主成分分析)就像是一个整理小球的工具,而协方差矩阵的特征值和特征向量就是帮助我们整理小球的关键。

        首先,我们用协方差矩阵来描述这些小球的颜色和大小之间的关系。特征值和特征向量就像是这些关系的“指南针”。特征向量告诉我们小球应该如何排列,才能让它们的颜色和大小的变化最大程度地展现出来。而特征值则告诉我们每个特征向量所代表的变化有多重要。

        在PCA中,我们寻找最大的特征值对应的特征向量,因为这些特征向量指向的方向能让小球的颜色和大小的变化最明显。我们把这些方向叫做“主成分”。通过把这些小球沿着这些主成分方向重新排列,我们就能把小球的颜色和大小的变化最大程度地展现出来,同时减少需要观察的维度

简单来说,特征值和特征向量在PCA中的作用就是帮助我们找到最能代表数据变化的方向,让我们能够更有效地整理和分析数据,就像把一堆杂乱的小球整理成有序的队列一样。

4.选择主成分

        特征值的大小代表了对应特征向量方向上的方差大小。我们通常选择最大的几个特征值(差异性最大的特征)对应的特征向量作为主成分,因为它们包含了数据中的大部分信息。

5.数据投影

最后,我们将原始数据矩阵X投影到选定的主成分上,得到降维后的数据矩阵。

投影公式如下:

Y = X^{'} v_1

其中,Y 是降维后的数据矩阵,v_1 是最大的特征值对应的特征向量。

二、代码实现

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()

三、结果显示