主成分分析法
python代码实现
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
sns.set(style='whitegrid', font='Times New Roman', font_scale=0.4)
plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
X = np.array([-1,-1,-3,1,2,3])
Y=np.array([-1,-1,-2,1,1,2])
sns.scatterplot(x=X,y=Y)
plt.show()
C= np.array([-1,-1,-1,-1,-3,-2,1,1,2,1,3,2]).reshape(-1,2)
print(C)
pca = PCA(n_components=2)
newX = pca.fit_transform(C) #等价于pca.fit(C) pca.transform(X)
print(newX)
invX = pca.inverse_transform(C) #将降维后的数据转换成原始数据
print(pca.explained_variance_ratio_)
# 我们所训练的pca对象的n_components值为2,即保留2个特征,第一个特
# 征占所有特征的方差百分比为0.99244289,意味着几乎保留了所有的信息
# 。即第一个特征可以99.24%表达整个数据集,因此我们可以降到1维
pca = PCA(n_components=1)
newX = pca.fit_transform(C)
print(newX)
print(pca.explained_variance_ratio_)
结果
0 [1.5283382047955922]
1 [1.528338204795591]
2 [3.7421235964078305]
3 [-1.254159330068931]
4 [-2.0766959542489096]
5 [-3.467944721681171]
贡献率: 0.99332163
主成分分析是一种降维思想。通过线性变化竟可以用少数指标代表数据的整体分布特征,一般只要保留原信息的80%左右就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/f698e2b805eb06e3da4e8d805c74b5ab.png)
如图所示,通过变换坐标轴,降低维度而又保持原有数据的最大特征!
优点:
降维可以缓解维度灾难。
应用:
降维一般用于数据的预处理,对大量数据进行特征提取以及特征分析时候,PCA可以巧妙的解决大量属性带来的函数的维灾问题。
知识储备
![](https://i-blog.csdnimg.cn/blog_migrate/5e16e3109a4741cdaad3fb03e0aaab37.png)
![](https://i-blog.csdnimg.cn/blog_migrate/49fc5c39bba0d8b1a043509d3c9874c4.png)
对数据各自减去均值处理
![](https://i-blog.csdnimg.cn/blog_migrate/3b3e9cc5f0b3d30320cbdcd16f9c5ccd.png)
计算协方差矩阵(两维)
![](https://i-blog.csdnimg.cn/blog_migrate/d6d33412dfe5f9f7118be25d05cd5efd.png)
求协方差的特征值和特征向量
![](https://i-blog.csdnimg.cn/blog_migrate/34d2d661cba891402fd6bd8dc0136f24.png)
特征值0.0490833989对应特征向量为第一条向量,这里的特征向量都归一化为单位向量。
如何求矩阵特征值
![](https://i-blog.csdnimg.cn/blog_migrate/def5766dde64fca534ee003e27964465.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2820ce1ce1d3bd18033dd02ee07372be.png)
![](https://i-blog.csdnimg.cn/blog_migrate/def5766dde64fca534ee003e27964465.png)
特征值以及特征向量的本质复习
![](https://i-blog.csdnimg.cn/blog_migrate/f725b515498a2f77e3b825662f555836.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fcbdc33dac8f553a1f7fb319e6ff5e20.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ea897871a2948b486e8b2c2cc824c1a1.png)
协方差矩阵理解
1)协方差矩阵能处理多维问题;
2)协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。
3)协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。
4)样本矩阵中若每行是一个样本,则每列为一个维度,所以计算协方差时要按列计算均值。
将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。我们是从二维降到一维,所以k取一,并且是最大的。
选取的k个特征向量组成的矩阵为EigenVectors(nk)。
那么投影后的数据FinalData为FinalData(101)
= DataAdjust(102矩阵) x 特征向量(-0.677873399, -0.735178656)T
得到的结果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/90fe2c34c12f91d41ee0b457d1906182.png)
降维完成,同时又达到保真性。
### 问题思考
- 为什么选取k的特征值越大越好?
简单来说把数据中心化,减少过度拟合的可能性。
- 为什么选取k的特征值越大越好?‘
最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。
- 在n维中选多少个k最合适?
k(特征向量)取得越多越好,k越多熵越大,样本不确定性越大,越接近真实数据。如果k越大就达不到我们说的降维效果了。所以这是个经验之谈
有些研究工作表明,所选的主轴总长度占所有主轴长度之和的大约85% 即可,其实,这只是一个大体的说法,具体选多少个,要看实际情况而定。如下图公式。注:n为样本数,k为我们选的维数
PCA原理总结
特征值在线性代数里面我们求过无数次了,对一个n*n的对称矩阵进行分解,我们可以求出它的特征值和特征向量,就会产生n个n维的
正交基
,每个正交基会对应一个特征值。然后把矩阵投影到这N个基上,此时特征值的模就表示矩阵在该基的投影长度
。
特征值
越大,说明矩阵在对应的特征向量上的方差
越大,样本点越离散,越容易区分,信息量也就越多。因此,特征值最大的对应的特征向量方向上所包含的信息量就越多,如果某几个特征值很小,那么就说明在该方向的信息量非常少,我们就可以删除小特征值对应方向的数据
,只保留大特征值方向对应的数据,这样做以后数据量减小,但有用的信息量都保留
下来了。PCA就是这个原理。
步骤回顾
1.去除平均值
2.计算协方差矩阵
3.计算协方差矩阵的特征值和特征向量
4.特征值从大到小排序
5.保留最上面k个特征向量
6.将数据转换到k个向量构件的新空间中
7.n维矩阵*k维特征向量=k维矩阵