人工智能(2)- 学习主成成分分析(PCA)进行降维

一.为什么要进行降维?

    在进行分类的时候我们需要大量的特征来提高分类器的准确度,但是分类器的性能随着随着维度的增加,逐步上升,达到某点其性能便逐渐下降。

   为了避免性能下降的情况,我们要进行降低维度的处理。

    数据的特征分量之间往往存在一些关联,如一个网站的访问量和网站的用户之间有一定的关联,一个淘宝店的下单数和成交数有一定关联。我们通过将两个有相关关系的特征进行筛选,删除一些,来降低机器学习算法的复杂度。

    但是我们删除那些信息损失最小?如何度量丢失的信息?

二.降维原理、PCA算法    
    1.规范化d维的数据集

    2.构建协方差矩阵:

    数学解释:一个字段的方差可看作,每个元素与字段均值的差的平方和的均值,我们将字段均值化为零,问题被形式化表述为:寻找一个基,使得所有数据变换为这个基上的坐标后,方差值最大,来表示降维后数据分散。

   

    对于更高位,我们在完成了第一个投影方向的选择后,还要选择第二个投影方向,为了表示更多的原始信息,我们希望他们之间不存在(线性)相关性。数学上用协方差表示相关性,我们设置字段均值为零

   

    协方差为零时,两个字段完全独立

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

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

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

    这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵的。

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

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

   

    优化目标变成了寻找一个矩阵P,满足PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件

   

协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:

1)实对称矩阵不同特征值对应的特征向量必然正交。

2)设特征向量λ

重数为r,则必然存在r个线性无关的特征向量对应于λ

,因此可以将这r个特征向量单位正交化。

由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en

,我们将其按列组成矩阵:

则对协方差矩阵C有如下结论:

其中Λ

为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。

以上结论不再给出严格的数学证明,对证明感兴趣的朋友可以参考线性代数书籍关于“实对称矩阵对角化”的内容。

到这里,我们发现我们已经找到了需要的矩阵P:

P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照Λ

中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。

三.用scikit-learn实现PCA

   

import matplotlib.pyplot as plt
#from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇
X, y = make_blobs(n_samples=1000, n_features=3, centers=[ [0,0,0], [1,1,1], [2,2,2],[3,3, 3]], cluster_std=[0.1, 0.1, 0.2, 0.2], 
                  random_state =9)

from sklearn.decomposition import PCA

#PCA处理后,现在三维的情况下,对数据进行投影,观察三个维度的方差分布。
pca = PCA(n_components=3)
pca.fit(X)
print (pca.explained_variance_ratio_)
print (pca.explained_variance_)

#PCA降维到二维,再观察特征维度方差和方差占比
pca = PCA(n_components=2)
pca.fit(X)
print (pca.explained_variance_ratio_)
print (pca.explained_variance_)

#通过图形观察PCA转化后的数据分布
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()

    实验步骤:
    1.使用make_blobs聚类数据生成器来生成样本,样本数1000,样本3个特征,一共4个族,
样本中心[0,0,0], [1,1,1], [2,2,2],[3,3, 3]],每个族的方差(0.1, 0.1, 0.2, 0.2)。
返回值X为生成的样本数据集,y为样本数据集标签。
    2.在不降维的情况下,对数据进行fit进行训练,通过调用pca.explained_variance_ratio_得到
的所保留的n个成分各自的方差百分比,explained_variance得到方差,输出结果如下
    [0.98681204 0.00662991 0.00655806]
    [3.7558741  0.02523388 0.02496041]
    得到的结果第一个特征占了绝大多数的主成分比例
    3.设置维度为二,进行训练得到
    [0.98681204 0.00662991]
    [3.7558741  0.02523388]
    结果投影到二维后选择的是前两个特征,而抛弃了第三个特征。
    4.通过scatter创建图表直观的看下转换后的数据分布,输出结果可以清晰地看出4个族群分布。

   

   

参考资料

1.机器学习中的维数灾难 https://blog.csdn.net/zbc1090549839/article/details/38929215

2.机器学习中的数学(7)——PCA的数学原理 https://blog.csdn.net/liuweiyuxiang/article/details/78853404

3.用scikit-learn学习主成分分析(PCA) https://www.cnblogs.com/pinard/p/6243025.html

猜你喜欢

转载自blog.csdn.net/Game_Builder/article/details/83341134