<p>原文链接http://blog.codinglabs.org/articles/pca-tutorial.html</p>
<p><br> </p>
<p></p>
<p>PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。网上关于PCA的文章有很多,但是大多数只描述了PCA的分析过程,而没有讲述其中的原理。这篇文章的目的是介绍PCA的基本数学原理,帮助读者了解PCA的工作机制是什么。</p>
<p>当然我并不打算把文章写成纯数学文章,而是希望用直观和易懂的方式叙述PCA的数学原理,所以整个文章不会引入严格的数学推导。希望读者在看完这篇文章后能更好的明白PCA的工作原理。</p>
<h1 id="数据的向量表示及降维问题">数据的向量表示及降维问题</h1>
<p>一般情况下,在数据挖掘和机器学习中,数据被表示为向量。例如某个淘宝店2012年全年的流量及交易情况可以看成一组记录的集合,其中每一天的数据是一条记录,格式如下:</p>
<p>(日期, 浏览量, 访客数, 下单数, 成交数, 成交金额)</p>
<p>其中“日期”是一个记录标志而非度量值,而数据挖掘关心的大多是度量值,因此如果我们忽略日期这个字段后,我们得到一组记录,每条记录可以被表示为一个五维向量,其中一条看起来大约是这个样子:</p>
<div class="MathJax_Display" style="text-align:center">
<span class="MathJax" id="MathJax-Element-1-Frame" style="text-align:center; position:relative" tabindex="0">
<span class="math" id="MathJax-Span-1" style="width:15.531em; display:inline-block"><span style="display:inline-block; position:relative; width:11.923em; height:0px; font-size:130%"><span style="position:absolute; top:-2.26em; left:0em"><span class="mrow" id="MathJax-Span-2"><span class="mo" id="MathJax-Span-3" style="font-family:MathJax_Main">(</span><span class="mn" id="MathJax-Span-4" style="font-family:MathJax_Main">500</span><span class="mo" id="MathJax-Span-5" style="font-family:MathJax_Main">,</span><span class="mn" id="MathJax-Span-6" style="font-family:MathJax_Main; padding-left:0.167em">240</span><span class="mo" id="MathJax-Span-7" style="font-family:MathJax_Main">,</span><span class="mn" id="MathJax-Span-8" style="font-family:MathJax_Main; padding-left:0.167em">25</span><span class="mo" id="MathJax-Span-9" style="font-family:MathJax_Main">,</span><span class="mn" id="MathJax-Span-10" style="font-family:MathJax_Main; padding-left:0.167em">13</span><span class="mo" id="MathJax-Span-11" style="font-family:MathJax_Main">,</span><span class="mn" id="MathJax-Span-12" style="font-family:MathJax_Main; padding-left:0.167em">2312.15</span><span class="msubsup" id="MathJax-Span-13"><span style="display:inline-block; position:relative; width:0.946em; height:0px"><span style="position:absolute; top:-3.99em; left:0em"><span class="mo" id="MathJax-Span-14" style="font-family:MathJax_Main">)</span><span style="display:inline-block; width:0px; height:3.99em"></span></span><span style="position:absolute; top:-4.403em; left:0.389em"><span class="texatom" id="MathJax-Span-15"><span class="mrow" id="MathJax-Span-16"><span class="mi" id="MathJax-Span-17" style="font-family:MathJax_SansSerif; font-size:70.7%">T</span></span></span><span style="display:inline-block; width:0px; height:3.99em"></span></span></span></span></span><span style="display:inline-block; width:0px; height:2.26em"></span></span></span><span style="display:inline-block; overflow:hidden; vertical-align:-0.388em; border-left:0px solid; width:0px; height:1.619em"></span></span>
</span>
</div>
<p>注意这里我用了转置,因为习惯上使用列向量表示一条记录(后面会看到原因),本文后面也会遵循这个准则。不过为了方便有时我会省略转置符号,但我们说到向量默认都是指列向量。</p>
<p>我们当然可以对这一组五维向量进行分析和挖掘,不过我们知道,很多机器学习算法的复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联。当然,这里区区五维的数据,也许还无所谓,但是实际机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。</p>
<p>降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。</p>
<p>举个例子,假如某学籍数据有两列M和F,其中M列的取值是如何此学生为男性取值1,为女性取值0;而F列是学生为女性取值1,男性取值0。此时如果我们统计全部学籍数据,会发现对于任何一条记录来说,当M为1时F必定为0,反之当M为0时F必定为1。在这种情况下,我们将M或F去掉实际上没有任何信息的损失,因为只要保留一列就可以完全还原另一列。</p>
<p>当然上面是 |
|