降维是机器学习中十分重要的部分,降维就是通过一个特定的映射(可以是线性的或非线性的)将高维数据转换为低维数据,从而达到一些特定的效果,所以降维算法最重要的就是找到这一个映射。主成分分析(Principal Component Analysis, PCA)是一种最经典,也是最简单的降维算法。PCA可以保证降维之后,重构回原数据的效果最好,因此广泛用于对高维数据的预处理。

1. 一个投影的PCA求解

设样本矩阵为\(X=[x_1,x_2,\cdots,x_n]\in \mathbb R^{m\times n}\),其中样本向量\(x_i\in\mathbb R^m\),样本均值为

\[\bar x=\frac1n\sum_{i=1}^nx_i
\]

我们现在要找到一个投影向量\(p\in\mathbb R^m\),且\(\|p\|_2=1\),将各样本映射到一个\(1\)维空间中,

\[y=p^Tx\in\mathbb R
\]

在这里,\(p^Tx\)称为一个主成分

PCA的目标是最大化投影后的样本方差,方差也可以称为样本的散度,方差越大则样本的散度越大(样本点在空间中的分布越散乱),相反,如果散度越小,样本投影之后越聚集,就越难以重构(可以结合信息熵来理解,熵值越大信息越多)。最大化散度的方案可以保证投影产生的信息丢失最少,因此PCA总可以保证降维之后的数据是最接近原数据的。在当前情形下,PCA的优化问题是:

\[\begin{eqnarray*}
&&\max_{p^Tp=1} \sum_{i=1}^n{(y-\bar y)^2}\\
=&&\max_{p^Tp=1} \sum_{i=1}^n{(p^Tx-p^T\bar x)^2}\\
=&&\max_{p^Tp=1} \sum_{i=1}^n{(p^Tx-p^T\bar x)(p^Tx-p^T\bar x)^T}\\
=&&\max_{p^Tp=1} \sum_{i=1}^n{p^T(x-\bar x)(x-\bar x)^Tp}\\
=&&\max_{p^Tp=1} p^T\left[\sum_{i=1}^n{(x-\bar x)(x-\bar x)^T}\right]p\\
=&&\max_{p^Tp=1} p^TSp\tag{1}
\end{eqnarray*}
\]

其中,定义散度矩阵(亦称作协方差矩阵)为

\[S=\sum_{i=1}^n{}(x-\bar x)(x-\bar x)^T=\hat X\hat X^T
\]

这里\(\hat X\)是去中心化后的样本矩阵,即\(\hat X=[x_1-\bar x,x_2-\bar x,\cdots,x_n-\bar x]\),考虑到\((1)\)中含有等式约束,我们可以用使用拉格朗日乘数法解优化问题\((1)\),首先定义拉格朗日函数为

\[L(p,\lambda)=p^TSp+\lambda(1-p^Tp)
\]

令\(L\)对\(p\)的偏导为\(0\)得到:

\[\begin{eqnarray*}
\frac{\partial L}{\partial p}&=&Sp-\lambda p=0\\
\Rightarrow Sp&=&\lambda p\tag{2}
\end{eqnarray*}
\]

将\((2)\)代回\((1)\)中得到

\[\begin{eqnarray*}
&&\max_{p^Tp=1}{p^TSp}\\=&&\max_{p^Tp=1}{p^T\lambda p}\\=&&\max_{p^Tp=1}{\lambda}\tag{3}
\end{eqnarray*}
\]

显然\((2)\)是一个特征值问题,根据\((3)\)可以知道,最大的特征值对应的特征向量就是我们所需的投影向量\(p\)。

2. 多个投影的PCA求解

在前面我们获得了一个投影向量,可以将样本投影到一维空间,在一般情况下我们需要指定降维维数\(d\),这样就需要\(d\)个投影向量。这样我们的目标就是一个投影矩阵\(P=[p_1,p_2,\cdots,p_d]\in\mathbb{R}^{m\times d}\),并且\(P\)的各个投影\(p_i\)都是标准正交的(正交性可以保证每一个主成分之间都互不相关),也即\(P^TP=I\)。样本可以通过\(P\)投影到\(d\)维空间:

\[y=P^Tx\in\mathbb R^d
\]

\(y\)中的每一个元素都是一个主成分,此处它包含了个\(d\)个互不相关的主成分。

PCA的优化目标仍然是最大化样本的散度,同理,它的优化目标是:

\[\begin{eqnarray*}
&&\max_{P^TP=I} \sum_{i=1}^n{\|y-\bar y\|^2_2}\\
=&&\max_{P^TP=I} \sum_{i=1}^n{\|P^Tx-P^T\bar x\|^2_2}\\
=&&\max_{P^TP=I} \sum_{i=1}^n{tr\left[(P^Tx-P^T\bar x)(P^Tx-P^T\bar x)^T\right]}\\
=&&\max_{P^TP=I} \sum_{i=1}^n{tr\left[P^T(x-\bar x)(x-\bar x)^TP\right]}\\
=&&\max_{P^TP=I} tr\left\{P^T\left[\sum_{i=1}^n{(x-\bar x)(x-\bar x)^T}\right]P\right\}\\
=&&\max_{P^TP=I} tr(P^TSP)\\
=&&\max_{p_i^Tp_i=1} \sum_{i=1}^n{p_i^TSp_i}\tag{4}
\end{eqnarray*}
\]

这里\((4)\)和\((1)\)具有相同的形式,我们仍然可以通过拉格朗日乘数法来求解,而这里我们获得的投影矩阵是\(S\)的前\(d\)个最大特征值对应的特征向量依次排列组成的。

一般我们定义能量占比来选取\(d\)的大小,设定一个阈值\(\alpha\)(一般取\(0.95,0.98\)等),则\(d\)由下式给出

\[\min_{d}\left\{d\ |\ E=\frac{\sum_{i=1}^d \lambda_i}{\sum_{i=1}^n\lambda_i}>\alpha\right\}
\]

\(\lambda_i\)是第\(i\)大的特征值,\(E\)是能量占比,这个式子的意义是,选择能够使能量占比达到阈值的最小的\(d\)作为降维维数,这样可以保证主要的信息(也就是特征值大的那些投影)能够被获取,那些特征值很小的投影被丢弃,PCA通过这种方式可以去除散度矩阵的零空间,从而去除了原样本的无用信息。

总结一下,PCA的步骤很简单:

  1. 计算去中心化后的样本矩阵矩阵\(\hat X\),求出散度矩阵\(S\)

  2. 对散度矩阵\(S\)进行特征分解

  3. 最后取它前\(d\)个最大特征值的特征向量作为投影矩阵\(P\)。

3. 基于最小化重构误差的理解

以上我们从最大化散度的角度出发理解了PCA。由于PCA本质上要求降维产生的数据信息的损失最少,因此我们可以从最小化重构误差的角度出发,也能得到相同的结果。

首先我们需要知道投影后的数据是如何重构的,在这里重构就是投影的逆过程,重构数据就因此被定义为

\[x'=Py=PP^Tx
\]

在这里,PCA想要做到重构后的数据可以近似为原始数据,即

\[x'=y_1p_1+y_2p_2+\cdots+y_dp_d\approx x
\]

这里的\(y_ip_i(i=1,2,\cdots,d)\)其实是数据的每一个投影分量。也就是说我们希望误差\(\|x-x'\|_2\)越小越好,对应的优化问题是

\[\begin{eqnarray*}
&&\min_{P^TP=I}\sum_{i=1}^n{\|x_i-x_i'\|_2^2}\\
=&&\min_{P^TP=I}\sum_{i=1}^n{\|x_i-PP^Tx_i\|_2^2}\\
=&&\min_{P^TP=I}{\|X-PP^TX\|_F^2}\\
=&&\min_{P^TP=I}tr\left[(X-PP^TX)(X-PP^TX)^T\right]\\
=&&\min_{P^TP=I}tr(XX^T)-2tr(XX^TPP^T)+tr(PP^TXX^TPP^T)\\
=&&\min_{P^TP=I}tr(P^TXX^TPP^TP)-2tr(P^TXX^TP)\\
=&&\min_{P^TP=I}-tr(P^TXX^TP)\\
=&&\max_{P^TP=I}tr(P^TXX^TP)\\
\end{eqnarray*}
\]

如果假设散度矩阵是\(S_0=XX^T\),则原优化问题变为

\[\max_{P^TP=I}tr(P^TS_0P)
\]

这个问题我们已经很熟悉了:\(P\)就是\(S_0\)的前\(d\)个最大特征值对应的特征向量组成的。

注意到,在之前我们用到的散度矩阵是\(S=\hat X\hat X^T\),这里的\(\hat X\)是去中心化过的样本矩阵,但根据以上的推导,样本矩阵完全可以不用去中心化,直接计算\(S_0\)进行特征分解依然可以实现PCA,但这不意味着用\(S\)和用\(S_0\)得到的计算结果是相同的:去中心化可以帮助减少样本数据偏移(bias)的影响,不去中心化时可以用更少的投影就达到很好的重构效果,在样本均值为\(0\)的时候,这两种方法没有区别。在实际应用中,使用\(S_0\)或者\(S\)作特征分解都是可行的。

机器学习笔记簿 降维篇 PCA 01的更多相关文章

  1. 机器学习笔记簿 降维篇 LDA 01

    机器学习中包含了两种相对应的学习类型:无监督学习和监督学习.无监督学习指的是让机器只从数据出发,挖掘数据本身的特性,对数据进行处理,PCA就属于无监督学习,因为它只根据数据自身来构造投影矩阵.而监督学 ...

  2. iOS开发Swift篇(01) 变量&常量&元组

    iOS开发Swift篇(01) 变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对于14年 ...

  3. 【机器学习】主成分分析法 PCA (I)

    主成分分析算法是最常见的降维算法,在PCA中,我们要做的是找到一个方向向量,然后我们把所有的数都投影到该向量上,使得投影的误差尽可能的小.投影误差就是特征向量到投影向量之间所需要移动的距离. PCA的 ...

  4. 机器学习算法总结(九)——降维(SVD, PCA)

    降维是机器学习中很重要的一种思想.在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”.另 ...

  5. 机器学习基础与实践(三)----数据降维之PCA

    写在前面:本来这篇应该是上周四更新,但是上周四写了一篇深度学习的反向传播法的过程,就推迟更新了.本来想参考PRML来写,但是发现里面涉及到比较多的数学知识,写出来可能不好理解,我决定还是用最通俗的方法 ...

  6. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  7. 机器学习之路:python 特征降维 主成分分析 PCA

    主成分分析: 降低特征维度的方法. 不会抛弃某一列特征, 而是利用线性代数的计算,将某一维度特征投影到其他维度上去, 尽量小的损失被投影的维度特征 api使用: estimator = PCA(n_c ...

  8. 吴裕雄 python 机器学习——主成份分析PCA降维

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...

  9. 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维

    PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...

随机推荐

  1. 四. sql上线平台

    一.inception安装使用 inception是一个集审核.执行.备份及生成回滚语句于一身的MySQL自动化运维工具 [root@CentOS ~]# [root@CentOS ~]# wget ...

  2. 记一次服务器被植入挖矿木马cpu飙升200%解决过程

    线上服务器用的是某讯云的,欢快的完美运行着Tomcat,MySQL,MongoDB,ActiveMQ等程序.突然一则噩耗从前线传来:网站不能访问了. 此项目是我负责,我以150+的手速立即打开了服务器 ...

  3. application.yml和application.properties文件的区别

    maven项目 .yml文件时树状结构,层级浅时比较方便,层级深的时候就比较麻烦了 .properties文件时属性访问结构,层级深浅对它来说是一样的,而且相较于.yml类型的文件比较好配置,但缺点也 ...

  4. 数据的编码和解码--java例子

    昨天借了一本<网络程序设计实验教程(java语言)>,然后看了第一章,一个Swing例子,于是为大家分享一下! 关于数据的编码与解码,我觉得就例子而言已经交待得非常清楚了,两种方法做的. ...

  5. 在页面制作的时候常用的html页面滚动加载,可视区域判断方法

    演示图 考虑2个情况一种情况初始状态下 滚动到在中间区域的时候,这时上半部分看不见的元素就不给字体添加红色一种情况是,从头向下看的. 代码 .ss li { margin: 40px; } <d ...

  6. idea 快速生成返回值快捷方式

    idea java快速生成返回值   ctrl+alt+V

  7. Problem C Emergency Evacuation 一道思维题

    题目描述 输入 输出 样例 样例输入 样例输入一 样例输入二 样例输出 样例输出一 9 样例输出二 1008 一句话题意:给你一个车厢和一些人,这些人都坐在座位上,求这些人全部出去的时间最小值. 分析 ...

  8. Django---drf第一天---作业

    1 图书的5个接口写完(使用序列化组件) urls.py from django.contrib import admin from django.urls import path, re_path ...

  9. 仅需5步,轻松升级K3s集群!

    Rancher 2.4是Rancher目前最新的版本,在这一版本中你可以通过Rancher UI对K3s集群进行升级管理. K3s是一个轻量级Kubernetes发行版,借助它你可以几分钟之内设置你的 ...

  10. C# DataTable与Excel读取与导出

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...