数据挖掘实战:PCA算法

PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的。

为什么要进行数据降维?因为实际情况中我们的训练数据会存在特征过多或者是特征累赘的问题,比如:

  • 一个关于汽车的样本数据,一个特征是”km/h的最大速度特征“,另一个是”英里每小时“的最大速度特征,很显然这两个特征具有很强的相关性
  • 拿到一个样本,特征非常多,样本缺很少,这样的数据用回归去你和将非常困难,很容易导致过度拟合

PCA算法就是用来解决这种问题的,其核心思想就是将 n 维特征映射到 k 维上(k < n),这 k 维是全新的正交特征。我们将这 k 维成为主元,是重新构造出来的 k 维特征,而不是简单地从 n 维特征中取出其余 n-k 维特征。

PCA 的计算过程

假设我们得到 2 维数据如下:

其中行代表样例,列代表特征,这里有10个样例,每个样例有2个特征,我们假设这两个特征是具有较强的相关性,需要我们对其进行降维的。

第一步:分别求 x 和 y 的平均值,然后对所有的样例都减去对应的均值

这里求得 x 的均值为 1.81 , y 的均值为 1.91,减去均值后得到数据如下:

注意,此时我们一般应该在对特征进行方差归一化,目的是让每个特征的权重都一样,但是由于我们的数据的值都比较接近,所以归一化这步可以忽略不做

第一步的算法步骤如下:

本例中步骤3、4没有做。

第二步:求特征协方差矩阵

公式如下:

第三步:求解协方差矩阵的特征值和特征向量

第四步:将特征值从大到小进行排序,选择其中最大的 k 个,然后将其对应的 k 个特征向量分别作为列向量组成特征矩阵

这里的特征值只有两个,我们选择最大的那个,为: 1.28402771 ,其对应的特征向量为:

注意:matlab 的 eig 函数求解协方差矩阵的时候,返回的特征值是一个特征值分布在对角线的对角矩阵,第 i 个特征值对应于第 i 列的特征向量

第五步: 将样本点投影到选取的特征向量上

假设样本列数为 m ,特征数为 n ,减去均值后的样本矩阵为 DataAdjust(m*n),协方差矩阵为 n*n ,选取 k 个特征向量组成后的矩阵为 EigenVectors(n*k),则投影后的数据 FinalData 为:

FinalData (m*k) = DataAdjust(m*n) X EigenVectors(n*k)

得到的结果是:

这样,我们就将 n 维特征降成了 k 维,这 k 维就是原始特征在 k 维上的投影。

整个PCA的过程貌似很简单,就是求协方差的特征值和特征向量,然后做数据转换。但为什么协方差的特征向量就是最理想的 k 维向量?这个问题由PCA的理论基础来解释。

PCA 的理论基础

关于为什么协方差的特征向量就是 k 维理想特征,有3个理论,分别是:

  1. 最大方差理论
  2. 最小错误理论
  3. 坐标轴相关度理论

这里简单描述下最大方差理论:

最大方差理论

信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。因此我们认为,最好的 k 为特征既是将 n 维样本点转换为 k 维后,每一维上的样本方差都很大

PCA 处理图解如下:

降维转换后:

上图中的直线就是我们选取的特征向量,上面实例中PCA的过程就是将空间的2维的点投影到直线上。

那么问题来了,两幅图都是PCA的结果,哪一幅图比较好呢?

根据最大方差理论,答案是左边的图,其实也就是样本投影后间隔较大,容易区分。

其实从另一个角度看,左边的图每个点直线上的距离绝对值之和比右边的每个点到直线距离绝对值之和小,是不是有点曲线回归的感觉?其实从这个角度看,这就是最小误差理论:选择投影后误差最小的直线。

再回到上面的左图,也就是我们要求的最佳的 u ,前面说了,最佳的 u 也就是最佳的曲线,它能够使投影后的样本方差最大或者是误差最小。

另外,由于我们前面PCA算法第一步的时候已经执行对样本数据的每一维求均值,并让每个数据减去均值的预处理了,所以每个特征现在的均值都为0,投影到特征向量上后,均值也为0.因此方差为:

最后的等式中中间的那部分其实就是样本方差的协方差矩阵(xi 的均值为 0)

由于 u 是单位向量,得到

上式两边痛乘以 u,得到:

于是我们得到

最佳投影直线就是特征值 λ 最大是对应的特征向量,其次是 λ 第二大对应的特征向量(求解的到的特征向量都是正交的)。其中 λ 就是我们的方差,也对应了我们前面的最大方差理论,也就是找到能够使投影后方差最大的直线。

Python实现

1.代码实现

伪代码如下(摘自机器学习实战):

2.代码下载

下载地址: https://github.com/jimenbian/PCA

loadDataSet函数是导入数据集。

PCA输入参数:参数一是输入的数据集,参数二是提取的维度。比如参数二设为1,那么就是返回了降到一维的矩阵。

PCA返回参数:参数一指的是返回的低维矩阵,对应于输入参数二。参数二对应的是移动坐标轴后的矩阵。

上一张图,绿色为原始数据,红色是提取的2维特征。

Matlab 实现

function [lowData,reconMat] = PCA(data,K)[row , col] = size(data);meanValue = mean(data);%varData = var(data,1,1);normData = data - repmat(meanValue,[row,1]);covMat = cov(normData(:,1),normData(:,2));%求取协方差矩阵[eigVect,eigVal] = eig(covMat);%求取特征值和特征向量[sortMat, sortIX] = sort(eigVal,'descend');[B,IX] = sort(sortMat(1,:),'descend');len = min(K,length(IX));eigVect(:,IX(1:1:len));lowData = normData * eigVect(:,IX(1:1:len));reconMat = (lowData * eigVect(:,IX(1:1:len))') + repmat(meanValue,[row,1]); % 将降维后的数据转换到新空间end

调用方式

function testPCA%%clcclearclose all%%filename = 'testSet.txt';K = 1;data = load(filename);[lowData,reconMat] = PCA(data,K);figurescatter(data(:,1),data(:,2),5,'r')hold onscatter(reconMat(:,1),reconMat(:,2),5)hold offend

效果图

(via: Liu_LongPo的专栏)

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习思考者

深入浅出——搞懂卷积神经网络误差分析(一)

第一部分 全连接网络的权值更新   卷积神经网络使用基于梯度的学习方法进行监督训练,实践中,一般使用随机梯度下降(机器学习中几种常见的梯度下降方式)的版本,对于...

2197
来自专栏AI2ML人工智能to机器学习

矩阵分解 (乘法篇)

前面我们在矩阵分解 (加法篇)里面分析的加法下的矩阵分解。 这里我们来看看乘法下矩阵分解的要点。

441
来自专栏海天一树

Precision, Recall, F-score, ROC, AUC

正样本就是使系统得出正确结论的例子,负样本相反。 比如你要从一堆猫狗图片中检测出狗的图片,那么狗就是正样本,猫就是负样本;反过来你若是想检测出猫的图片,那么猫就...

351
来自专栏郑克松的专栏

人脸对齐:ASM (主动形状模型)算法

在这里, 我们重点讨论在人脸上的应用。在 PDM 中,外形相似的物体,例如人脸、人手等几何形状可以通过若干关键特征点(landmarks)的坐标依次串联形成一个...

8090
来自专栏机器学习算法与Python学习

特征学习之卷积神经网络

今天介绍卷积神经网络(cnn)的训练方法,即:随机梯度下降和误差反向传播。 先说下推导的思路: (1)说明CNN是一种局部连接和权值共享...

3097
来自专栏desperate633

小白也能看懂的BP反向传播算法之Further into Backpropagation

在上一篇文章小白也能看懂的BP反向传播算法之Let's practice Backpropagation,我们计算了一个带sigmoid函数的嵌套网络的反向传播...

411
来自专栏懒人开发

(3.11)James Stewart Calculus 5th Edition:Linear Approximations and Differentials

这个时候,对应的 f(x)的近似值,我们叫做 linear approximation 线性近似 或者 tangent line approximation...

793
来自专栏机器学习原理

机器学习(20)——数据降维为什么要降维?PCA原理LDA比较:

前言:正所谓每一个结果的出现都是一系列的原因导致的,当构建机器学习模型时候,有时候数据特征异常复杂,这就需要经常用到数据降维技术,下面主要介绍一些降维的主要原理...

5148
来自专栏机器学习算法与Python学习

机器学习(33)之局部线性嵌入(LLE)【降维】总结

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 局部线性嵌入(Locally ...

3598
来自专栏深度学习之tensorflow实战篇

PCA: Principal Components Analysis,主成分分析法原理

PCA: Principal Components Analysis,主成分分析法原理 1、引入   PCA算法是无监督学习专门用来对高维数据进行降维而设计...

4556

扫描关注云+社区