机器学习之数据清洗与特征提取 - 云加社区 - 博客园
garfieldbeverly
7年前
<p>导语:本文详细的解释了机器学习中,经常会用到数据清洗与特征提取的方法PCA,从理论、数据、代码三个层次予以分析。</p> <p>机器学习,这个名词大家都耳熟能详。虽然这个概念很早就被人提出来了,但是鉴于科技水平的落后,一直发展的比较缓慢。但是,近些年随着计算机硬件能力的大幅度提升,这一概念慢慢地回到我们的视野,而且发展速度之快令很多人刮目相看。尤其这两年,阿法狗在围棋届的神勇表现,给人在此领域有了巨大的遐想空间。</p> <p>所谓机器学习,一般专业一点的描述其是:机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。</p> <p>机器学习这门技术是多种技术的结合。而在这个结合体中,如何进行数据分析处理是个人认为最核心的内容。通常在机器学习中,我们指的数据分析是,从一大堆数据中,筛选出一些有意义的数据,推断出一个潜在的可能结论。得出这个不知道正确与否的结论,其经过的步骤通常是:</p> <p><img src="https://simg.open-open.com/show/2b6d281dc830e4dfacc135f65f82b66c.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="550" height="115"></p> <p>1、预处理:把数据处理成一些有意义的特征,这一步的目的主要是为了降维。</p> <p>2、建模:这部分主要是建立模型(通常是曲线的拟合),为分类器搭建一个可能的边界。</p> <p>3、分类器处理:根据模型把数据分类,并进行数据结论的预测。</p> <p>本文讲的主要是数据的预处理(降维),而这里采用的方式是PCA。</p> <h3>PCA的个人理论分析:</h3> <p>假设有一个学生信息管理系统,里面需要存储人性别的字段,我们在数据库里可以有M、F两个字段,用1、0分别代表是、否。当是男学生的时候其中M列为1,F列为0,为女生时M列为0,F列为1。我们发现,对任意一条记录,当M为1,F必然为0,反之也是如此。因此实际过程,我们把M列或F列去掉也不会丢失任何信息,因为我们可以反推出结论。这种情况下的M、F列的关联比是最高的,是100%。</p> <p>再举另外一个例子,小明开了家店铺,他每天在统计其店铺的访问量V和成交量D。可以发现,往往V多的时候,D通常也多。D少的时候,V通常也很少。可以猜到V和D是有种必然的联系,但又没有绝对的联系。此时小明如果想根据V、D来衡量这一天的价值,往往可以根据一些历史数据来计算出V、D的关联比。拍脑门说一个,如果关联比大于80%,那么可以取VD其中任意一个即可衡量当天价值。这样就达到了降维的效果。</p> <p>当然降维并非只能在比如说2维数据[V,D]中选取其中的1维[V]作为特征值,它有可能是在V+D的情况下,使得对[V, D]的关联比最大。</p> <p>但是PCA思想就是如此。简单点说:假设有x1、x2、x3…xn维数据,我们想把数据降到m维,我们可以根据这n维的历史数据,算出一个与x1…xn相关m维数据,使得这个m维数据对历史数据的关联比达到最大。</p> <h3>数学分析</h3> <p>假设我们有一组二维数据</p> <p><img src="https://simg.open-open.com/show/7edde927358e7e1a07f6fc5c85a96615.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="138" height="35"></p> <p>如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?</p> <p>这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。</p> <p>那么如何选择这个方向才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散,这样投影的范围越大,在做分类的时候也就更容易做分类器。</p> <p><img src="https://simg.open-open.com/show/43a9cb6cad6f135e1800ce524fae9a3b.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="481" height="278"></p> <p>以上图为例,可以看出如果向x轴投影,那么最左边的两个点会重叠在一起,中间的两个点也会重叠在一起,于是本身四个各不相同的二维点投影后只剩下两个不同的值了,这是一种严重的信息丢失。同理,如果向y轴投影中间的三个点都会重叠,效果更糟。所以看来x和y轴都不是最好的投影选择。直观来看,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。</p> <p>我们希望投影后投影值尽可能分散,那什么是衡量分散程度的统计量呢,显然可以用数学上的方差来表述。</p> <p><img src="https://simg.open-open.com/show/4e5ec0aec1eca8769b079dae74e93630.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="205" height="51"></p> <p>通常,为了方便计算,我们会把每个点都减去均值,这样得到的点的均值就会为0.这个过程叫做均一化。均一化后:</p> <p><img src="https://simg.open-open.com/show/31e4774979befbaa119b7676f5f3f5f0.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="168" height="51"></p> <p>于是上面的问题被形式化表述为:寻找一个基,使得所有数据变换为这个基上的坐标表示后,方差值最大。</p> <p>我们跳出刚才的例子,因为很容易把刚才的结论推广到任意纬度。要求投影点的方差最大值所对应的基u,这时有两种方法来求解:</p> <p>方法一:</p> <p>假设有个投影A:<img src="https://simg.open-open.com/show/f3dec69ce73c8d9d4fb533e23c989eb6.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="243" height="33"></p> <p>显然刚才说的方差V可以用来表示:<img src="https://simg.open-open.com/show/cb2dc2e7ea5c9543ce05c840761dec54.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="176" height="33"></p> <p>而投影A = 原始数据X . U;</p> <p>这样方差可以表示为:<img src="https://simg.open-open.com/show/761fe8418881685ff8561f74e2424359.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="301" height="32"></p> <p>求这个方差的最大值,我们可以用拉格朗日插值法来做</p> <p>L(u,λ)为:<img src="https://simg.open-open.com/show/37d06d673d82d4aed8b013835e8d7817.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="340" height="35"></p> <p><img src="https://simg.open-open.com/show/182b214c45cec29a0a1d4ad8527d5c39.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="460" height="74"></p> <p>求导L’:<img src="https://simg.open-open.com/show/35b042c78ab2b280a8ad7f55dbf544bc.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="216" height="55"></p> <p>令导数为0:<img src="https://simg.open-open.com/show/962f43e844efc51f868859fc7cc2769d.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="211" height="37"></p> <p>这样问题就转换成求X.XT的特征值和特征向量,问题就迎刃而解了。</p> <p>同时我们可以知道,特征值和特征向量有很多个,当λ最大的时候所对应的特征向量,我们把它叫作主成份向量。如果需要将m降维为n,只需要去前n大的特征值所对应的特征向量即可。</p> <p>方法二:</p> <p>对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,首先我们希望找到一个方向(基)使得投影后方差最大,当我们找第二个方向(基)的时候,为了最大可能还原多的信息,我们显然不希望第二个方向与第一个方向有重复的信息。这个从向量的角度看,意味这一个向量在另一个向量的投影必须为0.</p> <p>这就有:<img src="https://simg.open-open.com/show/473dcd74434d4c30e9593296f977bba4.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="148" height="46"></p> <p>这时候我们思路就很明了:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段本身的方差则尽可能大。</p> <p>还是假设我们原始数据为A</p> <p><img src="https://simg.open-open.com/show/b87f0ad5aa21126e2bcbd8639f8e4de2.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="243" height="94"></p> <p>我们做一个处理 <img src="https://simg.open-open.com/show/86949fb2a0adf8520320e6f373663bc4.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="13" height="34"> A.A <sup>T</sup> 得到:</p> <p><img src="https://simg.open-open.com/show/74909f7a83cca4c33b3922f615f1ecfb.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="496" height="195"></p> <p>我们发现要是能找到一个基使得这个矩阵变成一个,除了斜对角外,其余全是0的话,那这个基就是我们需要的基。那么问题就转换成矩阵的对角化了。</p> <p>先说一个先验知识:</p> <p>在线性代数上,我们可以知道实对称矩阵不同特征值对应的特征向量必然正交。对一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en。</p> <p>组合成矩阵的形式如图:<img src="https://simg.open-open.com/show/c6593265cd4567b7fb66ecef371e35e5.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="148" height="22"></p> <p>由上结论又有一个新的结论就是,对于实对称矩阵A,它的特征向量矩阵为E,必然满足:</p> <p><img src="https://simg.open-open.com/show/860fbeb33990e4cf2f581d5b89bed9a6.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="245" height="101"></p> <p>有了这个先验知识,我们假设原始数据A,基为U,投影后的数据为Y。则有Y=UA。根据上面所说的要是投影后的矩阵Y的 <img src="https://simg.open-open.com/show/86949fb2a0adf8520320e6f373663bc4.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="13" height="34"> Y.Y <sup>T</sup> 为一个对角阵,那么就有:</p> <p><img src="https://simg.open-open.com/show/9dde35cb488730d8f454b59004683235.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="216" height="116"></p> <p>要是 <img src="https://simg.open-open.com/show/86949fb2a0adf8520320e6f373663bc4.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="13" height="34"> Y.Y <sup>T</sup> 为对角阵,那么只需要U是 <img src="https://simg.open-open.com/show/86949fb2a0adf8520320e6f373663bc4.gif" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="13" height="34"> A.A <sup>T</sup> 的特征向量即可,那么问题最终还是转换为求AA <sup>T</sup> 的特征向量。</p> <p>代码实现:</p> <p>刚才说了两种PCA的计算思路,我们简单看下代码的实现吧,由于matlab自带了求特征向量的函数,这边使用matlab进行模拟。</p> <p><img src="https://simg.open-open.com/show/383d4bef6334b20f0126b81172a9eaca.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="550" height="675"></p> <p><img src="https://simg.open-open.com/show/abbeef9762e5f8b82c57c3233f5446fb.png" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="504" height="398"></p> <p>我们用测试数据试试:</p> <p><img src="https://simg.open-open.com/show/428583984dc3bfd07dcfe8fbf79551a2.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="445" height="191"></p> <p>当我们只保留0.5的成分时,newA从3维降到1维,当进行还原时,准确性也会稍微差些</p> <p><img src="https://simg.open-open.com/show/0f8f6a19eb1b730ba2e12cb780c809be.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="165" height="178"></p> <p><img src="https://simg.open-open.com/show/c3a692a01d4e9888d05b790b7dcb7bd9.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="155" height="179"></p> <p>当我们保留0.9的成分时,newA从3维降到2维,当进行还原时,还原度会稍微好些。</p> <p><img src="https://simg.open-open.com/show/9890ceb616628dcc2319501c232ab7fd.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="161" height="171"></p> <p><img src="https://simg.open-open.com/show/01cf6f7e77d19d1f704c75fac4a514fb.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="150" height="169"></p> <p>当我们保留0.97的成分时,就无法降维了。这时候就可以100%还原了。</p> <p><img src="https://simg.open-open.com/show/78f4f80045efc8aae02f6e6977684b5b.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="160" height="170"></p> <p><img src="https://simg.open-open.com/show/8d5c60bf94ef4e7f79ea1557aeba7a23.jpg" alt="机器学习之数据清洗与特征提取 - 云加社区 - 博客园" width="148" height="169"></p> <p>总结一下:</p> <p>我们在做机器学习的数据分析的时候,由于数据集的维度可能很高,这时候我们需要对数据进行降维。本文从各个方向介绍了一下降维的经典方法PCA,也从代码的角度告诉了怎么降维的过程。实际操作可能会比较简单,但是原理个人觉得还是有学习的地方的。</p> <p> </p> <p> </p> <p>来自:<a href="http://www.cnblogs.com/qcloud1001/p/8038737.html?utm_source=tuicool&utm_medium=referral">http://www.cnblogs.com/qcloud1001/p/8038737.html</a></p> <p> </p>