原理
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
问题的假设
任何的模型都是有自己的假设,在这个假设下模型才是适用的。逻辑回归的第一个基本假设是假设数据服从伯努利分布。
伯努利分布:是一个离散型概率分布,若成功,则随机变量取值1;若失败,随机变量取值为0。成功概率记为p,失败为q = 1-p。
在逻辑回归中,既然假设了数据分布服从伯努利分布,那就存在一个成功和失败,对应二分类问题就是正类和负类,那么就应该有一个样本为正类的概率p,和样本为负类的概率q = 1- p。具体我们写成这样的形式:
逻辑回归的第二个假设是正类的概率由sigmoid的函数计算,即:
即:
写在一起:
其中, y ^ \hat{y} y^ 是个概率,还没有到它真正能成为预测标签的地步,更具体的过程应该是分别求出正类的概率,即y = 1时,和负类的概率,y = 0时,比较哪个大,因为两个加起来是1,所以我们通常默认的是只用求正类概率,只要大于0.5即可归为正类,但这个0.5是人为规定的,如果愿意的话,可以规定为大于0.6才是正类,这样的话就算求出来正类概率是0.55,那也不能预测为正类,应该预测为负类。
参考文章
Logistic 回归主要用于分类问题,我们以二分类为例,对于所给数据集假设存在这样的一条直线可以将数据完成线性可分。
决策边界可以表示为 w 1 x 1 + w 2 x 2 + b = 1 w_1x_1+w_2x_2+b=1 w1x1+w2x2+b=1 ,假设某个样本点 h w ( x ) = w 1 x 1 + w 2 x 2 + b > 1 h_w(x)=w_1x_1+w_2x_2+b>1 hw(x)=w1x1+w2x2+b>1,那么可以判断它的类别为 1,这个过程其实是感知机。
Logistic 回归还需要加一层,它要找到分类概率 P(Y=1) 与输入向量 x 的直接关系,然后通过比较概率值来判断类别。
考虑二分类问题,给定数据集
考虑到 w T x + b w^Tx+b wTx+b 取值是连续的,因此它不能拟合离散变量。可以考虑用它来拟合条件概率 p ( Y = 1 ∣ x ) p(Y=1|x) p(Y=1∣x) ,因为概率的取值也是连续的。
但是对于 w ≠ 0 w\ne0 w=0 (若等于零向量则没有什么求解的价值), w T x + b w^Tx+b wTx+b 取值为 R R R ,不符合概率取值为 0 到 1,因此考虑采用广义线性模型。
最理想的是单位阶跃函数:
但是这个阶跃函数不可微,对数几率函数是一个常用的替代函数:
于是有:
我们将 y 视为 x 为正例的概率,则 1-y 为 x 为其反例的概率。两者的比值称为几率(odds),指该事件发生与不发生的概率比值,若事件发生的概率为 p。则对数几率:
将 y 视为类后验概率估计,重写公式有:
也就是说,输出 Y=1 的对数几率是由输入 x 的线性函数表示的模型,这就是逻辑回归模型。所以,可以将逻辑回归看做预测值为“标签的对数几率”的线性回归模型。当 w T x + b w^Tx+b wTx+b 的值越接近正无穷, p ( Y = 1 ∣ x ) p(Y=1|x) p(Y=1∣x) 概率值也就越接近 1。因此逻辑回归的思路是,先拟合决策边界(不局限于线性,还可以是多项式),再建立这个边界与分类的概率联系,从而得到了二分类情况下的概率。
在这我们思考个问题,我们使用对数几率的意义在哪?通过上述推导我们可以看到 Logistic 回归实际上是使用线性回归模型的预测值逼近分类任务真实标记的对数几率,其优点有:
参考文章
逻辑回归模型的数学形式确定后,剩下就是如何去求解模型中的参数。在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大。
设:
似然函数:
为了更方便求解,我们对等式两边同取对数,写成对数似然函数:
在机器学习中我们有损失函数的概念,其衡量的是模型预测错误的程度。如果取整个数据集上的平均对数似然损失,我们可以得到:
即在逻辑回归模型中,我们最大化似然函数和最小化损失函数实际上是等价的。最终,得出逻辑回归的损失函数:
参考文章
求解逻辑回归的方法有非常多,我们这里主要聊下梯度下降和牛顿法。优化的主要目标是找到一个方向,参数朝这个方向移动之后使得损失函数的值能够减小,这个方向往往由一阶偏导或者二阶偏导各种组合求得。
梯度下降是通过 J(w) 对 w 的一阶导数来找下降方向,并且以迭代的方式来更新参数,更新方式为 :
其中 k 为迭代次数。每次更新参数后,可以通过比较 ∣ ∣ J ( w k + 1 ) − J ( w k ) ∣ ∣ ||J(w^{k+1})-J(w^k)|| ∣∣J(wk+1)−J(wk)∣∣ 小于阈值或者到达最大迭代次数来停止迭代。
求导过程参考:
牛顿法
牛顿法的基本思路是,在现有极小点估计值的附近对 f(x) 做二阶泰勒展开,进而找到极小点的下一个估计值。假设 为当前的极小值估计值,那么有:
然后令 φ ′ ( w ) = 0 \varphi^{'}(w)=0 φ′(w)=0,得到了 w k + 1 = w k − J ′ ( w k ) J ′ ′ ( w k ) w^{k+1}=w^{k}-\frac{J^{'}(w^k)}{J^{''}(w^k)} wk+1=wk−J′′(wk)J′(wk) 。因此有迭代更新式:
其中 H k − 1 H_k^{-1} Hk−1 为海森矩阵:
此外,这个方法需要目标函数是二阶连续可微的,本文中的 J(w) 是符合要求的。
参考文章
交叉熵损失和平方损失
对于二分类问题,交叉熵损失函数的定义形式如下:
平方损失定义:
在逻辑回归中,最常用的代价函数是交叉熵(Cross Entropy),交叉熵是用来衡量两个概率分布之间的差异。交叉熵越大,两个分步之间的差异越大,对实验结果感到意外,反之,交叉熵越小,两个分布越相似,越符合预期。
交叉熵损失对预测错误的样本更为敏感
使用损失函数的时候,我们都会想要让这个误差尽可能的小,对于这个逻辑回归损失函数来说,同样的我们希望误差尽可能的小,为了更好的理解交叉熵损失函数是如何起作用的,现在举两个例子:
当 y = 1 y=1 y=1 时,损失函数 L = − y l o g ( y ^ ) L=-ylog(\hat{y}) L=−ylog(y^) ,如果想要损失函数 L L L 尽量小,那么 y ^ \hat{y} y^ 就要尽可能的大,因为sigmoid函数取值[0,1],所以希望预测的 y ^ \hat{y} y^ 无限接近于1 ,这个时候损失为0,当预测错误使得 y ^ \hat{y} y^ 远离1时,远离程度越大,损失越大,尤其是 y ^ \hat{y} y^ 为0时,损失无限大,而均方误差在这个时候的损失值为(1-0)=1
反之,当 y = 0 y=0 y=0 时,损失函数 L = − l o g ( 1 − y ^ ) L=-log(1-\hat{y}) L=−log(1−y^) ,如果想要损失函数 L L L 尽量小,那么 y ^ \hat{y} y^ 就要尽可能的小,因为sigmoid函数取值[0,1],所以希望预测的 y ^ \hat{y} y^ 无限接近于0 ,这个时候损失为0,当预测错误使得 y ^ \hat{y} y^ 远离0时,远离程度越大,损失越大,尤其是 y ^ \hat{y} y^ 为1时,损失无限大,而均方误差在这个时候的损失值也仅为(1-0)=1
为了衡量算法在全部训练样本上的表现,我们需要定义所有样本的代价函数,算法的代价函数是对单个样本代价函数求平均:
交叉熵损失可以避免梯度消失
逻辑回归是在线性回归的基础上加了非线性激活函数sigmoid函数,在反向传播用梯度下降的方式求解的时候,若采用平方误差,导致参数的导数带了sigmoid函数,而sigmoid在值很大或者很小的两端会出现梯度消失的情况;而若采用交叉熵损失函数,参数的导数跟sigmoid函数无关,这样在参数更新的时候更容易求到最优解。
下面展示推导过程:
假设 y ^ = σ ( z ) \hat{y}=\sigma(z) y^=σ(z),其中 z = w x + b z=wx+b z=wx+b,在考虑单条样本下,若采用平方误差作为损失函数,在使用梯度下降方法更新 w w w 和 b b b 时,损失函数分别对他们求导的结果是:
在学习率为 λ \lambda λ 下更新 w w w 和 b b b 时:
因为sigmoid函数的特性(如下图),当 z z z 过大或者过小的时候,函数呈平坦趋势,导致 σ ′ ( z ) \sigma^{'}(z) σ′(z) 很小甚至为0,也就出现梯度消失的情况,也造成 w w w 和 b b b 的更新非常缓慢,使得平方损失函数难以求得最优解的概率加大。
若采用交叉熵损失函数,情况就好很多,对应参数的导数如下:
其中, σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma^{'}(x)=\sigma(x)(1-\sigma(x)) σ′(x)=σ(x)(1−σ(x))
上述等式转变为:
同理:
在 λ \lambda λ 的学习率下更新 w w w 和 b b b 时:
可以看到,参数更新只受 ( y ^ − y ) (\hat{y}-y) (y^−y) 影响,而这相当于是预测误差,当误差大的时候,权重更新快,当误差小的时候,权重更新慢,这一特性更适合损失函数能更快求到最优解。
损失函数的凸性(使用MSE可能会陷入局部最优)
对于一个非凸函数,模型有可能陷入局部最优而无法再继续优化:
以 MSE 为损失函数的逻辑斯蒂回归就是一个非凸函数,如何证明这一点呢,要证明一个函数的凸性,只要证明其二阶导恒大于等于0即可,如果不是恒大于等于0,则为非凸函数。
其它解释,KL散度与交叉熵的关系
可以证明,交叉熵其实等于 KL 散度加上信息熵。具体证明过程十分简单,可参考面试题解答6:逻辑斯蒂回归为什么使用交叉熵而不是MSE。最小化交叉熵,实际上就是在最小化 KL 散度,也就是在让预测概率分布尽可能地与真实概率分布相似。另外,由于信息熵是一个常数(可以根据样本数据估计出来),并且在计算的时候,交叉熵相较于 KL 散度更容易,所以我们直接使用了交叉熵作为损失函数。
参考文章
交叉熵损失函数是关于参数 w w w的连续可导的凸函数。因此,除梯度下降法之外,还可以用高阶优化方法(比如牛顿法)求解。
参考文章
连续特征是否可以直接输入到逻辑回归
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型:
为什么LR把特征离散化后效果更好?离散化的好处有哪些?
优势有以下几点:
李沐曾经说过:模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。
参考文章
LR可以用核解决非线性分类问题:
区别是:SVM如果不用核函数,也得像逻辑回归一样,在映射后的高维空间显示的定义非线性映射函数Φ,而引入了核函数之后,可以在低维空间做完点积计算后,映射到高维。
综上,逻辑回归本质上是线性回归模型,关于系数是线性函数,分离平面无论是线性还是非线性的,逻辑回归其实都可以进行分类。对于非线性的,需要自己去定义一个非线性映射。
具体可参考【机器学习面试总结】—— LR(逻辑回归)这篇文章的解析。
参考文章
以下描述来自苏神在知乎上的解答:
最大似然估计下没有。当然,如果是非最大似然估计,那么是可能推导出解析解的,你也可以理解为是最大似然估计下的近似解:
闭式解,即解析解。线性回归可以求闭式解,逻辑回归通常采取迭代的梯度下降法求解。
我们知道,线性回归是比较简单的问题,它存在解析解,而它的变体逻辑回归(Logistic Regression)却没有解析解,这不能不说是一个遗憾。因为逻辑回归虽然也叫“回归”,但它实际上是用于分类问题的,而对于很多读者来说分类比回归更加常见。准确来说,我们说逻辑回归没有解析解,说的是“最大似然估计下逻辑回归没有解析解”。那么,这是否意味着,如果我们不用最大似然估计,是否能找到一个可用的解析解呢?
具体推导可参考苏神写的概率视角下的线性模型:逻辑回归有解析解吗?这篇文章。文章将会从非最大似然的角度,推导逻辑回归的一个解析解,简单的实验表明它效果不逊色于梯度下降求出来的最大似然解。此外,这个解析解还易于推广到单层Softmax多分类模型。
参考文章
以上回答参考知乎
参考文章
逻辑回归是在线性回归的基础上加了一个 Sigmoid 函数(非线形)映射,使得逻辑回归称为了一个优秀的分类算法。本质上来说,两者都属于广义线性模型,但他们两个要解决的问题不一样,逻辑回归解决的是分类问题,输出的是离散值,线性回归解决的是回归问题,输出的连续值。
我们需要明确 Sigmoid 函数到底起了什么作用:
参考文章
优点
缺点
参考文章
从分类平面,到求两类间的最大间隔,到转化为求间隔分之一,等优化问题,然后就是优化问题的解决办法,首先是用拉格拉日乘子把约束优化转化为无约束优化,对各个变量求导令其为零,得到的式子带入拉格朗日式子从而转化为对偶问题, 最后再利用SMO(序列最小优化)来解决这个对偶问题。
参考文章
SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:
二维空间点 ( x , y ) (x,y) (x,y) 到直线 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0 的距离公式是:
扩展到 n 维空间后,点 x = ( x 1 , x 2 , . . . , x n ) x=(x_1,x_2,...,x_n) x=(x1,x2,...,xn) 到直线 w T x + b = 0 w^Tx+b=0 wTx+b=0 的距离为:
其中 ∣ ∣ w ∣ ∣ = w 1 2 + . . . + w n 2 ||w||=\sqrt{w_1^2+...+w_n^2} ∣∣w∣∣=w12+...+wn2。
如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d,其他点到超平面的距离大于 d。
于是我们有这样的一个公式:
稍作转化可以得到:
∣ ∣ w ∣ ∣ d ||w||d ∣∣w∣∣d 是正数,我们暂且令它为 1(之所以令它等于 1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),故:
将两个方程合并,我们可以简写为:
至此我们就可以得到最大间隔超平面的上下两个超平面:
每个支持向量到超平面的距离可以写为:
由上述 y ( w T x + b ) > = 1 > 0 y(w^Tx+b)>=1>0 y(wTx+b)>=1>0 可以得到 y ( w T x + b ) = ∣ w T x + b ∣ y(w^Tx+b)=|w^Tx+b| y(wTx+b)=∣wTx+b∣,所以我们得到:
其中,d即是几何间隔,分子为函数间隔,我们最大化这个距离d:
这里乘上 2 倍也是为了后面推导,对目标函数没有影响。刚刚我们得到支持向量 ,所以我们得到:
再做一个转换:
为了方便计算(去除 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ 的根号),我们有:
最终得到SVM的最优化问题,即SVM的基本型(原始问题):
数据集中,所有满足 y i ∗ ( w T x i + b ) = 1 y_i*(w^Tx_i+b)=1 yi∗(wTxi+b)=1的样本点,都称为支持向量。在决定最佳超平面时只有支持向量起作用,而其他数据点并不起作用,这块证明可参考看了这篇文章你还不懂SVM你就来打我这篇文章的2.4小节最后。如果移动非支持向量,甚至删除非支持向量都不会对最优超平面产生任何影响。也即支持向量对模型起着决定性的作用,这也是“支持向量机”名称的由来。
参考文章
原始问题表达式:
可以应用拉格朗日乘子法构造拉格朗日函数(Lagrange function)再通过求解其对偶问题(dual problem)得到原始问题的最优解。
转换为对偶问题来求解的原因是:
首先构建拉格朗日函数。为此需要引进拉格朗日乘子(Lagrange multiplier) α i ≥ 0 , i = 1 , 2 , . . . , n \alpha_i\ge0,i=1,2,...,n αi≥0,i=1,2,...,n。
则拉格朗日函数为:
因此,给定一个 W W W 和 b b b, 若不满足式 ( 2.2.4 ) (2.2.4) (2.2.4) 的约束条件,那么有
否则,若满足式 ( 2.2.4 ) (2.2.4) (2.2.4) 的约束条件,有
结合式 ( 2.4.2 ) (2.4.2) (2.4.2) 和 ( 2.4.3 ) (2.4.3) (2.4.3) 知,优化问题
与式 ( 2.2.4 ) (2.2.4) (2.2.4) 所述问题是完全等价的。
根据拉格朗日对偶性,式 ( 2.4.4 ) (2.4.4) (2.4.4) 所述问题即原始问题的对偶问题是:
以上具体推导细节可参见书籍《统计学习方法》或者知乎文章拉格朗日对偶性。
为了求得对偶问题的解,需要先求得 L ( W , b , α ) L(W,b,\alpha) L(W,b,α) 对 W W W 和 b b b 的极小再求对 α \alpha α 的极大。
(1) 求 m i n W , b L ( W , b , α ) \underset {W,b}{min}L(W,b,\alpha) W,bminL(W,b,α) 对拉格朗日函数求导并令导数为0,有:
将上面两式代入:
所以,
(2) 求 m i n W , b L ( W , b , α ) \underset {W,b}{min}L(W,b,\alpha) W,bminL(W,b,α) 对 α \alpha α 的极大:
等价于式 ( 2.4.8 ) (2.4.8) (2.4.8) 对 α \alpha α 求极大,也等价于式 ( 2.4.8 ) (2.4.8) (2.4.8) 取负数后对 α \alpha α 求极小,即
同时满足约束条件:
至此,我们得到了原始最优化问题 ( 2.2.4 ) (2.2.4) (2.2.4) 和对偶最优化问题 ( 2.4.9 ) (2.4.9) (2.4.9) 、 ( 2.4.10 ) (2.4.10) (2.4.10)。
参考文章
线性不可分时可以引入核函数
核函数的作用:
核函数只是用来计算映射到高维空间之后的内积的一种简便方法。
参考文章
因为原问题是凸二次规划问题,转换为对偶问题更加高效。为什么求解对偶问题更加高效?因为只用求解alpha系数,而alpha系数只有支持向量才非0,其他全部为0. alpha系数有多少个?样本点的个数
参考文章
在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:
一般用线性核和高斯核,也就是Linear核与RBF核
需要注意的是需要对数据归一化处理,很多使用者忘了这个小细节
然后一般情况下RBF效果是不会差于Linear,但是时间上RBF会耗费更多
下面是吴恩达的见解:
工作中,最常用的是Linear核与RBF核。
参考文章
优点
缺点
因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。
参考文章
相同点:
不同点:
SVM更关心的是靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优,因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。因此支持向量机和和逻辑斯蒂回归的不同点,一个是考虑局部(不关心已经确定远离的点,更考虑靠近中间分割线的点),一个是考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)
LR采用log损失,SVM采用合页(hinge)损失。
这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重,两者的根本目的都是一样的。
LR对异常值敏感,SVM对异常值不敏感(抗噪能力,SVM要强)。支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用,虽然作用会相对小一些)。LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。
支持向量机改变非支持向量样本并不会引起决策面的变化:
逻辑回归中改变任何样本都会引起决策面的变化:
LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。
计算复杂度不同。对于海量数据,SVM的效率较低,LR效率比较高。
LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。
对非线性问题的处理方式不同,LR主要靠特征构造,必须组合交叉特征,特征离散化。SVM也可以这样,还可以通过kernel。
svm 更多的属于非参数模型,而logistic regression 是参数模型,本质不同。其区别就可以参考参数模型和非参模型的区别
怎么根据特征数量和样本量来选择SVM和LR模型呢:
参考文章
LR和XGBoost均对不平衡样本敏感,SVM对不平衡样本不太敏感。
LR很难处理不平衡样本:LR易受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
SVM对异常值不敏感(抗噪能力,SVM要强):支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用,虽然作用会相对小一些)。LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。
XGBoost如何处理不平衡数据,可以通过调节参数来约束
对于不平衡的数据集,例如用户的购买行为,肯定是极其不平衡的,这对XGBoost的训练有很大的影响,XGBoost有两种自带的方法来解决:
第一种,如果你在意AUC,采用AUC来评估模型的性能,那你可以通过设置scale_pos_weight来平衡正样本和负样本的权重。例如,当正负样本比例为1:10时,scale_pos_weight可以取10;
第二种,如果你在意概率(预测得分的合理性),你不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)。
原话是这么说的:
For common cases such as ads clickthrough log, the dataset is extremely imbalanced. This can affect the training of xgboost model,
and there are two ways to improve it.
If you care only about the ranking order (AUC) of your prediction
Balance the positive and negative weights, via scale_pos_weight
Use AUC for evaluation
If you care about predicting the right probability
In such a case, you cannot re-balance the dataset
In such a case, set parameter max_delta_step to a finite number (say 1) will help convergence
那么,源码到底是怎么利用scale_pos_weight来平衡样本的呢,是调节权重还是过采样呢?请看源码:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
可以看出,应该是增大了少数样本的权重。
除此之外,还可以通过上采样、下采样、SMOTE算法或者自定义代价函数的方式解决正负样本不平衡的问题。
参考文章
贝叶斯定理
朴素贝叶斯分类算法的核心是贝叶斯公式:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
该公式表示在B事件发生的条件下A事件发生的条件概率,等于A事件发生条件下B事件发生的条件概率乘以A事件的概率,再除以B事件发生的概率。公式中,P(A)也叫做先验概率,P(A|B)叫做后验概率。
朴素贝叶斯-极大似然估计推导
理论上,概率模型分类器是一个条件概率模型:
独立变量C有若干类别,条件依赖于若干特征变量,但问题在于如果特征数量n的维度较大或者每个特征能取大量值时,基于概率模型列出概率表变得不现实。所以我们修改这个模型使之变得可行。 根据贝叶斯公式有以下式子:
或者,这样表达比较简洁明了:
其中, p ( C ) p(C) p(C)为先验概率, p ( C ∣ F 1 , . . . , F n ) p(C|F_1,...,F_n) p(C∣F1,...,Fn)为后验概率;可以这么理解,在不知道需要预测的样本任何特征的时候,先判断该样本为某个类别的概率为 p ( C ) p(C) p(C),在知道样本的特征之后,乘上 p ( F 1 , . . . , F n ∣ C ) p ( F 1 , . . . , F n ) \frac{p(F_1,...,F_n|C)}{p(F_1,...,F_n)} p(F1,...,Fn)p(F1,...,Fn∣C)之后,得到该样本在知道 F 1 = f 1 , . . . , F n = f n F_1=f_1,...,F_n=f_n F1=f1,...,Fn=fn之后,样本属于这个类别的条件概率。
这个乘上去的因子可能是起到促进的作用(当该因子大于1),也可能起到抑制的作用(当该因子小于1)。这个比较容易理解,比如没有任何信息的时候,可以判断一个官为贪官的概率为0.5,再知道该官员财产大于一千万后,则根据常理判断该官员为贪官的概率为0.8。
实际中,我们只关心分式中的分子部分 p ( C ) ∗ p ( F 1 , . . . , F n ∣ C ) p(C)*p(F_1,...,F_n|C) p(C)∗p(F1,...,Fn∣C) ,因为分母不依赖于C,而且特征的值也是给定的,于是分母可以认为是一个常数。这样分子就等价于联合分布模型 p ( C , F 1 , . . . , F n ) p(C,F_1,...,F_n) p(C,F1,...,Fn)。
现在,“朴素”的条件独立假设开始发挥作用了:假设每个特征,对于其他特征,是独立的,即特征之间相互独立,就有:
这里还要再解释一下为什么要假设特征之间相互独立。
我们这么想,假如没有这个假设,在数据量很大的情况下,那么我们对右边这些概率的估计其实是不可做的。这么说,假设一个分类器有4个特征,每个特征有10个特征值,则这四个特征的联合概率分布是4维的,可能的情况就有 1 0 4 = 10000 10^4=10000 104=10000 种。
这也是为什么需要假设特征之间独立的原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
有了特征相互独立的条件以后,对于,联合分布模型可表达为:
这就意味着,变量C的条件分布可以表达为:
其中,Z只依赖 F 1 , . . . , F n F_1,...,F_n F1,...,Fn ,当特征变量已知时Z是个常数。
至此,我们我们可以从概率模型中构造分类器,朴素贝叶斯分类器包括了这种模型和相应的决策规则。一个普通的规则就是选出最有可能的那个:这就是大家熟知的最大后验概率(MAP)决策准则。
相应的分类器便是如下定义的公式(确定实例x的类别):
朴素贝叶斯的应用举例,参考一文详解朴素贝叶斯(Naive Bayes)原理这篇文章。
补充:用极大似然估计可能会出现所要估计的概率值为0的情况,比如某个属性值在训练集中没有与某个类同时出现过。这时会影响到后验概率的计算结果,使分类产生偏差。解决这一问题的方法时采用贝叶斯估计。为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时做拉普拉斯平滑来修正。
参考文章
1. 概述
与分类、序列标注等任务不同,聚类是在事先并不知道任何样本标签的情况下,通过数据之间的内在关系把样本划分为若干类别,使得同类别样本之间的相似度高,不同类别之间的样本相似度低(即增大类内聚,减少类间距)。通过聚类分析,可以发现数据的分布模式以及样本特征间的相互关系。
聚类属于非监督学习,K均值聚类是最基础常用的聚类算法。它的基本思想是,通过迭代寻找K个簇(Cluster)的一种划分方案,使得聚类结果对应的损失函数最小。其中,损失函数可以定义为各个样本距离所属簇中心点的误差平方和:
其中, x i x_i xi 代表第 i i i 个样本, c i c_i ci 是 x i x_i xi 所属的簇, u c i u_{c_i} uci 代表簇对应的中心点, M M M 是样本总数。
2. KMeans算法的具体步骤
KMeans的核心目标是将给定的数据集划分成K个簇(K是超参),并给出每个样本数据对应的中心点。具体步骤非常简单,可以分为4步:
KMeans最核心的部分就是先固定中心点 u k u_k uk,调整每个样本 x i x_i xi 所属的类别 c i c_i ci 来减少 J J J;然后,再固定每个样本的类别 c i c_i ci,调整中心点 u k u_k uk 继续减小 J J J。两个过程交替循环, J J J 单调递减直到最(极)小值,中心点 u k u_k uk 和样本划分的类别 c i c_i ci 同时收敛。
大白话解释:
1.3 复杂度分析
先看下伪代码:
获取数据 n 个 m 维的数据
随机生成 K 个 m 维的点
while(t)
for(int i=0;i < n;i++)
for(int j=0;j < k;j++)
计算点 i 到类 j 的距离
for(int i=0;i < k;i++)
1. 找出所有属于自己这一类的所有数据点
2. 把自己的坐标修改为这些数据点的中心点坐标
end
时间复杂度: t k n m tknm tknm,其中,t 为迭代次数,k 为簇的数目,n 为样本点数,m 为样本点维度。
空间复杂度: O ( m ( n + k ) ) O(m(n+k)) O(m(n+k)),其中,k 为簇的数目,m 为样本点维度,n 为样本点数。
1.4 优缺点
优点
缺点
从EM算法角度解释KMeans参考KMeans聚类算法详解这篇文章。
参考文章
针对 K-means 算法的缺点,我们可以有很多种调优方式:如数据预处理(去除异常点),合理选择 K 值,高维映射等。以下将简单介绍:
1. 数据预处理
K-means 的本质是基于欧式距离的数据划分算法,均值和方差大的维度将对数据的聚类产生决定性影响。所以未做归一化处理和统一单位的数据是无法直接参与运算和比较的。常见的数据预处理方式有:数据归一化,数据标准化。
此外,离群点或者噪声数据会对均值产生较大的影响,导致中心偏移,因此我们还需要对数据进行异常点检测。
2. 合理选择 K 值
K 值的选取对 K-means 影响很大,这也是 K-means 最大的缺点,常见的选取 K 值的方法有:手肘法、Gap statistic 方法。
手肘法:
当 K < 3 时,曲线急速下降;当 K > 3 时,曲线趋于平稳,通过手肘法我们认为拐点 3 为 K 的最佳值。
手肘法的缺点在于需要人工看不够自动化,所以我们又有了 Gap statistic 方法,这个方法出自斯坦福大学的几个学者的论文:Estimating the number of clusters in a data set via the gap statistic
其中 D k D_k Dk 为损失函数,这里 E ( l o g D k ) E(log D_k) E(logDk) 指的是 l o g D k log D_k logDk 的期望。这个数值通常通过蒙特卡洛模拟产生,我们在样本里所在的区域中按照均匀分布随机产生和原始样本数一样多的随机样本,并对这个随机样本做 K-Means,从而得到一个 D k D_k Dk。如此往复多次,通常 20 次,我们可以得到 20 个 l o g D k log D_k logDk。对这 20 个数值求平均值,就得到了 E l o g D k E_log D_k ElogDk 的近似值。最终可以计算 Gap Statisitc。而 Gap statistic 取得最大值所对应的 K 就是最佳的 K。
由图可见,当 K=3 时,Gap(K) 取值最大,所以最佳的簇数是 K=3。
Github 上一个项目叫 gap_statistic,可以更方便的获取建议的类簇个数。
3. 采用核函数
基于欧式距离的 K-means 假设了了各个数据簇的数据具有一样的的先验概率并呈现球形分布,但这种分布在实际生活中并不常见。面对非凸的数据分布形状时我们可以引入核函数来优化,这时算法又称为核 K-means 算法,是核聚类方法的一种。核聚类方法的主要思想是通过一个非线性映射,将输入空间中的数据点映射到高位的特征空间中,并在新的特征空间中进行聚类。非线性映射增加了数据点线性可分的概率,从而在经典的聚类算法失效的情况下,通过引入核函数可以达到更为准确的聚类结果。
4. K-means++
我们知道初始值的选取对结果的影响很大,对初始值选择的改进是很重要的一部分。在所有的改进算法中,K-means++ 最有名。
K-means++ 算法步骤如下所示:
简单的来说,就是 K-means++ 就是选择离已选中心点最远的点。这也比较符合常理,聚类中心当然是互相离得越远越好。
但是这个算法的缺点在于,难以并行化。所以 k-means II 改变取样策略,并非按照 k-means++ 那样每次遍历只取样一个样本,而是每次遍历取样 k 个,重复该取样过程 l o g ( n ) log(n) log(n) 次,则得到 k l o g ( n ) k log(n) klog(n) 个样本点组成的集合,然后从这些点中选取 k 个。当然一般也不需要 l o g ( n ) log(n) log(n) 次取样,5 次即可。
5. ISODATA
ISODATA 的全称是迭代自组织数据分析法。它解决了 K 的值需要预先人为的确定这一缺点。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出 K 的大小。ISODATA 就是针对这个问题进行了改进,它的思想也很直观:当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。
参考文章
先来看一下 K-means 算法的步骤:先随机选择初始节点,然后计算每个样本所属类别,然后通过类别再跟新初始化节点。这个过程有没有想到之前介绍的 EM 算法。
我们需要知道的是 K-means 聚类的迭代算法实际上是 EM 算法。EM 算法解决的是在概率模型中含有无法观测的隐含变量情况下的参数估计问题。在 K-means 中的隐变量是每个类别所属类别。K-means 算法迭代步骤中的 每次确认中心点以后重新进行标记
对应 EM 算法中的 E 步 求当前参数条件下的 Expectation
。而 根据标记重新求中心点
对应 EM 算法中的 M 步 求似然函数最大化时(损失函数最小时)对应的参数
。
首先我们看一下损失函数的形式:
其中:
为了求极值,我们令损失函数求偏导数且等于 0:
k 是指第 k 个中心点,于是我们有:
可以看出,新的中心点就是所有该类的质心。
EM 算法的缺点就是,容易陷入局部极小值,这也是 K-means 有时会得到局部最优解的原因。
参考文章
PCA旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。
最大投影方差角度解释PCA原理、目标函数和求解方法
问题引入
对于给定的一组数据点 { v 1 , v 2 , . . . , v m } \text{\textbraceleft}v_1,v_2,...,v_m\text{\textbraceright} {v1,v2,...,vm},其中所有向量均为列向量,中心化后的表示为 { v 1 − u , v 2 − u , . . . , v m − u } \text{\textbraceleft}v_1-u,v_2-u,...,v_m-u\text{\textbraceright} {v1−u,v2−u,...,vm−u} ,其中 u = 1 m ∑ i = 1 m v i u=\frac{1}{m}\sum_{i=1}^{m}v_i u=m1∑i=1mvi。我们知道,向量内积在几何上表示为第一个向量投影到第二个向量上的长度,因此向量 x i x_i xi 在 w w w (单位方向向量)上的投影坐标可以表示为 { x i , w } = x i T w \text{\textbraceleft}x_i,w\text{\textbraceright}=x_i^Tw {xi,w}=xiTw。
所以,我们的目标就是:找到一个投影方向 w w w,使得 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn 在 w w w 上的投影方差尽可能大。注意, w w w 和 x i x_i xi 均为列向量(本该粗体显示的,偷懒了~)。易知,中心化投影后均值为 0 0 0:
1 m ∑ i = 1 m x i T w = 1 m ( v 1 − u v 2 − u . . . v m − u ) w = 0 \begin{aligned} \frac{1}{m}\sum_{i=1}^{m}x_i^Tw=\frac{1}{m}\left( \begin{array}{cccc} v_1-u \\ v_2-u \\ ... \\ v_m-u \end{array} \right)w=0 \end{aligned} m1i=1∑mxiTw=m1⎝⎜⎜⎛v1−uv2−u...vm−u⎠⎟⎟⎞w=0
这也是我们进行中心化的意义。
推导PCA目标函数并求解
样本点 x i x_i xi 在基 w w w 下的坐标为: ( x i , w ) = x i T w (x_i, w)=x_i^Tw (xi,w)=xiTw ,于是我们有方差:
D ( x ) = 1 m ∑ i = 1 m ( x i T w ) 2 = 1 m ∑ i = 1 m ( w T x i x i T w ) = w T ( 1 m ∑ i = 1 m x i x i T ) w \begin{aligned} D(x)&=\frac{1}{m}\sum_{i=1}^m(x_i^Tw)^2 \\ &=\frac{1}{m}\sum_{i=1}^m(w^Tx_ix_i^Tw) \\ &=w^T(\frac{1}{m}\sum_{i=1}^{m}x_ix_i^T)w \end{aligned} D(x)=m1i=1∑m(xiTw)2=m1i=1∑m(wTxixiTw)=wT(m1i=1∑mxixiT)w
我们看到 1 m ∑ i = 1 m x i x i T \frac{1}{m}\sum_{i=1}^{m}x_ix_i^T m1∑i=1mxixiT 就是样本的协方差矩阵,将其写作 Σ \Sigma Σ 。另外,由于 w w w是单位方向向量,即有 w T w = 1 w^Tw=\pmb{1} wTw=111。因此,我们要求解一个最大化问题,可表示为:
{ m a x { w T Σ w } s . t . w T w = 1 \begin{cases} max\text{\textbraceleft}w^T\Sigma{w}{\text{\textbraceright}} \\ s.t. w^Tw=1 \end{cases} {max{wTΣw}s.t.wTw=1
然后,引入拉格朗日乘子构造拉格朗日函数:
L ( w ) = w T Σ w + λ ( 1 − w T w ) L(w)=w^T\Sigma{w}+\lambda(1-w^Tw) L(w)=wTΣw+λ(1−wTw)
对 w w w 求导令其等于 0 \pmb{0} 000 推出:
Σ w = λ w \Sigma{w}=\lambda{w} Σw=λw
此时我们的方差为:
D ( x ) = w T Σ w = λ w T w = λ D(x)=w^T\Sigma{w}=\lambda{w^T}w=\lambda D(x)=wTΣw=λwTw=λ
于是我们发现, x x x 投影后的方差就是协方差矩阵的特征值。我们要找到最大的方差也就是协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应的特征向量,次佳就是第二大特征值对应的特征向量,以此类推。
PCA求解步骤小结
设有 m m m 条 n n n 维数据。
参考文章
SVD原理
SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:
A = U Σ V T A=U\Sigma{V^T} A=UΣVT
其中, U U U 是一个 m × m m\times{m} m×m的矩阵, Σ \Sigma Σ是一个 m × n m\times{n} m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V V V 是一个 n × n n\times{n} n×n 的矩阵。U和V都是酉矩阵,即满足 U T U = I , V T V = I U^T{U}=I,V^T{V}=I UTU=I,VTV=I。图可以很形象的看出上面SVD的定义:
那么我们如何求出SVD分解后的U,Σ,V这三个矩阵呢?具体推导参考奇异值分解(SVD)原理与在降维中的应用这篇文章(不难)。
SVD怎么降维,降维体现在哪里
以下参考知乎回答:
对于PCA来说,红色的这个环节起到了降维的作用:
这里面的降维代表着:原来X有p个变量,哎我这么一搞得到了一个新的数据矩阵Z,并且变量数变成了k
变量数变少了。
但是对于SVD来说是这样的:
这个截断奇异值这部分,确实能够减少储存空间,保存重要信息,等等。但是这些是用来储存的!如果我想把数据喂给linear_regression,还原回去之后,还是有p个变量。
既然变量数没有变少,为什么能称之为降维?
SVD的降维不体现在这个“相乘还原”的操作,图2的流程是为了储存时节省空间。所以我们知道,SVD用于图像压缩和重构,这只是为了压缩数据量,降低存储或传输的压力。图片矩阵的维度跟原来一样,没有达到降维目的。
如果想达到PCA一样的降维效果首先进行图2中的矩阵分解,得到了U,V,Σ,其中这个V是 p × p p\times{p} p×p 维的。选k个最大的奇异值对应的V的k个列,得到 V k V_k Vk,是一个 p × k p\times{k} p×k 维的。最后X右乘 V k V_k Vk 就得到了 n × k n\times{k} n×k 维的低维数据。
X ′ = X V k T X^{'}=XV_k^T X′=XVkT
参考文章
假设有两枚硬币,但是两个硬币的材质不同导致其出现正反面的概率不一样。目前我们只有一组观测数据,要求出每一种硬币投掷时正面向上的概率。总共投了五轮,每轮投掷五次。
1)现在先考虑一种简单的情况,假设我们知道这每一轮用的是哪一个硬币去投掷的:
那么我们拿着这样的一组数据,就可以很轻松的估计出A硬币和B硬币出现正面的概率,如下:
PA = ( 3 + 1 + 2 ) / 15 = 0.4;PB = ( 2 + 3 ) / 10 = 0.5。
2)现在把问题变得复杂一点,假设我们不知道每一次投掷用的是哪一种硬币,等于是现在的问题加上了一个隐变量,就是每一次选取的硬币的种类(A or B)。
那么现在可以想一想,假设我们把每一次硬币的种类设为z,则这五次实验生成了一个5维的向量(z1,z2,z3,z4,z5)。
那么这个时候EM算法的作用就体现出来了! EM算法的基本思想是:先初始化一个PA,PB(就是上文的θ;这里PA就是指的硬币A正面朝上的概率),然后我们拿着这个初始化的PA,PB用最大似然概率估计出z,接下来有了z之后,就用z去计算出在当前z的情况下的PA,PB是多少,然后不断地重复这两个步骤直到收敛。
有了这个思想之后现在用这个思想来做一下这个例子,假设初始状态下PA=0.2, PB=0.8,然后我们根据这个概率去估计出z:
标粗体的是按最大似然估计,最有可能的硬币种类(抛硬币服从伯努利分布)。按照最大似然估计,z=(B,A,A,B,A),有了z之后我们反过来重新估计一下PA,PB:
PA = (2+1+2)/15 = 0.33;PB =(3+3)/10 = 0.6。
可以看到PA,PB的值已经更新了,假设PA,PB的真实值0.4和0.5,那么你在不断地重复这两步你就会发现PA,PB在不断地靠近这两个真实值。
EM算法在GMM、K-means中有应用。
参考文章