PCA(主成成分分析)

PCA的基本原理和思想

PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。

PCA从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。

主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维,去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元(主成分),是旧特征的线性组合,这些线性组合最大化样本方差,尽量使用新的k个特征互不相关。这k维是全新的正交特征,是重新构造出来的k维特征,而不是简单地从n维特征中取出其余n-k维特征。

为什么做PCA?

  • 在很多场景中需要对多变量数据进行观测,在一定程度上增加了数据采集的工作量。并且多变量之间存在相关性,从而增加了问题分析的复杂性
  • 对每个指标单独分析 ——> 分析结果是孤立的(不能完全利用数据的信息)
  • 盲目减少指标 ——> 损失有用的信息,得出错误结论
  • 在减少分析指标的同时,尽量减少原指标的信息的损失
  • 可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息

PCA的数学原理

1.协方差

对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了,不过对于更高维,还有一个问题需要解决,考虑三维降到二维问题,与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。

如果我们还是单纯的只选择方差最大的方向,很显然,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此应该有其他约束条件。从直观上讲,让两个字段尽可能表示更多的原始信息,我们是不希望他们之间存在线性相关性,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。

数字上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:

 

22b451c39e754318973e23f8f59267d1.png

可以看出,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。

当协方差为0时,表示两个字段完全独立,为了让协方差为0,我们选择第二个即时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。

至此,我们得到了降维问题的优化目标:将一组N维向量降维k维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的k个方差)。

108e9156ecd34f8189c6755858cd476c.png

然后我们用X乘以X的转置,并乘上系数1/m:

dcc2f3064d59410eb0e24718ebc540b1.png

这时候我们会发现,这个矩阵对角线上的两个元素分别是两个字段的方差,而其他元素是a和b的协方差,两者被统一到了一个矩阵的。

根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:

设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设 C= 1/m*X*XT ,则C是一个对称矩阵,其对角线分别是各个字段的方差,而第l行j列和j行i列元素相同,表示i和j两个字段的协方差。

2.协方差矩阵

上面我们导出了优化目标,但是这个目标似乎不能直接作为操作指南(或者说算法),因为它只说要什么,但是根本没有说怎么做,所以我们要在数学上继续研究计算方案。

我们看到,最终要达到的目标与字段内方差及字段间协方差有密切关系。因此我们希望能将两者统一表示,仔细观察发现,两者均可以表示为内积的形式,而内积又与矩阵相乘密切相关。于是,我们来了灵感:

假设我们只有a和b 两个字段,那么我们将他们按行组成矩阵X:

b043754c79214453aca16c04503ea476.png

3.特征向量(协方差矩阵对角化)

根据上述推导,我们发现要达到优化目前等价于将协方差矩阵对角化:即除对角线外的其他元素化为0,并且在对角线上将元素按照大小从上到下排列,这样我们就达到了优化目的,这样说可能还不清晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:

设原始数据矩阵X对于的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为X对P做基变换后的数据,设Y的协方差矩阵为D,我们推导一下D与C的关系:

68d46e23411248898ac41c259542da3b.png

现在事情很明白,我们要找的P不是别的,而是能让原始协方差矩阵对角化的P,换句话说,优化目标变成了寻找一个矩阵P,满足PCPT是一个对角矩阵,并且对角元素按照从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。

实现:将二维数据降维到一维

import numpy as np
from sklearn.decomposition import PCA

# 创建数据集
data = np.array([(2.5, 2.4), (0.5, 0.7), (2.2, 2.9), (1.9, 2.2), (3.1, 3.0), (2.3, 2.7), (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9)])

# 初始化PCA对象,设置n_components为1
pca = PCA(n_components=1)

# 对数据进行PCA降维
reduced_data = pca.fit_transform(data)

# 获取去中心化矩阵
mean_vector = pca.mean_
print("去中心化矩阵:", mean_vector)

# 获取特征向量
components = pca.components_
print("特征向量:", components)

# 获取特征值
explained_variance = pca.explained_variance_
print("特征值:", explained_variance)
#降维后的数据集
print("降维后的数据:", reduced_data)

结果:

PS D:\VSCOde\Code> & D:/Python/python.exe d:/VSCOde/Code/.vscode/JMU/pca.py
去中心化矩阵: [1.81 1.91]
特征向量: [[-0.6778734  -0.73517866]]
特征值: [1.28402771]
降维后的数据: [[-0.82797019]
 [ 1.77758033]
 [-0.99219749]
 [-0.27421042]
 [-1.67580142]
 [-0.9129491 ]
 [ 0.09910944]
 [ 1.14457216]
 [ 0.43804614]
 [ 1.22382056]]
PS D:\VSCOde\Code> 

 

PCA算法的基本步骤

dc19d40bcd274088ba3dc87548601e77.png

 

PCA应用的实例

通过PCA算法对iris数据集进行降维处理

1.导入数据:

from sklearn import datasets
import numpy as np
​
iris = datasets.load_iris()
R = np.array(iris.data)

2.计算协方差矩阵:

R_cov = np.cov(R, rowvar=False)
​
import pandas as pd
iris_covmat = pd.DataFrame(data=R_cov, columns=iris.feature_names)
iris_covmat.index = iris.feature_names

833e8dac73114f43a63cf2a52dbeb9fa.webp

 

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

eig_values, eig_vectors = np.linalg.eig(R_cov)

cdbb9e29f2da451581df5d47a7c17a25.webp 

892d35ec2a8140dbb89b0368512acea3.webp 

4.选择主要成分:

featureVector = eig_vectors[:,:2]

 5.构建新数据集:

featureVector_t = np.transpose(featureVector)
​
# R is the original iris dataset
R_t = np.transpose(R)
​
newDataset_t = np.matmul(featureVector_t, R_t)
newDataset = np.transpose(newDataset_t)

6.可视化数据:

import seaborn as sns
import pandas as pd
%matplotlib inline
​
# create new DataFrame
df = pd.DataFrame(data=newDataset, columns=['PC1', 'PC2'])
y = pd.Series(iris.target)
y = y.replace(0, 'setosa')
y = y.replace(1, 'versicolor')
y = y.replace(2, 'virginica')
df['Target'] = y 
​
# plot 2D data
sns.lmplot(x='PC1', y='PC2', data=df, hue='Target', fit_reg=False, legend=True)

 24c464cafe64433e88748a9a5ed36568.webp

c3c33ae15e1748839da23f664d31e63a.webp 

PCA的优缺点

PCA算法,即主成分分析法,是一种非监督的机器学习方法,主要用于高维数据的降维处理。它通过线性变换将原始数据映射到一个新的坐标系中,使得新坐标系中的坐标按照数据方差的大小排列。其优点主要包括降低数据维度、保留主要信息、计算过程简单等。缺点则包括解释性差、可能损失重要信息、对异常值敏感等。

PCA的优点

PCA算法的主要优点:

1. 降低数据维度:PCA能够有效减少数据集的特征数量,从而简化数据分析的复杂度和提高数据处理的效率。

2. 保留主要信息:通过提取最大的几个主成分,PCA能够在保留大部分重要信息的前提下实现数据降维。

3. 计算过程简单:PCA的计算主要涉及协方差矩阵的特征值分解,这一过程数学上成熟且易于实施。

4. 无监督特性:作为一种无监督学习算法,PCA的应用不需要数据的标签信息,只依赖于数据本身的结构特征。

5. 消除相关性:PCA生成的主成分之间相互正交,这有助于消除原始数据特征间的相互影响和多重共线性问题。

PCA的缺点

 PCA算法的主要缺点:

1. 解释性差:PCA产生的主成分是原变量的线性组合,这种组合可能难以直观地解释或关联到具体物理意义。

2. 可能损失信息:由于PCA基于方差大小选择主成分,可能会忽视方差小但实际重要的特征。

3. 对异常值敏感:PCA在计算过程中对异常值非常敏感,异常值的存在可能会对结果产生较大影响。

4. 线性假设限制:PCA假设数据间的关系是线性的,对于存在非线性关系的数据,PCA可能无法有效地提取特征。

5. 主观性强:确定保留主成分的数量时通常需要依据累计贡献率或其他准则,这一过程带有一定的主观性。

6. 对数据规模要求:PCA需要足够的数据量来准确计算协方差矩阵,小规模数据可能不适用于PCA分析。

综上所述,PCA算法是一种强大的数据降维工具,特别适用于初步探索数据集和进行数据可视化时。然而,当数据中含有非线性关系、存在大量异常值或者需要保持特定特征的解释性时,单独使用PCA可能不是最佳选择。在实践中,可以根据具体需求结合其他机器学习方法来优化数据处理和分析的效果。 

 

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值