这两天一直在学习主成分分析算法(PCA),通过查阅相关的资料,对PCA算法的原理和实施过程有了一定程度的理解,话不多说,直接步入正题。

一、PCA算法原理

官方定义:PCA是一种常用的数学分析的方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

我的理解:PCA是在尽量不丢失原有数据信息的基础上进行数据的降维。举一个二维降一维的栗子,假设有一组数据[-1, -2], [-1, 0], [0, 0], [0, 1], [2. 1],可以将这些数据点在坐标系中表示出来。

这些数据本就是二维,想要再降维则需要重新找一个方向,并把这些点映射到这个方向上(降到1维),这就是PCA算法的主要目的。但是将这些点映射到哪个方向上比较合适呢?试想一下,如果这些点映射到X轴上,那么[-1, -2]和[-1, 0]会在X轴上重合,这样会损失原有的信息,如果这些点都映射到Y轴上,同理也会有两点重合在一起。如何找到一个合适的方向使得不会损失原有的信息呢?PCA的做法是,找到新映射的方法需要满足如下两个原则:

(1)在新映射的方向上每个数据的映射点方差尽可能大。因为方差大的数据所包含的信息量越大。

(2)新映射的方向应彼此正交,这样映射出的坐标点选取才更有意义

 二、PCA算法过程以及实例

1、PCA算法的过程

(1)数据中心化:对X中的每一行(即一个特征属性)进行零均值化,即减去这一行的均值

(2)求出数据中心化后矩阵X的协方差矩阵(即特征与特征之间的协方差构成的矩阵)

(3)求解协方差矩阵的特征值和特征向量

(4)将特征向量按照特征值从大到小按列进行排列称为矩阵,获取最前面的k列数据形成矩阵W。

(5)利用矩阵W和样本集X进行矩阵的乘法得到降低到k维的最终数据矩阵。

2、PCA算法实施过程所用公式

(1)方差

一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:由于在上述过程(1)中我们提到,将X中的每一行进行零均值化,因此方差可以直接用每个元素的平方和除以元素个数表示:

我们希望投影后,投影值尽可能分散,而这种分散度可以用数学上的方差来表示

(2)协方差

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

对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。 数学上可以用两个字段的协方差来表示其相关性。

(3) 协方差矩阵

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

然后我们用X乘以X的转置,并乘上系数1/m: 这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。

3、PCA算法简单示例

这里以上文提到的X

为例,我们用PCA方法将这组二维数据其降到一维。因为这个矩阵的每行已经是零均值,这里我们直接求协方差矩阵:

然后求其特征值和特征向量,具体求解方法不再详述,可以参考相关资料。求解后特征值为:

其对应的特征向量分别是:

其中对应的特征向量分别是一个通解,c1和c2可取任意实数。那么标准化后的特征向量为:

可以验证协方差矩阵C的对角化:

最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:

降维投影结果如下图:

 三、PCA算法代码实现

以一个二维降一维得栗子来展示,其中数据为x = [2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2,1,1.5,1.1], y = [2.4, 0.7, 2.9, 2.2, 3, 2.7, 1.6, 1.1, 1.6, 0.9],在坐标系中展示如下:

import numpy as np
import matplotlib.pyplot as plt x = np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
y = np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
plt.plot(x,y,'o')
plt.show()

#createData
import numpy as np
import matplotlib.pyplot as plt #数据表示
x = np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1])
y = np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])
x1 = x
y1 = y
data = np.matrix([ [x1[i],y1[i]] for i in range(len(x1)) ])
mean_x = np.mean(x)
mean_y = np.mean(y)
x1 = x - mean_x
y1 = y - mean_y
data = np.matrix([ [x1[i],y1[i]] for i in range(len(x1)) ])
print("求均值之后的数据", data)#求协方差矩阵(Covariance Matrix)
cov1 = np.cov(x1,y1)
#求协方差矩阵的特征值和特征向量
#用numpy自带的函数计算特征根和特征向量
val,vec = np.linalg.eig(cov1)
#绘制特征向量的图-->垂直的折线
plt.plot(x1,y1,'o')
xmin,xmax = x1.min(),x1.max()
ymin,ymax = y1.min(),y1.max()
dx = (xmax - xmin) * 0.2
dy = (ymax - ymin) * 0.2
plt.xlim(xmin - dx,xmax + dx)
plt.ylim(ymin - dy,ymax + dy)
plt.plot([vec[:,0][0],0],[vec[:,0][1],0],color ='red')
plt.plot([vec[:,1][0],0],[vec[:,1][1],0],color ='red')
plt.show()#选择主要成分
main_pair = [(np.abs(val[i]) ,vec[:,i]) for i in range(len(val))]
# main_pair = [(0.049, array([-0.735,0.677])) , (1.284, array([-0.678,-0.735]))]
#从main_pair中选取前k个特征向量
#这里是二维数据,取k = 1
feature = main_pair[0][1]
#feature =  array([-0.735,0.677])#原数据 X 特征向量 = 降维后的数据
new_data_reduced = np.transpose(np.dot(feature,np.transpose(data)))
print("降维之后的结果", new_data_reduced)#可视化
new_data = np.transpose(np.dot(vec,np.transpose(data)))
plt.plot(x1,y1,'o',color = 'red')
plt.plot([vec[:,0][0],0],[vec[:,0][1],0],color = 'red')
plt.plot([vec[:,1][0],0],[vec[:,1][1],0],color = 'blue')
plt.plot(new_data[:,0],new_data[:,1],'^',color = 'blue')
plt.plot(new_data_reduced[:,0],[1.4] * 10,'*',color = 'green')
plt.show()

数据求均值之后矩阵为:

求均值之后的数据 [[ 0.69  0.49][-1.31 -1.21][ 0.39  0.99][ 0.09  0.29][ 1.29  1.09][ 0.49  0.79][ 0.19 -0.31][-0.81 -0.81][-0.31 -0.31][-0.71 -1.01]]

所得特征向量的图示(垂直的折线)

特征向量的图示

降维之后的矩阵为:

降维之后的结果 [[-0.17511531][ 0.14285723][ 0.38437499][ 0.13041721][-0.20949846][ 0.17528244][-0.3498247 ][ 0.04641726][ 0.01776463][-0.16267529]]

将上述数据可视化如下(其中绿色的五角星表示PCA降维之后得到的一维数据)

四、代码解析

1、data = np.matrix([ [x1[i],y1[i]] for i in range(len(x1)) ])

np.matrix()将所给数据转化为矩阵的形式,方便调用numpy中的库来进行矩阵的运算

2、mean_x = np.mean(x)

np.mean()主要是用来求均值,举个栗子

>>> a = np.array([[1, 2], [3, 4]])
>>> a
array([[1, 2],[3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis=0) # axis=0,计算每一列的均值
array([ 2.,  3.])
>>> np.mean(a, axis=1) # 计算每一行的均值
array([ 1.5,  3.5])

3、cov1 = np.cov(x1,y1)

np.cov()用来求协方差矩阵,举个栗子

>>> X=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]])
>>> np.cov(X)
array([[  7.  ,   4.5    ,       4.   ,   -0.5     ],[  4.5 ,  10.33333333,   11.5  ,  -7.16666667],[  4.  ,  11.5     ,      13.  ,   -8.5      ],[ -0.5 ,  -7.16666667,   -8.5  ,  6.33333333]])

4、val,vec = np.linalg.eig(cov1)

np.linalg.eig()用来求矩阵的特征值和特征向量,举个栗子

>>> w, v = LA.eig(np.diag((1, 2, 3)))
>>> w; v
array([ 1.,  2.,  3.])
array([[ 1.,  0.,  0.],[ 0.,  1.,  0.],[ 0.,  0.,  1.]])

5、new_data_reduced = np.transpose(np.dot(feature,np.transpose(data)))

np.transpose()表示矩阵的转置,举个栗子

>>> two=np.arange(16).reshape(4,4)
>>> two
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15]])
>>> two.transpose()
array([[ 0,  4,  8, 12],[ 1,  5,  9, 13],[ 2,  6, 10, 14],[ 3,  7, 11, 15]])

np.dot()用来求向量的点积,举个栗子

import numpy as np
x=np.array([0,1,2,3,4])#等价于:x=np.arange(0,5)
y=x[::-1]
print x
print y
print np.dot(x,y)
[0 1 2 3 4]
[4 3 2 1 0]
10

以上是我对PCA算法的理解,并作出整理,如果有什么理解不对的地方还请指导

主成分分析(PCA算法)相关推荐

  1. 机器学习--主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?

    原文链接:主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是"投影"?_天下对手教会少林武僧-CSDN博客_pca投影矩阵 这是从网上看到的PCA算 ...

  2. 主成分分析|PCA算法大全

    主成分分析|PCA算法大全 文章目录 主成分分析|PCA算法大全 1. PCA原理 1.1 最大方差理论 1.2 最小平方误差理论 1.3 高维数据下的特征值分解 2. CCIPCA增量主元分析算法[ ...

  3. 机器学习-降维之主成分分析PCA算法原理及实战

    主成分分析 前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长.社会已经进入大数据时代,数据越多越好似乎已经成为公理.然而,数据量并不是 ...

  4. 主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?

    这是从网上看到的PCA算法的步骤: 第一步,分别求每列的平均值,然后对于所有的样例,都减去对应的均值. 第二步,求特征协方差矩阵. 第三步,求协方差的特征值-显示全部 关注者 1,218 被浏览 78 ...

  5. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)

    文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...

  6. 图解主成分分析PCA算法(附Python实现)

    0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用."深"在详细推导算法模型背后的数学原理:"广"在分析多个机器学习模型:决策树.支持 ...

  7. 从零开始实现主成分分析(PCA)算法

    声明:版权所有,转载请联系作者并注明出处: http://blog.csdn.net/u013719780?viewmode=contents 知乎专栏: https://www.zhihu.com/ ...

  8. 主成分分析 PCA算法

    夹角余弦是用原始数据定义的. 如果改用与样本平均值的比较值, 就是所谓的相似系数rkl (有的文献中也称为相关系数).     rkl构成的矩阵为相似矩阵,多用于Q型分析.式中求和对特征进行(列标处的 ...

  9. 【人脸识别】基于主成分分析PCA算法人脸识别门禁系统含Matlab源码

    1 简介 人脸是反应人身份的最直接的,最可靠的信息资源.通过人脸我们可以很快辨识一个人,这就是所谓的人脸识别.最初的人脸研究人员是一些从事社会心理学的工作者,从20世纪50年代开始有一些文献资料陆续发 ...

  10. 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享

    最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出.降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量.在本文中,我们将讨论 ...

最新文章

  1. 姚期智:中国金融科技发展的真正挑战是什么?如何解决? 本文作者:温晓桦 2017-09-17 18:31 导语:“在金融科技里面,计算机科学的用途已经从台后走到了台中,对核心金融体系的运作上产生一定的
  2. mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
  3. django内置服务器
  4. 如何 给给软件开发 添加 代理_如何与软件开发公司有效沟通
  5. linux的软件很大,linux软件raid10,机器相同,结果差异很大
  6. PyCharm中Scrapy的安装
  7. 计算机视觉书籍学习记录——1最近点匹配
  8. hdu 1361 Parencodings 简单模拟
  9. [转]对企业管理和团队的理解
  10. XMLHTTPRequest如何访问需要安全验证的网站
  11. mysql commit undo_详细分析MySQL事务日志(redo log和undo log)
  12. iOS:copy的本质
  13. Tessellation细分曲面技术(DX11)
  14. c语言模拟uart协议的收发
  15. 2023长江大学计算机考研信息汇总
  16. 数据规范化、实体-联系图、状态转换图、层次方框图、Warnier图、IPO图及验证软件需求
  17. 笔记本运行php的快捷键是啥,雷神笔记本u盘启动快捷键是什么|雷神笔记本按哪个键进u盘启动...
  18. 开源表单推荐:Tduck 填鸭 —— 表单收集器
  19. c语言atm程序个人总结,C语言程序设计报告(模拟ATM取款机)
  20. MyISAM 存储引擎(mysql 8.0)

热门文章

  1. 五险一金缴纳比例及方法
  2. 冷热水龙头_冷热水龙头怎么拆卸?冷热水龙头使用注意事项?
  3. 在远离手机的120个小时里(一)
  4. 计算机网络有哪些工作组,局域网工作组有什么作用?怎么判断两台电脑是不是在一个工作组内...
  5. 2022年千元以下有哪些值得购买的蓝牙耳机?平价耳机深度测评,漫步者、南卡、Vivo、oppo、小米、三星、华为哪款最值得买?
  6. 基于丢包的TCP拥塞控制:从 Reno 到 Bic 与 Cubic
  7. Flutter-选取图库图片和拍照功能,选取视频和拍摄视频
  8. AI数字人:基于VITS模型的中文语音生成训练
  9. 2022工具钳工(初级)考试练习题模拟考试平台操作
  10. 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)