Neural network(1)

宏观理解 神经网络感觉人人都知道的感觉。它是个仿生学的模型,仿的就是我们的大脑神经网。我们的大脑神经是由一个一个神经元组成的,一旦有冲动神经元之间就会传递这种冲动, 从起点传输到终点然后我们会接收到信号,做出相应的反射动作。人工神经网络就是模仿了这一种信号传递的过程,就好比我们眼前看到的是一个木板四条腿没有脑袋没有嘴,通过视觉神经传输到大脑皮层的神经网,最后成像告诉大脑哦这货看到一张桌子。过程就像这张图: 我们也可以让人工神经网络接收一些东西比如一个特征矩阵,一张图片,一段声波,一连串单词,最后来告诉我这是个啥?这项技术其实从19世纪就有了,后来因为技术不成熟被人遗忘,但是从90年代开始突飞猛进一下超过了很多别的机器学习模型,又在2012年因为ImageNet竞赛秒杀所有模型掀起神经网络的热潮。 直到今天很多衍生物比如CNN, RNN的诞生更是加剧了人们对神经网络的兴趣。一个人类还摸不到底的模型,不多说了看细节吧。 微观分析 我们先说2层的神经网络,一般说几层,指的是有多少层包含权重,两层的神经网络就是这样的: 仅有隐含层(hidden layer)和输出层(output layer)有权重,所以我们叫它两层神经网络。输入层的每个x1,x2,x3是我们的features输入,通过中间隐含层的去线性化,然后通过两层权重(weight,即图中w)最后得到答案。如果是二分类问题,输出层可能只有一个node用来表示y = 1的概率,如果我们用sigmoid激活函数就是这样。多分类问题就比其他模型简单了,最后一层的激活函数换成softmax就好,比如上图我们想像成一个2分类的softmax函数。 激活函数的目的就是去线性化,我们知道逻辑回归是一个广义线性模型,如果我们的神经网络用的都是sigmoid当激活函数就好比把很多逻辑回归拼凑一起,它反而不是线性的了。 我们知道输入层就是我们所有的features,输出层就是每个分类的概率,那么中间的隐含层做了什么呢? 现在我们只看隐含层其中一个node。我们一样有很多的input features,比如年龄身高体重是否结婚。然后我们把左右的input feature x和我们到下一层的权重weight相乘再sum,注意我们sum node上面还有个bias b,这个叫偏置,他的作用是用来拟合更多的情况,想想我们的逻辑回归是不是就是有一个偏置b来让函数可以不止是通过原点来拟合,这里也一样。我们用z来代表这个过程就是。因为是矩阵点乘所以w要transpose一下。接着我们有了z的值,就是要过一个激活函数(activation function)了。试想如果没有激活函数是不是就是线性回归?那就丧失了神经网络的巨大潜能。比如这里我们用sigmoid( σ)函数当作激活函数,通过激活函数我们得到a = σ(z),那么这个a就是我们的y,也就是预测结果。 所以在每个hidden node中,包含的都是两部分,先找到z,也就是上一层的输入乘以这一层的权重再加上偏置b。再把z通过激活函数去线性化,得到预测值y。多层的神经网络无非就是反复这个过程。 现在我们说一下每个参数的维度,这是一个在神经网络中一不小心就会犯的错误。下面是一个3层神经网络: input layer我们有3个node,第一层隐含层有4个node,第二层也一样,最后输出层有一个node输出。我们把每层中node个数记作n。用 “l” 来表示第几层,比如input是第0层,hidden layer 1是第1层依此类推。一个神经网络一共包含的参数有:权重w,偏置b,前一层输出a,和当前层输出σ(z)的z。所以每层神经网络做的事情就是计算。如果我们向量化的考虑大小,应该是这样的: 用文字表达:    dW,db,dZ,dA是反向传播时候的导数,只是求偏导,大小不变。 比如说我们的hidden layer 1,l = 1,那么w1维度是当前层的node个数*前一层的node个数也就是4*3; b1的维度是当前层个数*1也就是4*1;z和a一样都是4*feature的个数3也就是4*3。 Forward propagation 前向传播的过程就像冲动从接受信号往大脑皮层传播的过程。也就是从有了features的输入一直到有一个prediction y。基本过程就跟之前讲的一样。a就是前一层的输出,σ(z)就是这一层的输出,然后把σ(z)当作前一层输出a再传播给下一层。直到我们有了一个预测值y。这就是一整个前向传播过程。 Backward propagation 反向传播的过程就是从原路返回,我们已经有了一个y,那就从y开始求偏导数一直求到input。反向传播是学习神经网络的重点也是难点,所以我会介绍的尽可能详细。 讲反向传播之前我们先看一个简单的例子:             …

AdaBoost

宏观理解 AdaBoost是 “Adaptive Boosting”的缩写,它是集成学习中boosting方法的一种实现,目的就是把很多的弱学习器集合起来变成一个强大的学习器。AdaBoost主要任务是分类问题,当然也可以做回归但是一般不会选择AdaBoost。和之前见过的GBDT一样,他们都是迭代算法,但不同的是GBDT迭代的是残差residual,而AdaBoost迭代的是权重。所以一句话形容AdaBoost的训练就是更新每个模型的权重和数据点的权重的过程。 微观分析 既然迭代的是权重,就是说每轮过后模型的权重都会稍微变化。在AdaBoost中模型和数据点都具有权重。和GBDT一样是一个加法模型,公式如下: α是每个基模型的权重,h就是每个具有不同参数和权重的基模型。我们要做的就是训练出这m个基模型后把他们的结果按照权重相加起来就是最后的结果了。 对于模型的权重,那肯定是如果这个基模型的分类效果好,正确率高,那么属于它的权重就要高一些。就好比领导人的威望一样。但是数据点的更新则相反,那些越容易被分类错误的数据点的权重越高。就好比班里调皮的同学总是能得到班主任更多的关注一样。 所以整体AdaBoost的过程很简单: 初始化样本权重 = 1 / N 对每个基模型拟合数据并作出预测 更新模型的权重 更新数据点的权重 伪代码如下: 下面分步说一下伪代码的过程: 我们用Dk(i)来表示第i个样本在第k个基学习器学习后的权重 我们用αk来表示第k个基学习器的权重 初始化所有数据点的权重为1/N for loop对所有的基模型,也就是要提升的次数进行循环更新:  随机有放回的抽取样本,放到D中 用基学习器学习数据集D [标注0] 用该学习器作出预测,计算出该模型的weighted error [标注1] 使用计算出的weighted error对该学习器的权重进行更新[标注2] 对数据集D中的样本权重进行更新[标注3] [标注0] AdaBoost的基模型在paper中作者的建议是决策树,使用的损失函数是指数损失函数而不是交叉熵: [标注1] 我们用来计算weighted error的公式是: 分母为全部数据点的权重和,分子为所有被错判的数据点的权重和。 [标注2] 我们得到了weighted error后在中使用下方公式计算出学习器的更新权重: [标注3] 对模型的权重更新完后我们还要更新数据点的权重,使用的公式为:     备注:在AdaBoost中我们使用的标签为1/-1而不是0/1(新label = 2 * 原label – 1),原因就是在最后的数据点更新中,我们可以把y = 1/ -1综合到一个公式来表达。如果y …

GBDT

宏观理解 GBDT(Gradient Boost Decision Tree)中文叫梯度提升决策树,是一种集成学习中的boosting方法。boosting中除了GBDT还有比如Adaboost,目的在于在不使variance上升的情况下减少模型bias,所以在各大竞赛中都表现优异,在广告系统中也被广泛应用。缺点在于及其容易过拟合所以经常我们使用的时候需要加上正则化。 微观分析 我们知道boosting是由一些弱学习器串联而成,GBDT中用的弱学习器顾名思义就是决策树。我们还可以使用别的弱学习器比如逻辑回归,我们统称为GBM(Gradient Boost Machine)。在GBM中我们需要依靠每一个弱学习器,所以它也是一个加法模型,而不是bagging那样众投。我们把一个加法模型写作: 每一个小f代表一个弱学习器,最后相加形成一个boosting模型F(X)。 因为是串联而成,加法中后面的基模型要依赖于前面的基模型,所以我们无法一步完成计算,这时候我们需要前向分步算法来帮助我们。 我们假设有了前面 k个模型的结果,也就是从f1 + f2 + f3 + … + fk我们简写成Fk(X)的值,因为boosting模型是依靠下一个基模型来调整整个模型的损失,所以也就是说我们需要最小化损失函数。目前为止Fk是已知的,我们需要求解是多少的时候才能让loss最小化。 这个过程相同于梯度下降法,在梯度下降中如果我们有Loss(θ),下一轮迭代中我们希望Loss(θ + Δθ)变得比Loss(θ)更小求解Δθ。那么梯度下降法Δθ = – (∂L / ∂θ) 。在上面的公式中也可以同理,我们要让loss加上变小,那就和Δθ一样,我们只要求出: 那么如果想求出参数θk+1的值,也就是让每个xi都要近似于- (∂L / ∂Fk(xi))而不再是一开始的label y了。这就是GBM模型的精髓部分,在越往后的模型中我们要拟合的就不再是一开始的标签y而是residual残差。只要我们可以拟合的很好,那么整体的GBM模型的loss就是在下降的。总结一下所有的步骤就是: 初始化Y = f0(X)用来计算第一轮的loss 在k = 0,1,2,… , n的模型中我们计算出新的需要被拟合的y值 数据集变成了后拟合下一个基模型得到新的预测值y 以上步骤迭代最后输出最后的预测值F(X) 以上是GBM模型的训练过程,那么如果我们把每个fk基模型替换成决策树(一般用CART分类与回归树)就是GBDT模型了。 GBDT可以做分类也可以做回归,唯一的区别就是两种任务的loss function不同。对于分类任务我们用logloss也就是交叉熵,对于回归任务我们用MSE。那么我们可以把以上的GBM模型训练过程再细化一些来展示分类和回归问题中的训练过程。 对于回归问题: 初始化Y = f0(X)为y的均值或者0 在k = 0,1,2,… , n的模型中我们计算出新的需要被拟合的y值 数据集变成了后拟合下一个基模型得到新的预测值y …

Random Forest

宏观理解 随机森林是集成学习中bagging的一种。是把很多决策树放到一起进行预测,但是要clear的一点是随机森林的每个决策树都长得不一样,如果我们仅仅把不同的样本给到不同的决策树中训练,这只能叫bagging of decision tree。所以仅仅说随机森林就是很多的决策树是不严谨的。随机森林的目的是在保证不升高bias的情况下降低模型variance。 微观分析 我们说了如果仅仅是把样本有放回的分成好几份来用决策树训练,然后再预测,这只能叫做bagging of decision tree,用的是全部特征。 如果我们在把样本有放回的分成几份之后,还要在每个样本子集中随机抽取一次特征,那么这种方法叫做Fake Random Forest。 如果我们在把样本有放回的分成几份之后,还要在每个样本子集中抽取特征,但是在抽取特征时,我们不止抽取一次,而是在每次抽取的n个特征中选择一个最佳特征来构建决策树直到决策树的终止条件触发,这种方法叫Random Forest。 用一句话区分Fake Random Forest和Random Forest是Fake Random Forest每次是从已经采集的n个特征中挑选最佳特征,而Random Forest在每一次划分的时候都要重新采集n个特征然后在中间选取最佳特征。 我们可以用伪代码来理解一下这三者之间的区别: 对于bagging of decision tree 对于Fake Random Forest 对于Random Forest 注:关于特征选取的数量n,对于分类问题 n = floor(sqrt(total_features)); 对于回归问题 n = floor(total_features/ 3)

Ensemble Learning

宏观理解 集成学习是个大杀器,现在几乎所有竞赛的冠军题解都用到了集成学习,甚至到了深度学习中,集成学习也会提高我们几个百分点的准确率。所谓集成学习,就是三个臭皮匠顶一个诸葛亮。我们之前一直都是只训练一个模型,就好像你拿着你不会的选择题去问同学,人家告诉你选A你就写了A,结果老师看完说答案是B,你怪谁?你肯定心想如果当初多问几个人就好了。这就是集成学习的思想,我们为什么要单纯的相信一个模型的结果?我们可不可以同时来训练3个甚至3+个模型然后让他们投票表决这道题选啥,哪个选项支持率高我就选哪个。这个思想就是集成学习中的bagging(Boostrap aggregating),它是很多个模型排排坐每个人举手表决。再比如一个同学告诉你这道题选A,你带着人家的答案去问别人这道题是不是A?也许第二个同学说不对,这个应该是C,因为xxxx的原因不可能是A。然后你又去问第三个同学,这道题张三告诉我是A,赵四告诉我是B,你觉得呢?王五说你看啊他俩都没有考虑到xxxx情况所以应该是B。嗯好。我们离真相越来越近而且每次都有理有据的否定了之前的答案。这个思路在集成学习中叫做Boosting,它是一堆模型串成串,一个接着一个。通过这种思想,你犯错误的几率是不是逐步降低了? 微观分析 我们都知道机器学习中有两个冤家,有你没我那种。他们俩就是偏差bias和方差variance。在一个模型中,如果他的bias很小,那么他的variance一定很大。bias我们可以理解为在训练集上的错误率,variance可以理解为在测试集上的泛化能力。可想而知,如果这个模型在训练集上表现的特别好,overfitting的那种好,那么他的bias一定很低。但是我们都知道overfitting的话在测试集上一定不好,也就是这个模型的泛化能力很差,就是方差variance很大。反过来也一样。所以这俩冤家一直都是不是你死就是我活。 bagging 但是集成学习可以帮助我们尽量的去协调好这俩冤家,在bias不高的情况下,也不让variance升高。 这就是bootstrap的功劳,它是一种单个模型有放回采样思想,那么如果有多个模型在同一个数据集里有放回的采样,就是bagging了。 上图就是一个bagging流程,我们有同一个数据集training sample,然后我们有很多个bootstrap的模型,每一个模型都预测了一个值,最后我们进行投票表决。 因为我们之前说了,bootstrap可以在bias不高的情况下,也不让variance升高,那么bagging里面的子模型选择那些本来就可以使bias很低的模型最好,这样既保障了bias不高,bootstrap也保障了不让variance升高。比如决策树。所以我们最常听到的一个bagging模型就是随机森林(Random Forest)了 。 随机森林的大致过程如下: 随机抽取数据,也就是随机采样 随机从抽取的数据中抽取特征: 随机抽取出特征子集 选取最佳的划分特征,比如年龄。这就和决策树的过程一样了 利用年龄划分sub_data_1 。。。重复以上3步直到结束 在第2步抽取特征的时候,这个数量是我们可以自己设定的。通过公认的经验,总结而出对于分类问题采样特征个数 = floor(sqrt(特征总数));对于回归问题采样特征个数 = floor(特征总数/3)。 Boosting 我们讲的bagging模型可以在bias不高的情况下,也不让variance升高。那么对应的我们也有在variance不高的情况下,不让bias升高。这就是另一种集成方法叫做boosting。所以如果我们要用boosting,基模型最好选择那些bias很高,但是variance很低的模型。 我们熟知的一种boosting模型就是Adaboost。 在Adaboost中每个基模型具有权重,如果这么基模型的能力越好,那么权重就越大。同样的数据点也具有权重,但是相反,越分不清的点,权重越大。所以Adaboost的学习过程就是在不断更新训练集数据权重和基模型权重的过程。 总结adaboost的过程如下(图来自ScorpioLu): 值得提醒的是adaboost中的标签为-1 / 1。 最后通过随机森林和adaboost算法,我们可以总结一下两大集成学习的区别: Bagging Boosting 样本选择 有放回采样,每轮之间采样独立 每一轮不变,使用全部数据集 feature权重 均匀取样,权重相等 根据error rate更新权重 预测基模型 所有模型权重相等 独立权重,根据分类误差更新权重 并行计算 可以并行 不可以并行 Bias / Variance 减少variance,泛化强 减少bias,拟合强

K-means

宏观理解 K-means是一个聚类算法,属于非监督学习。当你有一堆数据点,但是没有label,就可以试试k-means来分类。效果就像下面这张图。 这就涉及到一些疑问,比如你让我做聚类,就给我一堆点,我哪知道一共要聚几类呢?上面的图肉眼能看出来大致有3类,那如果我们数据点是下图左边这样呢?你说3类也行,2类也很像,4类也不是不可以。   微观分析 聚类算法大致分为两类: Partition-based clustering – 比如我们要讨论的k-means Hierarchical clustering – 指的是用一个等级树(hierarchical tree)把一个object分成嵌套的类别,或者系统树图(dendrogram)。比如下图这样。 我们这里只讨论最常用的Partition-based clustering。 在基于划分的聚类中每一个类可以用两种方法来表示: centroid – 指的是在这个聚类中的所有点的平均值(数值) medoid – 指的是在这个聚类中最能代表这个簇的点(某一个点) k-means是通过第一种,质心(centroid)不断的调整而最终分化结束的模型。这个质心也就是我们要分的k类的中心点,也可以叫重心 假设我们有一些数据要分成3份,那么也就是我们需要三个质心。幸运的是我们可以随机找3个点来当作质心,有一些论文讨论过随机选取质心会影响后面的聚类结果但是暂且先不考虑,我们最后会再翻过来看怎么选择质心更好。 好。首先我们现在随机的选择3个质心。接着,我们可以求出来其余所有点对于这三个质心的距离,我们把数据点和他离得最近的质心划为一簇,这样经过这一步,所有的点现在都应该有了一个簇。 接下来我们怎么评估目前为止的聚类好坏程度呢。通过一个叫SSE的objective function。 其中,x是在簇Ci里面的一个点,ci是这个Ci簇的mean,也就是质心。这里的dist我们可以用Euclidean distance,当然也可以换成别的。 现在我们所有的点都有了一个簇,每个簇还都有了一个质心,那么现在我们该尝试去更新这个质心了。通过加和同一个簇里的点,然后取一个mean来得到属于这个簇新的质心。然后再把所有数据点和他离得最近的质心划为一类。重复这个过程。算法很简单,下面是伪代码: 下面我们来看一个图例,从第一轮随机选择3个质心划分直到质心不再变化的过程: 可是因为是随机的选取,所以这个聚类结果并不唯一,比如我们再次随机一遍质心就可能变成这样: 这很不好,及其影响结果。那么通常我们可以尝试下面的方法来更好的初始化质心: 多次随机,找最好的SSE的聚类 从全部的数据点计算整个数据集的质心,然后依次找离已经选取的质心最远的点。(这种方法需要注意不要选到离群点) 二分k均值法(Bisecting K-means),首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。 那么除了初始化质心这个问题,我们还会面临一个问题是在不给定几个簇的情况下,怎么给定k的值呢? 通常我们是循环所有的k取值范围,然后用SSE来评价,最终选取最好的那个,比如下图中当k = 10的时候基本SSE就收敛了,不会再有大的变化,所以我们就可以把k设置为10 。 总结一下,k-means的好处是简单易实现,而且时间复杂度不高。 缺点是不能使用在nominal的数据上(可以用k-medoids);对于离群点和噪声比较敏感,万一把离群点选取为质心就更糟糕了;对于选取k值和初始化的质心很麻烦;并且对于一些奇葩形状的数据集效果很差,比如下图。      

Naive Bayes

宏观理解 朴素贝叶斯模型是一个概率模型,是一个生成模型(Generative Model),背后的数学理论来自于贝叶斯理论。简单来说它计算的就是已知X的情况下,Y的概率是多少,所以一般预测一个值都会计算两个数值概率,分别是已知X的情况下,Y = 1的概率和已知X的情况下,Y = 0的概率。然后我们看哪个概率更高就预测为哪个。 微观分析 学习这个模型第一件事就是贴贝叶斯公式: 认识一下,在这个公式里有几个组成部分: P(B|A):在事件A下事件B发生的条件概率,叫做后验概率(posterior prob) P(A|B):在事件B下事件A发生的条件概率,叫做似然函数(Likelihood function) P(A),P(B):独立事件A和独立事件B的边缘概率,叫做先验概率(prior prob) 了解完贝叶斯公式,再看一下贝叶斯准则: 在这里我们要求A, C是相互独立的事件。举个例子,如果我们有一句电影的评价,我么想预测它是积极的还是消极的评价,那么我们就有了下面的计算: P(“This is a great movie”|negative) = P(“This”|negative) * P(“is”|negative) * P(“a”|negative) * P(“great”|negative) * P(“movie”|negative) P(“This is a great movie”|positive) = P(“This”|positive) * P(“is”|positive) * P(“a”|positive) * P(“great”|positive) * P(“movie”|positive) 这里面要求每个单词都是相互独立的。 在工程里面,可能概率会越来越小,而且乘法计算消耗时间,那么我们就可以把每个概率取对数: log(P(“This is a great …

K-Nearest Neighbors

宏观理解 k-近邻算法其实特别容易理解,一个图就能看懂: 图中我们有两个类别,一个是蓝色的一个是红色的,现在我们要预测绿色的数据点属于哪个类别。很多人看了一眼就会说,红色啊它跟旁边红色靠的那么近。恭喜你你已经理解了1-近邻算法了。什么叫1-近邻,就是按离他最近的那个点,是哪个label的就预测为相同的值。那么如果我让你找3-近邻呢?也就是图中实线以内的数据点。这时候有3个点,一个蓝色两个红色,那绿色应该归为哪类?当然是红色,人多力量大,一个蓝色干不过红色。那么如果我们扩大到虚线以内的点呢?三个蓝色两个红色,这时候红色又吃亏了,所以绿色会被蓝色抢过去。这就是k-近邻算法。其中k是我们一个超参数,它至关重要,决定着绿色点的命运。 微观分析 我们大概知道k-近邻算法在做什么了,现在想一个问题:如果我们没有一个图供可视化,我们怎么找离绿色点最近的k个数据点呢?我们有3种方法: 1.欧几里得距离(Euclidean distance) 就是空间内两个点的绝对距离 2. 曼哈顿距离(Manhattan Distance) 纽约市的道路是横平竖直的,一个个街区都是小长方形,所以名字由此而来 3. 余弦相似性(Cosine similarity) 计算两个向量夹角,广泛应用于计算文本的相似性 我们知道了所有点对于绿色点的距离就可以找出前k大的点了,进而就可以看谁的数量多就归于哪个类别。 所以整个k-近邻的算法过程就是: 初始化数据处理 – 储存所有数据点的内容 用一个for loop来寻找最佳的k值,一般不超过20 计算距离 进行预测 检查是否与真实值一样并统计正确率 评估正确率 找出是哪个k值有最好的正确率 进行预测 相当简单对吗? 所以k-近邻的有点就是特别简单易于实现,而且不需要事先训练模型。 当然它的缺点也正是因为它是懒惰算法,而且需要大量内存空间去存储所有的数据点。也因为这个,算法整个复杂度很高,毕竟每预测一个点就要需要所有的数据点。  

Principal Component Analysis

宏观理解 PCA(主成分分析)是一个降维算法。因为很多数据集大维度很大,比如说下图7个数据点每个数据点有30个特征,这种维度的数据先不说里面混杂着很多无关特征,如果直接拿来train,他会使模型变的很复杂,如果想改善我们要增加很多训练样本,训练时间也就相应增加许多。那么pca可以帮助我们在仅有的7个样本中,把每个样本的维度从30缩小到2(当然这个图降到2有点过分了,但是很极端的说明了作用。。),这样7*2的训练集就很漂亮。在降维的过程中pca一个很关键的原则就是,你给我2维的特征里面的信息量必须和30维的特征里面的信息量尽量一致。 微观分析 PCA的降维原理就是把原先的n个特征用数量更少的m个特征取代,这m个新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。 最大化样本方差和特征互不相关如果用数学表示出来就是用方差variance和协方差cov的计算公式:     这里就不详细说什么是方差和协方差了。 假设我们有左边的数据集带有两个特征,其中长的45度斜线为主要线性分量,短的45度斜线为次要线性分量。如果我们把右图想像成一个坐标轴,横轴为特征u1竖轴为特征u2 。那么所有的x样数据点都可以线性的表示出来,比如数据点X = aU1 + bU2。 因为我们要减小特征数量,u2的信息量远小于u1,所以我们删掉u2以保证保留下来的信息越大越好。 如果我们要最大化样本方差,就是要最大化(我们已经把u2删掉了): 我们把上面的式子写成方差的计算公式即: 接下来我们推导出来最大化方差的公式: 其中是我们把特征矩阵点乘,假设我们把第一个X的数值叫做a,把第二个X的转置的数值叫做b,那么我就有了如下的矩阵: 其中a1,1和b1,1都是相等的依此类推。所以在最后的矩阵中,我们管它叫协方差矩阵,对角线上都是两个相同的值相乘。想象不出来的同学给你们举个例子: 所以我们要做的就是找到一个u1矩阵的值,使得协方差矩阵中对角线(方差)最大化,除了对角线的其余值(协方差)最小化也就是全部为0 。 为了我们要达到的目的PCA做的基本步骤如下,假设我们有数据集 X: 首先计算X中每一行Xi的平均值Xi_mean 我们用Xi整体减去平均值Xi_mean得到新的矩阵X_new 我们计算出新的矩阵X_new的协方差 计算特征值(eigen-value)和特征向量(eigen-vector) 把特征值排序,选取最大的前k个(k = 降到多少维) 将选出来的k个特征值组成另一个对角线矩阵W ∈ n*k 计算出X_new * W即为我们降维后的特征矩阵 我们带一个例子把上述过程走一遍(实例来自hustqb):        

Support Vector Machine

宏观理解 我们已经讨论过逻辑回归了,它是个二分类器,在画逻辑回归的决策边界的时候,通常不只有一条线可以分割两个分类。就像这样: 通过这个图我们也能明显看出来,如果让我们自己手画这条边界,我们不会画的这么怪异,比如及其贴近某一阵营远离另一阵营。可是这正是逻辑回归可能给我们的结果,显然科学家们对这个结果并不买账。试想一下如果让你来亲手画一条决策边界,大概应该是这样的才比较舒服: 这条线大概处于两个阵营的中间,不偏不倚,对于强迫症来说这就是最美丽的东西。那么支持向量机(也叫大间距分类器)正是强迫症们的福音。它可以帮助我们画出这样一条线,所以用术语来形容svm的motivation叫:maximize the minimum margin。有了这条线,是不是就增强了鲁棒性,对于更多的数据拟合的更好了? 微观分析 这篇文章是按照业界大牛Andrew Ng在coursera上的思路讲解的。因为看了很多网上的文章,感觉数学理论过多不利于初学者理解,所以这里写的稍微入门了些。 现在我们来好好认识一下svm的决策边界: 其中绿色的实线就是我们梦寐以求的决策边界,它到两个阵营的距离称之为margin,所以这条线也就是最大化来这个margin。其中蓝色实心的圆圈和红色实心的正方形叫做支持向量(support vector)。那么怎么来找这条线呢?很简单,既然这条线是从逻辑回归众多的怪异分界里面选出来的,那么把逻辑回归的损失函数稍加修改就变成来svm的损失函数。我们已知逻辑回归的损失函数是这样的: 我们把loghθ(x)替换成svm的hypothesis就变成了: (题外话:这个cost function肯定有很多人会问什么是cost()?Andrew这样讲只是让我们更容易理解,其实svm常用的损失函数是hinge loss或者square hinge loss。想深究的同学可以另外google这个loss这里不做扩展。) 在可视化上,LR和SVM的损失函数可以表现为这样: 我们已知对于LR来说, 如果预测y = 1的话,那么我们要尽量让hθ(x) ≈ 1,也就是 » 0. 如果预测y = 0的话,那么我们要尽量让hθ(x) ≈ 0,也就是 « 0. 由上图可见,我们在SVM中, 如果预测y = 1的话,那么我们要尽量让hθ(x) ≈ 1,也就是 » 1. 如果预测y = 0的话,那么我们要尽量让hθ(x) ≈ 0,也就是 « -1. 所以我们可以写出SVM的hypothesis为: 总结一下,现在我们了解了SVM的损失函数和hypothesis对应预测值的关系,汇总一下有了这张图: 最上面是cost function,这个跟我们之前给出的多了一个正则项,按惯例,我们把正则项前面的λ超参数放到了前面的C。这样C = 1/λ。如果C变大,那么说明正则越少。关于正则项的介绍有专门一篇文章这里不做赘述。下面是两个cost function的可视化,左边对应的y = …