机器学习基础-经典算法

  • 逻辑回归
    • 逻辑回归的原理,问题的假设
    • 为什么逻辑回归也可称为对数几率回归
    • 推导逻辑回归损失函数
    • 逻辑回归损失函数求导
    • 逻辑回归为什么使用交叉熵作为损失函数
    • LR是不是凸优化问题,如何判断LR达到最优值
    • 逻辑回归一般用什么数据,一般有什么特点
    • 逻辑回归能否用来做非线性分类
    • 逻辑回归可以求闭式解吗
    • 逻辑回归如何避免过拟合
    • 逻辑回归和线性回归的区别
    • 逻辑回归的优缺点
  • 支持向量机
    • 介绍下SVM求解过程
    • SVM公式推导(原始问题)-线性可分SVM
    • SVM公式推导(对偶问题)-线性可分SVM
    • SVM为什么要用核函数
    • SVM为什么要把原问题转换为对偶问题
    • SVM常见的核函数及区别
    • SVM的优缺点
    • 逻辑回归与SVM的区别
    • LR、SVM和XGBoost哪个对不平衡样本不太敏感
  • 贝叶斯
    • 介绍下朴素贝叶斯
  • 聚类
    • 介绍下Kmeans
    • KMeans算法调优与改进
    • KMeans算法的收敛性证明
  • 降维
    • 介绍下PCA
    • 介绍下SVD
  • EM算法
    • 介绍下EM算法

逻辑回归

逻辑回归的原理,问题的假设

原理

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。

问题的假设

任何的模型都是有自己的假设,在这个假设下模型才是适用的。逻辑回归的第一个基本假设是假设数据服从伯努利分布

伯努利分布:是一个离散型概率分布,若成功,则随机变量取值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 w1​x1​+w2​x2​+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)=w1​x1​+w2​x2​+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 散度更容易,所以我们直接使用了交叉熵作为损失函数。

参考文章

  • 面试题解答6:逻辑斯蒂回归为什么使用交叉熵而不是MSE
  • 逻辑回归为什么用交叉熵作为损失函数?
  • 为什么逻辑回归的损失函数叫做交叉熵呢?

LR是不是凸优化问题,如何判断LR达到最优值

交叉熵损失函数是关于参数 w w w的连续可导的凸函数。因此,除梯度下降法之外,还可以用高阶优化方法(比如牛顿法)求解。

参考文章

  • Logistic Regression是凸优化问题吗?

逻辑回归一般用什么数据,一般有什么特点

连续特征是否可以直接输入到逻辑回归

在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型:

为什么LR把特征离散化后效果更好?离散化的好处有哪些?

优势有以下几点:

  • 1.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  • 2.离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  • 3.特征离散化以后,简化了逻辑回归模型,降低了模型过拟合的风险。
  • 4.离散特征的增加和减少都很容易,易于模型的快速迭代
  • 5.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  • 6.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  • 7.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

李沐曾经说过:模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。

参考文章

  • 【机器学习面试总结】—— LR(逻辑回归)
  • 逻辑斯特回归为什么要对特征进行离散化?
  • 连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果?
  • 推荐系统算法FM、FFM使用时,连续性特征,是直接作为输入,还是经过离散化后one-hot处理呢?
  • 为什么要将连续特征离散化处理?
  • 推荐系统常见面试问题(38~48)
  • 广义线性模型(Generalized Linear Model)
  • 线性回归、logistic回归、广义线性模型——斯坦福CS229机器学习个人总结(一)

逻辑回归能否用来做非线性分类

LR可以用核解决非线性分类问题:

  • 利用特殊核函数,对特征进行变换:把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。
  • 扩展LR算法,提出FM算法。


区别是:SVM如果不用核函数,也得像逻辑回归一样,在映射后的高维空间显示的定义非线性映射函数Φ,而引入了核函数之后,可以在低维空间做完点积计算后,映射到高维。

综上,逻辑回归本质上是线性回归模型,关于系数是线性函数,分离平面无论是线性还是非线性的,逻辑回归其实都可以进行分类。对于非线性的,需要自己去定义一个非线性映射。

具体可参考【机器学习面试总结】—— LR(逻辑回归)这篇文章的解析。

参考文章

  • 逻辑回归你说说能否用来做非线性分类?
  • 逻辑斯蒂回归能否解决非线性分类问题?

逻辑回归可以求闭式解吗

以下描述来自苏神在知乎上的解答:

最大似然估计下没有。当然,如果是非最大似然估计,那么是可能推导出解析解的,你也可以理解为是最大似然估计下的近似解:

闭式解,即解析解。线性回归可以求闭式解,逻辑回归通常采取迭代的梯度下降法求解。

我们知道,线性回归是比较简单的问题,它存在解析解,而它的变体逻辑回归(Logistic Regression)却没有解析解,这不能不说是一个遗憾。因为逻辑回归虽然也叫“回归”,但它实际上是用于分类问题的,而对于很多读者来说分类比回归更加常见。准确来说,我们说逻辑回归没有解析解,说的是“最大似然估计下逻辑回归没有解析解”。那么,这是否意味着,如果我们不用最大似然估计,是否能找到一个可用的解析解呢?

具体推导可参考苏神写的概率视角下的线性模型:逻辑回归有解析解吗?这篇文章。文章将会从非最大似然的角度,推导逻辑回归的一个解析解,简单的实验表明它效果不逊色于梯度下降求出来的最大似然解。此外,这个解析解还易于推广到单层Softmax多分类模型。

参考文章

  • Logistic回归能有解析解吗?
  • 概率视角下的线性模型:逻辑回归有解析解吗?
  • 机器学习实战:基于Scikit-Learn和TensorFlow—第四章笔记
  • 凸优化问题是否一定有闭式解?
  • 为什么逻辑回归(logistic regression) 的推算的权重w 不会无限上升?

逻辑回归如何避免过拟合

  1. 增加样本量,这是万能的方法,适用任何模型。
  2. 如果数据稀疏,使用L1正则,其他情况,用L2要好,可自己尝试。
  3. 通过特征选择,剔除一些不重要的特征,从而降低模型复杂度。
  4. 如果还过拟合,那就看看是否使用了过度复杂的特征构造工程,比如,某两个特征相乘/除/加等方式构造的特征,不要这样做了,保持原特征
  5. 检查业务逻辑,判断特征有效性,是否在用结果预测结果等。
  6. (补充)最总要的,逻辑回归特有的防止过拟合方法:进行离散化处理,所有特征都离散化。

以上回答参考知乎

参考文章

  • 逻辑回归有什么特有的防止过拟合的方式?
  • 【机器学习面试总结】—— LR(逻辑回归)
  • 逻辑回归的常见面试点总结
  • 逻辑回归常见面试点总结!!!
  • 【机器学习】逻辑回归(非常详细)
  • 关于逻辑回归的常见问题

逻辑回归和线性回归的区别

逻辑回归是在线性回归的基础上加了一个 Sigmoid 函数(非线形)映射,使得逻辑回归称为了一个优秀的分类算法。本质上来说,两者都属于广义线性模型,但他们两个要解决的问题不一样,逻辑回归解决的是分类问题,输出的是离散值,线性回归解决的是回归问题,输出的连续值。

我们需要明确 Sigmoid 函数到底起了什么作用:

  • 线性回归是在实数域范围内进行预测,而分类范围则需要在 [0,1],逻辑回归减少了预测范围;
  • 线性回归在实数域上敏感度一致,而逻辑回归在 0 附近敏感,在远离 0 点位置不敏感,这个的好处就是模型更加关注分类边界,可以增加模型的鲁棒性。

参考文章

  • 【机器学习】逻辑回归(非常详细)

逻辑回归的优缺点

优点

  • 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
  • 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
  • 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
  • 资源占用小,尤其是内存。因为只需要存储各个维度的特征值。
  • 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cut off,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

缺点

  • 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
  • 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
  • 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
  • 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。

参考文章

  • 逻辑回归常见面试点总结!!!

支持向量机

介绍下SVM求解过程

从分类平面,到求两类间的最大间隔,到转化为求间隔分之一,等优化问题,然后就是优化问题的解决办法,首先是用拉格拉日乘子把约束优化转化为无约束优化,对各个变量求导令其为零,得到的式子带入拉格朗日式子从而转化为对偶问题, 最后再利用SMO(序列最小优化)来解决这个对偶问题。

参考文章

  • 【机器学习面试总结】—— SVM

SVM公式推导(原始问题)-线性可分SVM

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小节最后。如果移动非支持向量,甚至删除非支持向量都不会对最优超平面产生任何影响。也即支持向量对模型起着决定性的作用,这也是“支持向量机”名称的由来。

参考文章

  • 【机器学习】支持向量机 SVM(非常详细)
  • 看了这篇文章你还不懂SVM你就来打我
  • 【机器学习面试总结】—— SVM
  • 面试总结——SVM

SVM公式推导(对偶问题)-线性可分SVM

原始问题表达式:

可以应用拉格朗日乘子法构造拉格朗日函数(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,bmin​L(W,b,α) 对拉格朗日函数求导并令导数为0,有:


将上面两式代入:

所以,

(2) 求 m i n W , b L ( W , b , α ) \underset {W,b}{min}L(W,b,\alpha) W,bmin​L(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)。

参考文章

  • 看了这篇文章你还不懂SVM你就来打我
  • 浅谈最优化问题的KKT条件

SVM为什么要用核函数

线性不可分时可以引入核函数

核函数的作用:

  • 1、当我们在解决线性不可分的问题时,我们需要通过一个映射函数,把样本值映射到更高维的空间或者无穷维,这个映射可以把低维空间中线性不可分的两类点变成线性可分的。在特征空间中,我们对线性可分的新样本使用前面提到过的求解线性可分的情况下的分类问题的方法时,需要计算样本内积,但是因为样本维数很高,容易造成“维数灾难”,所以这里我们就引入了核函数,把高维向量的内积转变成了求低维向量的内积问题。
  • 2、内积的作用,内积也是可以衡量相似度的!分类问题就是一个找相似样本的过程,你跟我相似,你就属于我这个类,所以在求出的目标函数中会出现内积,可以用这个原理来理解。内积是可以衡量两个向量的相似度的,例如,我们常常可以通过两个相量的距离和夹角来表示相似度,这些属性都可以通过两个向量的内积值来获得。

核函数只是用来计算映射到高维空间之后的内积的一种简便方法。

参考文章

  • 【机器学习面试总结】—— SVM
  • 机器学习有很多关于核函数的说法,核函数的定义和作用是什么?

SVM为什么要把原问题转换为对偶问题

因为原问题是凸二次规划问题,转换为对偶问题更加高效。为什么求解对偶问题更加高效?因为只用求解alpha系数,而alpha系数只有支持向量才非0,其他全部为0. alpha系数有多少个?样本点的个数

  • 对偶问题将原始问题中的约束转为了对偶问题中的等式约束
  • 方便核函数的引入
  • 改变了问题的复杂度。由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。
  • 求解更高效,因为只用求解比例系数a,而比例系数a只有支持向量才为非0,其他全为0.

参考文章

  • 面试总结——SVM

SVM常见的核函数及区别

在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:

一般用线性核和高斯核,也就是Linear核与RBF核
需要注意的是需要对数据归一化处理,很多使用者忘了这个小细节
然后一般情况下RBF效果是不会差于Linear,但是时间上RBF会耗费更多

下面是吴恩达的见解:

  • 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
  • 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
  • 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况

工作中,最常用的是Linear核与RBF核。

  • Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
  • RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。我个人的体会是:使用libsvm,默认参数,RBF核比Linear核效果稍差。通过进行大量参数的尝试,一般能找到比linear核更好的效果。

参考文章

  • 【机器学习面试总结】—— SVM

SVM的优缺点

优点

  • 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;
  • 能找出对任务至关重要的关键样本(即:支持向量);
  • 采用核技巧之后,可以处理非线性分类/回归任务;
  • 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

缺点

  • 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为 O ( N 2 ) O(N^2) O(N2),其中 N 为训练样本的数量;
  • 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 O ( N 2 ) O(N^2) O(N2) ;
  • 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

参考文章

  • 【机器学习】支持向量机 SVM(非常详细)

逻辑回归与SVM的区别

相同点:

  • LR和SVM都是分类算法
  • LR和SVM都是监督学习算法。
  • LR和SVM都是判别模型。
  • 如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。说明:LR也是可以用核函数的.但LR通常不采用核函数的方法.(计算量太大)

不同点:

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模型呢:

  • 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
  • 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
  • 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况。(LR和不带核函数的SVM比较类似。)

参考文章

  • 面试总结——SVM
  • Linear SVM 和 LR 有什么异同?
  • 【机器学习面试总结】—— SVM

LR、SVM和XGBoost哪个对不平衡样本不太敏感

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 predictionBalance the positive and negative weights, via scale_pos_weightUse AUC for evaluationIf you care about predicting the right probabilityIn such a case, you cannot re-balance the datasetIn 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算法或者自定义代价函数的方式解决正负样本不平衡的问题。

参考文章

  • 如何对机器学习xgboost中数据集不平衡进行处理?
  • 珍藏版 | 20道XGBoost面试题
  • xgboost-样本类别不平衡

贝叶斯

介绍下朴素贝叶斯

贝叶斯定理

朴素贝叶斯分类算法的核心是贝叶斯公式:
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的情况,比如某个属性值在训练集中没有与某个类同时出现过。这时会影响到后验概率的计算结果,使分类产生偏差。解决这一问题的方法时采用贝叶斯估计。为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时做拉普拉斯平滑来修正。

参考文章

  • 贝叶斯分类(通过通俗的例子轻松理解朴素贝叶斯与半朴素贝叶斯)
  • 一文详解朴素贝叶斯(Naive Bayes)原理
  • 【机器学习-西瓜书】七、朴素贝叶斯分类器
  • 教你明白啥是朴素贝叶斯分类器
  • 各种机器学习算法的应用场景分别是什么

聚类

介绍下Kmeans

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步:

  • 步骤1:数据预处理。主要是标准化、异常点过滤。
  • 步骤2:随机选取K个中心,记为 u 1 ( 0 ) , u 2 ( 0 ) , . . . , u k ( 0 ) u_1^{(0)},u_2^{(0)},...,u_k^{(0)} u1(0)​,u2(0)​,...,uk(0)​
  • 步骤3:定义损失函数: J ( c , u ) = m i n ∑ i = 1 M ∣ ∣ x i − u c i ∣ ∣ 2 J(c,u)=min\sum_{i=1}^{M}||x_i-u_{c_i}||^2 J(c,u)=min∑i=1M​∣∣xi​−uci​​∣∣2
  • 步骤4:令t=0,1,2,… 为迭代步数,重复如下过程直到 J J J 收敛:
    • 对于每一个样本 x i x_i xi​ ,将其分配到距离最近的簇 c i ( t ) ← a r g m i n k ∣ ∣ x i − u k t ∣ ∣ 2 c_i^{(t)}\gets{\underset{k}{argmin}{||x_i-u_k^{t}||^2}} ci(t)​←kargmin​∣∣xi​−ukt​∣∣2
    • 对于每一个类中心k,重新计算该类簇的中心 u k ( t + 1 ) ← a r g m i n u ∑ i : c i ( t ) = k ∣ ∣ x i − u ∣ ∣ 2 u_k^{(t+1)}\gets{\underset{u}{argmin}\sum_{i:{c_i^{(t)}}=k}}||x_i-u||^2 uk(t+1)​←uargmin​∑i:ci(t)​=k​∣∣xi​−u∣∣2

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:选择初始化的 k 个样本作为初始聚类中心 a = a 1 , a 2 , . . . , a k a=a_1,a_2,...,a_k a=a1​,a2​,...,ak​;
  • 步骤2:分配阶段:针对数据集中每个样本 x i x_i xi​ 计算它到 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中;
  • 步骤3:更新阶段:针对每个类别 a j a_j aj​,重新计算它的聚类中心 a j = 1 ∣ c i ∣ ∑ x ∈ c i x a_j=\frac{1}{|c_i|} \sum_{x \in c_i} x aj​=∣ci​∣1​∑x∈ci​​x (即属于该类的所有样本的质心);
    -步骤4:重复上面 2 3 两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)。

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 优缺点

优点

  • 容易理解,聚类效果不错,虽然是局部最优, 但往往局部最优就够了;
  • 处理大数据集的时候,该算法可以保证较好的伸缩性;
  • 当簇近似高斯分布的时候,效果非常不错
  • 算法复杂度低。

缺点

  • K 值需要人为设定,不同 K 值得到的结果不一样(不稳定);
  • 对初始的簇中心敏感,不同选取方式会得到不同结果(不稳定);
  • 对异常值(离群点)敏感
  • 样本只能归为一类,不适合多分类任务
  • 不适合太离散的分类样本类别不平衡的分类(即簇分布方差比较大,比如一类是另一类样本数量的100倍)、非凸形状的分类

从EM算法角度解释KMeans参考KMeans聚类算法详解这篇文章。

参考文章

  • KMeans聚类算法详解
  • 【机器学习】K-means(非常详细)
  • Kmeans++聚类算法原理与实现
  • 如何正确使用「K均值聚类」?
  • 机器学习面试问题总结
  • 个人面试问答题知识库(一)百面机器学习篇

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 El​ogDk​ ​的近似值。最终可以计算 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++ 算法步骤如下所示:

  1. 随机选取一个中心点 a 1 a_1 a1​;
  2. 计算数据到之前 n 个聚类中心最远的距离 D ( x ) D(x) D(x),并以一定概率 D ( x ) 2 ∑ D ( x ) 2 \frac{D(x)^2}{\sum D(x)^2} ∑D(x)2D(x)2​ 选择新中心点 a i a_i ai​;
  3. 重复第二步。

简单的来说,就是 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(非常详细)

KMeans算法的收敛性证明

先来看一下 K-means 算法的步骤:先随机选择初始节点,然后计算每个样本所属类别,然后通过类别再跟新初始化节点。这个过程有没有想到之前介绍的 EM 算法。

我们需要知道的是 K-means 聚类的迭代算法实际上是 EM 算法。EM 算法解决的是在概率模型中含有无法观测的隐含变量情况下的参数估计问题。在 K-means 中的隐变量是每个类别所属类别。K-means 算法迭代步骤中的 每次确认中心点以后重新进行标记 对应 EM 算法中的 E 步 求当前参数条件下的 Expectation 。而 根据标记重新求中心点 对应 EM 算法中的 M 步 求似然函数最大化时(损失函数最小时)对应的参数

首先我们看一下损失函数的形式:

其中:

为了求极值,我们令损失函数求偏导数且等于 0:

k 是指第 k 个中心点,于是我们有:

可以看出,新的中心点就是所有该类的质心。

EM 算法缺点就是,容易陷入局部极小值,这也是 K-means 有时会得到局部最优解的原因。

参考文章

  • 【机器学习】K-means(非常详细)
  • k-means聚类算法的收敛性证明与应用

降维

介绍下PCA

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=1m​vi​。我们知道,向量内积在几何上表示为第一个向量投影到第二个向量上的长度,因此向量 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}=xiT​w。

所以,我们的目标就是:找到一个投影方向 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} m1​i=1∑m​xiT​w=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)=xiT​w ,于是我们有方差:
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)​=m1​i=1∑m​(xiT​w)2=m1​i=1∑m​(wTxi​xiT​w)=wT(m1​i=1∑m​xi​xiT​)w​

我们看到 1 m ∑ i = 1 m x i x i T \frac{1}{m}\sum_{i=1}^{m}x_ix_i^T m1​∑i=1m​xi​xiT​ 就是样本的协方差矩阵,将其写作 Σ \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 维数据。

  • 将原始数据按列组成 n n n 行 m m m 列矩阵 X X X;
  • 将 X X X 的每一行进行零均值化,即减去这一行的均值;
  • 求出协方差矩阵 C = 1 m X X T C=\frac{1}{m}XX^T C=m1​XXT;
  • 求出协方差矩阵的特征值及对应的特征向量;
  • 将特征向量按对应特征值从大到小按行排列成矩阵,取前 k 行组成矩阵 P;
  • Y = P X Y=PX Y=PX 即为降维到 k k k 维后的数据。

参考文章

  • 百面机器学习
  • 【机器学习】降维——PCA(非常详细)

介绍下SVD

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<p个,变量数变少了

但是对于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​

参考文章

  • 奇异值分解(SVD)原理与在降维中的应用
  • SVD 降维体现在什么地方?
  • 机器学习中SVD和PCA一直没有搞的特别清楚,应该如何理解呢?
  • 机器学习算法总结(九)——降维(SVD, PCA)
  • 聊聊SVD(奇异值分解)降维

EM算法

介绍下EM算法

1.1 EM算法原理





2. EM算法的直观解释

假设有两枚硬币,但是两个硬币的材质不同导致其出现正反面的概率不一样。目前我们只有一组观测数据,要求出每一种硬币投掷时正面向上的概率。总共投了五轮,每轮投掷五次。

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中有应用。

参考文章

  • B站白板机器学习 博客整理
  • EM算法
  • 【机器学习】EM——期望最大(非常详细)

机器学习基础-经典算法总结相关推荐

  1. 【机器学习】机器学习的经典算法

    [机器学习]机器学习的经典算法 https://www.cnblogs.com/DicksonJYL/p/9517025.html 本文为整篇文章第二部分,整篇文章主要目录如下: 1:一个故事说明什么 ...

  2. python3入门经典100例-Python3入门机器学习_经典算法与应用-慕课网实战

    建议慕课网可以出一套完整的关于学完之后可以胜任人工智能这份工作的课程,达到就业的目的和转型 亲,您好~目前我们在筹划更多的人工智能的相关课程!后期会逐步的跟大家见面!不过本门课程就是您迈入机器学习领域 ...

  3. 太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  4. 【机器学习入门】机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)...

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  5. 最小错误率贝叶斯决策的基本思想_太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)...

    Datawhale 作者:尹晓丹,Datawhale优秀学习者 寄语:首先,简单介绍了生成模型和判别模型,对条件概率.先验概率和后验概率进行了总结:其次,对朴素贝叶斯的原理及公式推导做了详细解读:再次 ...

  6. 【机器学习基础】算法工程师必备的机器学习--EM

    『运筹OR帷幄』原创 作者:华校专 作者信息: 华校专,曾任阿里巴巴资深算法工程师.智易科技首席算法研究员,现任腾讯高级研究员,<Python 大战机器学习>的作者. 编者按: 算法工程师 ...

  7. em算法怎么对应原有分类_机器学习基础-EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断等等.本文就对 ...

  8. 机器学习基础 EM算法

    文章目录 一.初识EM算法 二.EM算法介绍 1. 极大似然估计 1.1 问题描述 1.2 用数学知识解决现实问题 1.3 最大似然函数估计值的求解步骤 2. EM算法实例描述 3. EM算法流程 三 ...

  9. 机器学习基础——分类算法之决策树、随机森林、Titanic乘客生存分类

    目录 1 认识决策树 1.1 信息增益.信息熵的计算 1.2 举例计算​编辑 1.3 决策树的分类依据 1.4 sklearn决策树API 2 泰坦尼克号乘客生存分类 2.1 案例背景 2.2  数据 ...

最新文章

  1. 数据库连接出错,请检查连接字串"的多种问题解决办法
  2. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储
  3. oracle10g配置失败6,Oracle10g DataGuard中ORA-16026错误解决-入门基础-Oracle频道-中国IT实验室...
  4. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn
  5. BURP安装Turbo Intruder插件报错问题
  6. 51单片机c语言秒表,51单片机秒表C程序
  7. 用来进行虚拟仿真实验的软件有哪些?这3款简单易懂的软件值得你拥有
  8. 给变量取个名字(变量命名)
  9. xcode Unable to install xxx
  10. 张量基础2(张量乘法和对称)
  11. Android之ContentProvider
  12. C/C++ Qt StatusBar 底部状态栏应用
  13. 浅析在线教育行业发展所面临的困境
  14. html 网页 简体中文 繁体中文 英文自适应,css页面字体替换源代码和页面显示不一样问题解决...
  15. humanoid ik unity 配件 animation的问题
  16. python开发的著名网站_python开发著名网站_python开发的著名软件 - CSDN
  17. 联想启天m420刷bios_联想启天M420c台式机装win7系统及bios设置教程(支持usb驱动)
  18. BIOS 常用网站 (持续更新中)
  19. Debug调试工具的使用
  20. 外国的搜索引擎 可搜索被封信息

热门文章

  1. Windows设置多用户同时远程登录
  2. php ajax 验证码,PHP验证码和Ajax验证
  3. windows十种注入方式
  4. 生物信息之独孤九剑——sed
  5. 独立站卖家如何把握关键词优化
  6. 线段求交算法对比研究
  7. Java多线程进阶详解
  8. 嵌入式Qt实验一(Qt开发环境的安装及服务端页面设计)
  9. 用c语言编程图书管理系统,C语言能写图书管理系统吗
  10. 大数据分布式存储原理