目录
1.PCA简述
主成分分析(PCA)是一种非监督学习的机器学习算法,主要用于高维数据的降维。PCA分析原始数据的多个特征,通过保留主要特征并将高维数据映射到较少的维度来实现降维。其主要目标是减少降维后的数据损失的信息量,并尽可能地符合原始数据的特征。PCA算法对于人类理解更便于的特征很有用,对于高维数据,通过降维可以发现更便于理解的特征。
1.1 PCA原理
降维有两种方法,一种是特征消除,另一种是特征提取
- 特征消除:将会在直接消除那些我们觉得不重要的特征,这会使我们对视这些特征中的很多信息。
- 特征提取:通过组合现有特征来创建新变量,可以尽量保存特征中存在的信息
-
PCA是一种常见的数据降维算法,PCA会将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,于是就可以用较少的综合指标分别代表存在于各个变量中的各类信息。PCA的核心思想是找到一个维数更低的仿射集,然后将所有的数据点在其上做投影,以得到新的在更低维空间中的点作为新的数据。如何选择这样的仿射集,以降维的同时不至于损失过多的信息呢?有两种思路:
最近重构性:样本点到该仿射集的距离要尽量小;
最大可分性:样本点到该放射集的投影要尽可能分开。
1.1 PCA实现步骤
①标准化数据: 首先,对原始数据进行标准化处理,确保每个特征的均值为零,标准差为一。这一步骤是为了消除不同特征之间的量纲差异,使得每个特征对PCA的贡献相对均等。
②计算协方差矩阵: 利用标准化后的数据,计算特征之间的协方差矩阵。协方差矩阵反映了特征之间的关联程度,是PCA的基础。
③计算特征值和特征向量: 对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征向量表示了数据变换后的新坐标轴方向,而特征值则表示了在这个方向上的方差大小。
④选择主成分: 将特征值从大到小排列,选择其中最大的k个特征值对应的特征向量作为主成分,其中k是希望保留的维度数。
⑤数据投影: 将原始数据投影到所选的主成分上,得到降维后的数据。
1.2 PCA数学基础
1.2.1方差:
我们知道数值的分散程度,可以用数学上的方差来表述。一个变量的方差可以看做是每个元素与变量均值的差的平方和的均值,即:
1.2.2协方差矩阵
在PCA中,协方差矩阵是一个关键的数学工具。协方差矩阵用来描述两个或多个随机变量之间的关系。对于一个包含n个特征的数据集,其协方差矩阵记作Σ(希腊字母sigma)。
协方差矩阵的元素(i,j)表示第i个和第j个特征之间的协方差。协方差描述了两个变量一起变化的趋势:如果两个变量一起增加或一起减少,它们之间的协方差为正;如果一个增加而另一个减少,协方差为负;如果它们之间没有关系,协方差为零。
对于标准化后的数据矩阵X,协方差矩阵Σ的计算公式如下:
其中,n 是样本数量, 是矩阵 X 的转置。
1.3 PCA算法步骤
输入:m条样本,特征数为n的数据集,即样本数据
降维到的目标维数为k。记样本集为矩阵X。
其中每一行代表一个样本,每一列代表一个特征,列号表示特征的维度,共n维。
输出:降维后的样本集
步骤如下:
第一步:对矩阵去中心化得到新矩阵X,即每一列进行零均值化,也即减去这一列的均值eq?𝑒𝑞?,所求X仍为eq?m𝑒𝑞?𝑚阶矩阵。
第二步:计算去中心化的矩阵X的协方差矩,即eq?n𝑒𝑞?𝑛阶矩阵。
第三步:对协方差矩阵C进行特征分解,求出协方差矩阵的特征值eq?𝑒𝑞?,及对应的特征向量eq?v𝑒𝑞?𝑣,即
第四步:将特征向量按对应特征值从左到右按列降序排列成矩阵,取前k列组成矩阵W,即eq?n𝑒𝑞?𝑛阶矩阵。
第五步,通过eq?Y𝑒𝑞?𝑌计算降维到k维后的样本特征,即eq?m𝑒𝑞?𝑚阶矩阵。
2. 代码实现
2.1 导入库
import numpy as np
from numpy import linalg
2.2 创建数组数据集,并转置
def __init__(self, dataset):
self.dataset = np.matrix(dataset, dtype='float64').T
2.3 求主成分,并标准化
def principal_comps(self, threshold = 0.85):
# 返回满足要求的特征向量
ret = []
data = []
# 标准化
for (index, line) in enumerate(self.dataset):
self.dataset[index] -= np.mean(line)
# np.std(line, ddof = 1)即样本标准差(分母为n - 1)
self.dataset[index] /= np.std(line, ddof = 1)
2.4 求协方差矩阵和特征值以及特征向量
后第i个特征向量是第i列,为了便于观察将其转置一下
Cov = np.cov(self.dataset)
eigs, vectors = linalg.eig(Cov)
for i in range(len(eigs)):
data.append((eigs[i], vectors[:, i].T))
2.5 最终得到
- 特征向量
- 该特征向量的方差贡献率
- 当前特征向量的累计方差贡献率
data.sort(key = lambda x: x[0], reverse = True)
sum = 0
for comp in data:
sum += comp[0] / np.sum(eigs)
ret.append(
tuple(map(
# 保留5位小数
lambda x: np.round(x, 5),
# 特征向量、方差贡献率、累计方差贡献率
(comp[1], comp[0] / np.sum(eigs), sum)
))
)
print('特征值:', comp[0], '特征向量:', ret[-1][0], '方差贡献率:', ret[-1][1], '累计方差贡献率:', ret[-1][2])
if sum > threshold:
return ret
return ret
2.6 运行结果
特征值: 22.075235372070864 特征向量: [0.56177 0.58975 0.27868 0.50573 0.05644] 方差贡献率: 0.824 累计方差贡献率: 0.824
特征值: 3.1474971323292125 特征向量: [ 0.37826 -0.06431 -0.61334 0.06946 -0.68686] 方差贡献率: 0.11749 累计方差贡献率: 0.94148
3. 总结
3.1 PCA的优点
降维:PCA可以将高维数据转换为低维数据,减少数据维度,降低存储和计算开销。
特征提取:PCA可以找到数据中最重要的特征(主成分),这些主成分是原始数据线性组合的结果,能够保留大部分数据的方差信息。
去除噪声:PCA可以过滤掉数据中的噪声,因为噪声通常包含在数据的低方差主成分中,而PCA会保留高方差的主成分。
可解释性:PCA得到的主成分是原始特征的线性组合,因此可以很好地解释数据的变化情况。
数据可视化:降维后的数据可以更方便地在二维或三维空间中进行可视化展示。
3.2 PCA的缺点
信息损失:PCA是一种无监督学习算法,它通过最大化方差来选择主成分,但在降维过程中可能会丢失一些重要信息,特别是低方差的主成分往往包含了一些有用的局部模式。
非线性问题处理困难:PCA只能处理线性关系,对于非线性关系的数据降维效果不好。
计算复杂性:PCA需要计算数据的协方差矩阵,其计算复杂性随数据维度的增加而增加,对于大规模数据集可能较为耗时。
可能不适用于稀疏数据:PCA在处理稀疏数据时效果可能不佳,因为稀疏数据的协方差矩阵难以准确估计。
主成分含义复杂:PCA得到的主成分是原始特征的线性组合,可能不易解释,特别是当数据维度较高时,主成分往往难以直观地与实际含义对应。