目录
3. 计算协方差矩阵的特征值和特征向量(对协方差矩阵进行特征值分解)
相关背景
主成分分析(Principal Component Analysis,PCA)的背景和发展可以追溯到20世纪初,是多元统计分析领域的一个基石。PCA最早由卡尔·皮尔逊(Karl Pearson)在1901年提出,目的是通过数学变换简化复杂数据的维度,同时尽量保留原始数据的重要信息。后来,哈罗德·霍特林(Harold Hotelling)在1933年进一步发展了这一理论。自那以后,PCA成为了多个领域,包括统计学、数据分析、机器学习等领域内一个非常重要和广泛使用的工具。
PCA的主要思想是将原始的数据通过线性变换映射到一个新的坐标系统(特征空间),这个新的坐标系统的基是数据集的协方差矩阵的特征向量,这些特征向量称为主成分。转换后的数据在新的坐标系中的坐标被称为主成分得分。这样,原始数据集中的大部分变异性可以由少数几个主成分来表示。
PCA利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分(Principal Components)。具体地,主成分可以看做一个线性方程,其包含一系列线性系数来指示投影方向。PCA对原始数据的正则化或预处理敏感(相对缩放)。
理论基础
PCA的数学基础建立在线性代数、统计学的概念之上,尤其是向量空间、特征值与特征向量、协方差矩阵等。PCA通过寻找数据的协方差矩阵的特征向量和特征值,确定数据中方差最大的方向,这些方向称为主成分。每个主成分都是原始数据在某个特定方向上的投影,这些方向互相正交(在数学上表示为特征向量之间的正交性)。
PCA的数学基础依赖于线性代数和统计学中的几个关键概念:
-
协方差
衡量两个变量如何一起变化。如果两个变量同时增加或减少,它们具有正协方差;如果一个变量增加而另一个减少,则协方差为负。
假设我们有两个随机变量 X 和 Y,它们各自有 n 个观测值,分别表示为,,..., 和 ,,...,。X 和 Y 的协方差可以用下面的公式计算:
其中, 是 X 的样本均值, 是 Y 的样本均值,计算方式如下:
-
特征值和特征向量
一个矩阵的特征值和特征向量表征了这个矩阵的某些基本特性。在PCA中,协方差矩阵的特征值和特征向量用于确定数据的主要变化方向。
给定一个方阵 A,一个非零向量 v 被称为 A 的一个特征向量,如果 A 与 v 的乘积只是 v 的一个标量扩展。这个标量称为特征值。数学上,这可以表示为:
其中,A 是一个 n×n 方阵,λ 是特征值,v 是对应的特征向量。
-
方差最大化
PCA通过方向的选择来最大化方差,这些方向(即主成分)代表了数据中最主要的结构和模式。
应用背景
自从它的提出,PCA已经被广泛应用于各个领域,包括:
- 统计学和数据分析:PCA广泛用于探索性数据分析、可视化以及数据压缩。通过降维,它可以帮助识别数据中的模式和结构,简化数据,使其易于分析和理解。
- 生物信息学:在基因表达数据分析、蛋白质组学和其他高通量生物技术中,PCA用于识别样本之间的关系以及重要的生物标志物。
- 金融:PCA在风险管理、资产定价等方面有应用,例如,通过分析不同金融工具之间的相关性来识别主要的市场风险因素。
- 图像处理:在图像压缩和特征提取中,PCA可以减少存储空间,同时保留图像的关键信息。
- 机器学习:PCA常用于预处理步骤,以减少模型训练所需的特征数量,提高训练效率和减轻过拟合。
- 社会科学:调查数据分析,识别关键因素。
技术挑战和限制
虽然PCA是一种强大的工具,但它也有局限。例如,PCA依赖于线性假设,即主要的信息可以通过数据的线性组合来捕获。对于非线性结构的数据,PCA可能无法有效地识别底层模式。此外,PCA对数据的尺度非常敏感,不同的尺度会导致不同的主成分。因此,在应用PCA之前,通常需要对数据进行标准化处理。
PCA详解
核心思想
主成分分析(PCA)的核心思想是通过降维来简化数据的复杂性,同时尽量保留原始数据集中的重要信息。具体来说,PCA旨在从多维数据中提取出最重要的几个特征(即主成分),这些特征能够捕捉数据集中的大部分变异性或信息。以下是PCA的几个核心概念:
1. 方差最大化
PCA试图找到数据中方差最大的方向。这是基于一个假设:数据的重要性可以通过它们的方差来衡量。方差大意味着数据在这个方向上分布得更广,因此可能包含更多的信息。
2. 协方差和数据的线性关系
通过分析数据特征间的协方差,PCA能够识别哪些维度(特征)之间存在最强的线性关系。这种关系的识别有助于理解数据中变量间的相互作用,同时帮助确定数据投影的方向。
3. 正交性和去相关
PCA通过正交变换将原始数据变换到一组线性无关的变量上,这组变量构成了数据的新基。这意味着提取的主成分彼此正交(在数学上相互独立),确保了新特征之间没有相关性。这样做的好处是简化了数据结构,使得每个主成分都捕捉到了数据中不同的信息。
4. 维度降低与信息保留
PCA的目的是在减少数据集的特征数量的同时,尽可能保留原始数据的信息。这通过在保留最大方差的同时,去除那些对解释数据变异性贡献较小的成分来实现。这种方法特别有用于处理高维数据集,其中许多特征可能是冗余的或者不太重要。
5. 数据解释性的提高
通过减少无关或冗余特征的数量,PCA有助于提高数据的解释性。通过集中在少数几个主要成分上,研究人员和数据分析师可以更容易地识别数据中的模式和趋势,从而提供洞察力和做出决策。
核心思想如下:
- 将坐标轴中心移到数据的中心,然后旋转坐标轴,使得数据在C1轴上的方差最大,即全部n个数据个体在该方向上的投影最为分散。意味着更多的信息被保留下来。C1成为第一主成分。
- C2第二主成分:找一个C2,使得C2与C1的协方差(相关系数)为0,以免与C1信息重叠,并且使数据在该方向的方差尽量最大。
- 以此类推,找到第三主成分,第四主成分……第p个主成分。p个随机变量可以有p个主成分。
数学定义
设有一个随机向量 ,其中包含了 n 个随机变量,每个变量有 m 个观测值。我们的目标是将这些变量转换为新的一组变量 ,这些新变量是原始变量的线性组合,且满足以下条件:
1. 线性不相关:新变量(主成分)之间相互正交(线性不相关)。
2. 方差递减:第一个主成分 有最大的方差,第二个主成分 有次大的方差,以此类推。每个主成分捕获了数据中尽可能多的信息(方差)。
算法流程
要详细展开主成分分析(PCA)的数学计算步骤,我们首先需要有一个数据集,并从这个数据集出发,步骤如下:
1. 数据标准化(样本去中心化)
给定一个 m×n 的数据矩阵 X,其中 m 是样本数,n 是特征数。首先,对数据进行标准化处理,确保每个特征的均值为0,标准差为1。对于矩阵 X 中的每个元素,执行:
其中,μ 是每个特征的平均值,σ 是每个特征的标准差。
2. 计算协方差矩阵
3. 计算协方差矩阵的特征值和特征向量(对协方差矩阵进行特征值分解)
求解协方差矩阵 C 的特征值 λ 和对应的特征向量 v:
4. 选择主成分
将特征值从大到小排序,并选择前 k 个特征值及其对应的特征向量,其中 k 是新的特征空间的维数(k≤n)。排序确保了选择的主成分是最能代表原始数据集方差的。
5. 构建投影矩阵
将选中的 k 个特征向量组合成一个投影矩阵 P,矩阵的每一列都是一个特征向量:
6. 转换数据到新的空间
最后,将原始数据矩阵 通过投影矩阵 P 转换到新的空间,得到降维后的数据矩阵 Y:
此时,Y 就是主成分得分矩阵,其维度为 m×k,表示原始数据在选定的 k 个主成分方向上的投影。通过上述步骤,PCA 将原始数据集从一个可能高度相关的空间转换到了一个低维、线性不相关的新空间中,这个新空间由数据最重要的方向(即主成分)定义。
PCA代码实例
下面是一个简单的Python示例,演示如何使用sklearn
库来执行主成分分析(PCA)。该示例包括生成一些模拟数据、执行PCA以及可视化结果的步骤。
如果你还没有安装sklearn
和matplotlib
,可以通过运行下面的命令来安装:
pip install scikit-learn matplotlib
Python代码示例如下
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(0)
mean = [0, 0]
cov = [[1, 0.8], [0.8, 1]] # 协方差矩阵
X = np.random.multivariate_normal(mean, cov, 100)
# 执行PCA
pca = PCA(n_components=2) # n_components设置为2,意味着我们想要投影到一个2维空间
pca.fit(X)
X_pca = pca.transform(X)
# 原始数据和PCA转换后的数据可视化
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], alpha=0.8)
plt.title('Original Data')
plt.xlabel('X1')
plt.ylabel('X2')
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.8)
plt.title('Data after PCA')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.tight_layout()
plt.show()
# 打印主成分方向和解释的方差比例
print("Principal components direction:\n", pca.components_)
print("Variance explained by each component:\n", pca.explained_variance_ratio_)
参考
https://zh.wikipedia.org/wiki/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90