机器学习教程

发布时间 2023-10-11 11:53:20作者: GottenZZP

目录

有监督学习

含义

  • 给算法一个数据集,其中包含了正确的答案,告诉算法啥是对的啥是错的

  • 我们想要在监督学习中,对于数据集中的每个样本,我们想要算法预测,并得出正确答案

回归

  • 目的是预测一个连续值输出
  • 如一件衣服卖多少钱,可以是100,可以是200或300等等

单元线性回归

含义

  • 给定的数据集为一一对应的数据集,一个x对应一个y,例:一元一次方程

  • 一个算法h(x)给定一个输入值x,能给出一个确定的输出值y,称之为单函数(元)线性回归。

代价函数

  • 代价函数被称为平方误差函数
  • 将预测值与真实值之间的误差取到最小的函数,且用另一个函数来封装他,这个里面的另一个函数就是代价函数
  • 过程如下:
    1. 假设函数:\(h_\theta(x)=\theta_0+\theta_1x\)
    2. 参数:\(\theta_0,\theta_1\)
    3. 代价参数:\(J(\theta_0,\theta_1)=\frac{1}{2m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2\)
    4. 目标:\(\mathop{minimize}\limits_{\theta_0,\theta_1}\ J(\theta_0,\theta_1)\)
  • 如上步骤所示,先创建一个假设函数来构成一个线性函数,目的是通过调整参数来尽可能的减少假设函数所求的值和真实数据之间的差距,从而构成的一个代价函数
  • 此处的函数\(J\)就是代价函数
  • 代价函数的作用就是其最小值点的参数就是假设函数与数据集所拟合的最好的一条线

梯度下降法

  • 公式:\(\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)\),此处j等于0和1(其中的阿尔法为学习速率,阿尔法越大,步子迈的就越大,反之亦然)
  • 同步更新\(\theta_0,\theta_1\)的值
  • 更新步骤如下:
    1. \(temp0:=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)\)
    2. \(temp1:=\theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)\)
    3. \(\theta_0:=temp0\)
    4. \(\theta_1:=temp1\)

将梯度下降法与代数函数结合在一起

  • 先要知道导数项的值,如上述公式所示,利用求偏导求出 \(\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)\)\(\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)\) 的值
  • \(\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})\)
  • \(\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)=\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x^{(i)}\)
  • 再代入上述的梯度下降法的更新步骤中去,就会如下所示
    1. \(temp0:=\theta_0-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})\)
    2. \(temp1:=\theta_1-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x^{(i)}\)
    3. \(\theta_0:=temp0\)
    4. \(\theta_1:=temp1\)
  • 这样经过若干次算法迭代,\(\theta_0,\theta_1\) 就会到达一个能使假设函数变成最小值的值
  • 这种算法叫 “Batch梯度下降算法

多元线性回归

含义

  • 多元多元,相较于单元自然是多了其他的未知数,比如用多个x来确定一个y,其中的x就是特征值,例:二元一次方程,三元一次方程
  • 一个算法h(x)给定n个输入值x,能确定一个输出值y,称之为多函数(元)线性回归

多元假设函数

  • 多元假设函数:\(h_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n\),其中令 \(x_0\) 的值为1,其余的x都是特征值
  • 也可以写成这样
    • \(X=\begin{bmatrix}x_0\\x_1\\x_2\\...\\x_n\end{bmatrix},\ \ \ \Theta=\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\...\\\theta_n\end{bmatrix}\),其中 \(X,\Theta\) 均为n+1维向量
    • 可以得到\(h_\theta(x)=\Theta^TX\)

多元代价函数

  • 经过单元代价函数的形式,很容易得出多元代价函数如下所示,其中的 \(\Theta\) 是上述中的向量,其中拥有多个参数

  • \(J(\Theta)=\frac{1}{2m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2\)

多元梯度下降法

  • 公式:\(\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\Theta)\) ,其中的 \(\Theta\) 是上述中的向量,j的范围在0到n+1(因为有n+1个参数 \(\theta\)
  • 同单元一样,同步更新 \(\Theta\) 中的值
  • 更新步骤如下:
    1. \(temp0:=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\Theta)\)
    2. \(temp1:=\theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\Theta)\)
    3. ........
    4. \(temp\ n:=\theta_n-\alpha\frac{\partial}{\partial\theta_n}J(\Theta)\)
    5. \(\theta_1:=temp1\)
    6. \(\theta_2:=temp2\)
    7. ......
    8. \(\theta_n:=temp\ n\)

将多元梯度下降法与代数函数结合在一起

  • 如单元一样,先求各偏导数的值
    • \(\frac{\partial}{\partial\theta_0}J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}\)
    • \(\frac{\partial}{\partial\theta_1}J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_1^{(i)}\)
    • ......
    • \(\frac{\partial}{\partial\theta_n}J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_n^{(i)}\)
  • 会发现,多元梯度下降公式的偏导数与单元梯度下降的偏导数结果是类似的
  • 实际上,单元梯度下降法的偏导数就是由多元的偏导数所推衍而来的,像上述所说把多元的\(x_0\) 等价为1,且然后将后续的x的下标去除,则变成了单元的偏导数
  • 最后再代入多元梯度下降的更新步骤即可,如下所示
    1. \(temp0:=\theta_0-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}\)
    2. \(temp1:=\theta_1-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_1^{(i)}\)
    3. ........
    4. \(temp\ n:=\theta_n-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_n^{(i)}\)
    5. \(\theta_1:=temp1\)
    6. \(\theta_2:=temp2\)
    7. ......
    8. \(\theta_n:=temp\ n\)
    • 这样经过若干次算法迭代,\(\Theta\) 的值即可达到令多元假设函数变成最小值的值

特征缩放

啥是特征缩放?

  • 简单来说,就是当你的不同特征值之间相差比较大的时候,其作出来的图像就会变得比较细长,像下图所示
  • img
  • 这样在进行梯度下降的时候,可能就会需要进行非常多的步骤才能找到一个最小值
  • 此时我们就可以利用特征缩放来将每个特征值缩放到一个差不多的范围,再进行梯度下降就会较为容易找到最小值

公式

  • 特征缩放公式为:\(x_i=\frac{特征值}{特征值的最大值}\)
  • 例如,假如你想要计算房屋的售价,有两个特征值,一个是房屋面积(范围在0-2000),一个是房间个数(范围在1-5)
  • 这两个特征值之间的差距就比较大,就可以使用特征缩放公式来拉近两值之间的差距,如下所示
  • \(x_1=\frac{当前房屋面积}{2000},x_2=\frac{当前房间个数}{5}\)
  • 这样用代价函数所做出来的图像则会更接近一个正圆形,就比较好寻找最小值了,如下图所示
  • img

均值归一化

  • 一般在进行特征缩放的时候会做一个这个事--也就是标题
  • 啥叫均值归一化?
    • 均值归一化其实就是一种更好的特征缩放,当多个特征值相差特别大的时候,能够防止因为差距过大而导致其中较小一方的影响被忽略,而较大的一方起决定性作用
  • 公式:\(x_i=\frac{x_i-\mu_i}{s_i}\)
  • 现在来解释一下上述公式意思
    • \(x_i\) 是第i个特征值,\(\mu_i\) 是训练集中特征值 \(x_i\) 的平均值,\(s_i\) 是该特征值的训练集最大值减最小值
    • 这样算出来的结果一定是一个处于-0.5到0.5之间或附近的值,这样不同特征值之间的差距就会变得非常小
  • 用特征缩放刚开始的例子来解释公式则如下所示
  • \(x_1=\frac{当前房屋面积-1000}{2000},x_2=\frac{当前房间个数-2}{4}\)

学习率的调整的建议

介绍

  • 学习率就是上文中梯度下降法里的 \(\alpha\) ,阿尔法是决定代价函数迈多大步子到最小值的一个参数
  • 若阿尔法太大,则每次迭代可能会跳过最小值,从而使得代价函数越来越大
  • 若阿尔法太小,则为了达到最小值,可能需要非常多次的迭代,这样时间效率就会变差
  • 所以选择一个合适的阿尔法值是提高梯度下降法效率的一个重要指标

建议

  • 先测试出一个阿尔法的最大值和最小值(也就是不会使得代价函数增高或迭代次数过多的一个值)
  • 然后每隔三倍左右进行一次测试,从而找到一个较好的学习率

正规方程

解释

  • 可以一步得出使得代价函数最小值的参数theta

公式

  • \(\theta=(X^TX)^{-1}X^Ty\)
  • 解释一下上述公式,其中X是训练集当中的的一系列样本的特征值,y是训练集中的正确答案
  • 例如:
    • image-20211021174005058
    • 而且如果使用的是正规方程方法,那么则无需使用特征缩放来将所有特征值归一化为一个相似的值
    • 例如这有两个特征值:房间尺寸为1到2000,而房间个数为1到5个,如果使用梯度下降法,则需要将这两个特征值进行特征缩放后再进行迭代计算,而使用正规方程则不用这一步

如何选择梯度下降法或正规方程?

  • 先说一下两者的优点和缺点吧,这样更能分辨它们两者之间的适用范围

两者之间的优缺点

  • 梯度下降法 正规方程
    缺点:需要选择一个合适的 \(\alpha\) 优点:无需选择合适的 \(\alpha\) ,一步即可得出 \(\theta\)
    缺点:需要进行多次迭代 优点:无需进行多次迭代
    优点:在特征向量特别大的时候,仍然可以很好的进行工作,例如特征向量维度大于10000的时候 缺点:当特征向量维度特别大的时候,则运行起来会非常慢,当有n个特征值的时候,求 \((X^TX)^{-1}\) 的时候可能需要的运行时间为n的立方次数甚至更多
    时间复杂度:\(O(kn^2)\) 时间复杂度:\(O(n^3)\)

总结

  • 从上表中可以得到,若特征向量的维数如果非常大,则正规方程会运行的非常慢,这样显然是划不来的,可能就会选择梯度下降法(一般当特征向量维度超过10000时会考虑)
  • 而若特征向量维度没有那么大的时候,当然选择正规方程会更好一点,因为你无需手动调试出一个合适的阿尔法,这样很费时间,只需要一步即可算出答案

分类

二分类

介绍

  • 目的是预测离散值的输出

  • 例如判断是否中彩票了,是用1,否用0来代表

  • 也就是 \(y\in\left \{ 0, 1\right \}\)

  • 其中的 0 代表负类,1代表正类,此处的负和正可以是良性肿瘤恶性肿瘤,或者上面提到的是否中彩票等

  • 我们可以来看一下用线性回归的思想能否适用于分类问题

  • IMG_6484
  • 在上图中可看到,红色的x轴为肿瘤大小,粉色的线为线性回归的假设函数图像。

  • 发现我们只需要在假设函数等于0.5处加一根竖线(绿色的线),就可以成功的将这里的回归问题转化成了分类问题,肿瘤大小在绿线左边的都是良性的,在右边的则都是恶性的

  • 这样看样子,好像线性回归的假设函数可以直接运用到分类问题里,但是如果出现了下图情况呢

    IMG_6485
  • 可以看到,在右方出现了一个巨大的肿瘤,导致我们的假设函数因为这个异常值的影响,预测的不再准确

  • 究其原因是因为我们线性回归的假设函数太直了,所以我们需要找出一个不那么直的函数

逻辑回归

假设函数

  • 这个新函数就是 \(g(z)=\frac{1}{1+e^{-z}}\)

  • 这个函数,叫logistic函数(逻辑),也叫Sigmoid函数

  • 为什么选它作为假设函数,我们来看一下它的图像就知道了

  • image-20211025202203981

  • 发现这个函数将输入范围(负无穷到正无穷)映射到了输出范围(0,1),很具有概率意义

  • 啥叫很具有概率意义,就是相当于我们将中彩票的样本输入到这个函数中,假如函数输出了0.7,就表示有70%的可能中彩票,相应的,也就有30%到可能不中彩票

  • 那逻辑回归到假设函数参数从哪里设置呢?我们来看一下线性回归的假设函数:\(h_\theta(x)=\Theta^TX\)

  • 线性回归的参数输入就是 \(\Theta^TX\)

  • 而逻辑回归的假设函数则有一点不一样:\(h_\theta(x)=g(\Theta^TX)\)

  • 其中的 \(\Theta^TX\) 我们用z来代替,再套用sigmoid函数,则 \(g(\Theta^TX)=g(z)=\frac{1}{1+e^{-z}}\)

  • 我们再将刚刚那两个公式给组合一下,就可以得出正式的假设函数为:\(h_\theta(x)=\frac{1}{1+e^{-\Theta^TX}}\)

  • 有了这个假设函数之后,接下来就和线性回归一样了,同样是找到一个合适的 \(\theta\) 值,来使得我们的假设函数最大程度的拟合我们给定的数据集

数学公式

  • 例子:假如我们的假设函数是用来预测当输入给定的特征值X,y=1的概率为多少,以肿瘤为例
  • 我们给定的特征值为一个,即肿瘤尺寸 \(X = \begin{bmatrix}x_0\\x_1\end{bmatrix} = \begin{bmatrix}1\\肿瘤尺寸\end{bmatrix}\)
  • 假设通过该特征值我们得出了 \(h_\theta(x)=0.7\),那么这个的意思就是有0.7也就是百分之70的概率患恶性肿瘤
  • 数学公式为:\(h_\theta(x)=P(y=1|x;\theta)\),这是一个概率论里的公式
  • 意思为:在给定x的条件下,y=1的概率是多少,其中的 \(\theta\) 是参数
  • 通过该公式,很容易得到以下推导
    • \(P(y=0|x;\theta)+P(y=1|x;\theta)=1\)
    • 这是啥意思呢,就是y=0的概率加上y=1的概率之和为1,就相当于抛硬币,理想状态下抛到正面和反面的概率都是百分之五十,也就是0.5,那么相加后概率自然就为1了
    • 也可以把上面的式子改写一下
    • \(P(y=0|x;\theta)=1-P(y=1|x;\theta)\),意思为y=0的概率是1-(y=1)的概率

决策边界

  • 我们知道了分类问题的假设函数是什么了:\(h_\theta(x)=\frac{1}{1+e^{-\Theta^TX}}\)
  • 从上图可知假设函数是处于0到1之间的,当z小于0时,\(h_\theta(x)\) 会无限趋近于0,z大于0时,函数会无限趋近于1
  • 那么现在我们需要知道,该假设函数为何值时,会把y预测为1,或者把y预测为0
  • 我们照搬上面的公式:\(h_\theta(x)=g(\Theta^TX)=P(y=1|x;\theta)\)
  • 我们可以选定一个阀值,当 \(h_\theta(x)\ge0.5\) 时,就意味着预测y=1的概率大于等于0.5,也就更有可能使得y=1,所以我们就预测y=1,当 \(h_\theta(x)<0.5\) 时,同理,我们就预测y=0
    • 这个阀值不是一定的,看实际情况来选择,因为我们知道,分类的假设函数算出来的模型是一个概率值,就算算出来y=1的概率是0.9,那有一万个样例的情况下,还是会有一千个样本是y=0,也就是反例,所以无论我们怎么选,误差都是存在的
    • 假设按照我们这里设置的阀值0.5来说,在医疗检查中,我们用机器学习检测患者得恶性肿瘤的概率为0.49,那模型就会认为他没有患恶性肿瘤,所以在这种情况下,就会把阀值设置的小一点,比如0.2、0.3等
    • 一旦患恶性肿瘤的概率超过0.3,算法就会报警,就让这个人去做个全面检查
  • 再来看一下图
  • image-20211025212213112
  • 我们可以发现,当z的值大于等于0的时候,假设函数是大于等于0.5的,而我们知道z也就是 \(\Theta^TX\)
  • 相当于只要 \(\Theta^TX\ge0, g(z)\ge0.5\),那我们就令y=1,而\(\Theta^TX<0,g(z)<0.5\) 时,我们就令y=0
  • 为了更好的理解这个例子,我们来可视化一下,现在这有一个训练集
    • image-20211025225938876
    • 而我们的假设函数为:\(h_\theta(x)=g(\theta_0+\theta_1x_1+\theta_2x_2)\)
    • 在这里我们假设已经拟合好了该参数,也就是我们已经找到了合适的 \(\Theta\) 值,如下所示
    • \(\Theta=\begin{bmatrix}-3\\1\\1\end{bmatrix},X=\begin{bmatrix}x_0\\x_1\\x_2\end{bmatrix}\)
    • 如上所述,当我们这里的 \(\Theta^TX\ge0\) 时,也就是当 \(-3+x_1+x_2\ge0\) 时,我们就预测y=1
    • 再更新一下式子,也就是当 \(x_1+x_2\ge3\) 时,我们就预测y=1
    • 此时我们把 \(x_1+x_2\ge3\) 这条线给画出来
    • image-20211025230001921
    • 所以 \(x_1+x_2\ge3\) 的平面就是上图中的叉叉区域,也就是我们预测y=1的区域,而 \(x_1+x_2<3\) 的平面自然也就是那根线下面的区域了,也就是y=0的区域
    • 而这根线,就是决策边界,也可以叫决策界限,它也就是 \(h_\theta(x)\) 正好等于0.5的区域
  • 它将整个区域划分为了两块
  • 这里要讲清楚一个关系,决策边界并不是由训练集所决定的,而是由 \(\Theta\) 的取值所决定的,只要 \(\Theta\) 值确定了,决策边界自然也就确定了,而训练集只是我们用来拟合 \(\Theta\) 参数的一些样本
  • 我们再来看一个更复杂的样例
    • image-20211026100400174
    • 面对这个样例,我们怎么找出它的决策边界呢?或者说其假设函数的参数应该是什么样的呢?
    • 在线性回归那里,我们知道,当碰到一个下图训练集时,我们可以用一次函数来拟合它:\(h_\theta(x)=\theta_0+\theta_1x\)
    • image-20211026100755739
    • 为什么是一次函数呢?因为一次函数是一条直线嘛,这个训练集的样本基本也都处于一条直线上,所以能用一次函数来拟合
    • 而换成下面的例子,线性回归又该如何处理呢?
    • image-20211026101227322
    • 此时用一次函数已经不能拟合这些样本了,于是我们就会使它的假设函数变成二次函数:\(h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2^2\)
    • 这样,这个假设函数就能够拟合这些样本了,因为大家都知道,二次函数的曲线就是一个弧形
    • 因此,我们貌似得出一个规律,越复杂的训练集,我们的假设函数需要的高阶多项式也就越多
    • 而到了逻辑回归这里,我们同样也可以用增加函数次数的方法来使假设函数更拟合训练集
    • 再对上面的例子来说,我们的假设函数是这样的:
    • \(h_\theta(x)=g(\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1^2+\theta_4x_2^2)\)
    • 我们再假设已经拟合好了参数,\(\Theta=\begin{bmatrix}-1\\0\\0\\1\\1\end{bmatrix},X=\begin{bmatrix}x_0\\x_1\\x_2\\x_1^2\\x_2^2\end{bmatrix}\)
    • 这样,按照之前所说的 \(\Theta^TX\ge0\) ,就相当于只要 \(-1+x_1^2+x_2^2\ge0\) ,我们就预测y=1
    • 也就是 \(x_1^2+x_2^2\ge1\) ,没错,就是半径为1的圆的公式
    • 2A9FE809-1C6F-4264-AD94-6F3A29A833C6
    • 这就是该参数的决策边界,只要在圆外面的区域,我们就预测y=1,圆内的区域,我们就预测y=0
  • 这也就更加确定了,当遇到更复杂的训练集时,通过在特征值中增加复杂的多项式,我们也可以得到更复杂的决策边界

代价函数

  • 线性回归的代价函数是:\(J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^m\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2\), 而逻辑回归的假设函数为 \(h_\theta(x)=\frac{1}{1+e^{-\Theta^TX}}\)
  • 我们令代价值 \(Cost(h_\theta(x),y)=\frac{1}{2}(h_\theta(x)^{(i)}-y^{(i)})^2\) ,则 \(J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^mCost(h_\theta(x),y)\)
  • 我们先看一下可不可以将线性回归的代价值函数直接运用于逻辑回归中,会发现图像如下所示
  • 1C53C560-550E-4236-A3E9-3C969EFB1DAD
  • 会发现出现了很多的局部最优值,这样我们在用梯度下降法的时候,几乎不能保证可以收敛到最小值
  • 因为我们在线性回归那一块的时候,代价值函数的图像是这样的
  • B1046A98-92CE-4CE2-8AAF-59B6C4D43832
  • 这是一个凸函数,使用梯度下降法可以非常顺畅的使得代价值函数直接收敛到最小值
  • 所以我们也希望逻辑回归的代价函数可以具有这样的特质,所以这就引入了下面的代价值公式
  • \(Cost(h_\theta(x),y)=\begin{cases}-log(h_\theta(x))&\text{ 如果 }y=1\\-log(1-h_\theta(x))&\text{ 如果 }y=0\end{cases}\)
  • 这个公式啥啥意思捏,先来看y=1时的公式图像
    • image-20211026170023167
    • 这个图像的意思就是,当我们的假设函数和样本值均等于1的时候,则代价值函数就等于0,这就说明我们预测的非常准确,没有任何误差,就拿我们线性回归的代价值函数来说,预测值减去训练集中的实际y值,若预测值等于实际值,就相当于预测的十分的准,于是相减就为0,逻辑回归的代价值函数同理
    • 而当实际值y=1时,我们假设函数预测的越靠近0,从图可以看出来,则代价值函数是越趋近无穷的,也就代表了是非常大的误差
  • 再来看一下y=0时的公式图像
    • 86354D33-784A-4A88-871B-930C775B66D7
    • 意思于y=1时的公式同理,当实际值是y=0时候,我们的假设函数预测它的值越靠近1,则代价值函数越大,也就代表误差越大,假设函数越靠近0,则代价值函数的误差也就越小

简化代价函数

  • 我们先来简化一下代价函数,从上述得知,现在的代价函数如下所示
  • \(J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^mCost(h_\theta(x),y),\ \ \ \ \ \ Cost(h_\theta(x),y)=\begin{cases}-log(h_\theta(x))&\text{ 如果 }y=1\\-log(1-h_\theta(x))&\text{ 如果 }y=0\end{cases}\)
  • 这样看起来太复杂了,我们可以将代价值函数简化成:\(Cost(h_\theta(x),y)=-ylog(h_\theta(x))-(1-y)log(1-h_\theta(x))\)
  • 其实也不算简化,就相当于把代价值函数弄成了一行就可以表现的公式,此时的代价函数如下所示
  • \(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^my^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]\)

梯度下降法

  • 好,既然我们已经知道了逻辑回归的代价函数,那么我们就需要最小化代价函数,然后把能最小化代价函数的参数 \(\theta\) 取出来就可以获得最能拟合我们数据集的假设函数了
  • 公式如线性回归一样:\(\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\Theta)\)
  • 然后同步更新所有的 \(\theta_j\) 即可
  • 我们对导数项进行求导后可以得出:\(\frac{\partial}{\partial\theta_j}J(\Theta)=\frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\)
  • 于是公式:\(\theta_j:=\theta_j-\alpha\frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\)
  • 更新步骤也和线性回归一致,循环更新 \(\Theta\) 里的值
  • 其中 \(\Theta=\begin{bmatrix}\theta_0\\\theta_1\\...\\\theta_n\end{bmatrix}\)
  • 使其向量化后就是:\(\Theta:=\Theta-\frac{\alpha}{m}X^T(g(X\Theta)-\vec{y})\)

多元分类

一对多

  • 在二元分类中,我们知道了,\(y\in(0,1)\)
  • 而在多元分类中,\(y\in(0,1,2····n)\),这取决于你有多少种情况
  • 例如,你的医院来了个鼻塞患者,他有可能是因为:流感(y=1)、着凉了(y=2)、压根没生病(y=3)
  • 或者是天气问题:天晴(y=1)、阴天(y=2)、下雨(y=3)、下雪(y=4)
  • 这些都属于多分类问题,y可以取一些离散值,上面例子里的y不一定非得是我这样的,你随便怎么标注都行,只要体现出他们属于不同类就行
  • 那么如何从多种分类的情况下预测其中的一个分类呢?
  • 举个例子:下图训练集有三个分类
  • image-20211028160314599
  • 我们可以将这仨分类给自己再分一下类,也就是下面这样样子,三角形设置成1类,而圆形设置成2类
  • image-20211028160501980
  • 然后我们运行一波我们之前说的二分类的分类器(也就是成功预测的假设函数),会得到下面的结果
  • image-20211028160931276
  • 然后我们依次对其他的类别采取同样的方法
  • image-20211028161140012
  • image-20211028161228732
  • 最后我们会得到三个这样的假设函数
  • \(h_\theta^{(i)}(x)=P(y=1|x;\theta),\ \ \ \ \ (i=1,2,3)\)
  • 这三个假设函数会给出我们上述所说的能使三个类别为正例的概率值,我们选择其中的最大值
  • 然后把它设置成我们最后的正例,也就是y等于的那个值,因为它概率最大

过拟合问题

  • 从例子来讲比较好

  • image-20211028163152873

  • 第一个属于欠拟合

    • 为啥会出现欠拟合?主要原因就是特征值和参数给的太少了,就拿这个例子来说
    • 假设你这个模型就设置一个特征值,就是房子的面积,这样预测肯定是不准的,哪个房子只看尺寸就能确定价格的
  • 第二个就拟合的比较好

    • 参数不多不少,刚刚好
  • 第三个属于过拟合

    • 主要原因就是特征值给的太多了,买个房子,特征值拿一个面积和房屋个数就差不多了,你又多加一个屋子灰尘数量参数,屋子的内饰颜色啥的,这样肯定就预测不准了,因为大部分人可能都不会在意灰尘多不多,大不了扫一下就好了
  • 如何优化过拟合问题

    • 一、手动减少部分的特征值
    • 二、正则化
      • 不需要额外的去除我们的特征值

正则化

  • 思想
    • 举例来说,当拥有一个这样的假设函数时:\(h_\theta(x)=\theta_0+\theta_1x_1+1000x_2^2+1000x_3^3\)
    • 而假设这个假设函数:\(h_\theta(x)=\theta_0+\theta_1x_1\)可以刚好拟合训练集
    • 那么最开始那一个假设函数后面的两个额外特征值是不是就会使该函数算出来的值变大很多
    • 那么怎样在不去除最后两个特征值的情况下,把这俩特征值对该函数所造成的影响最小呢
    • 很简单,缩小他们的系数就行了:\(h_\theta(x)=\theta_0+\theta_1x_1+0.01x_2^2+0.01x_3^3\)
    • 这样后面两个特征值对该假设函数所造成的影响就会变小很多
  • 但是一般情况下,我们并不会知道到底是哪个参数影响了我们的最后的结果,所以我们需要缩小所有参数的权重
线性回归正则化
  • 所以带正则项的线性回归代价函数等于:\(J(\Theta)=\frac{1}{2m}[\sum\limits_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{j=1}^n\theta_j^2]\)
  • 其中的lambda叫做正则化参数,是用来控制对所有theta参数的惩罚程度的,如果将其设置的过大,那么就会将所有的参数无限接近于0,最后只剩theta0了,从而导致欠拟合
  • 而一旦修改了线性回归的代价函数,那么梯度下降法中的求导项也要做相应的更改
    • 更改后的梯度下降:\(\theta_j:=\theta_j-\alpha[\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}\theta_j]\)
    • 变更一下式子可得:\(\theta_j:=\theta_j(1-\alpha\frac{\lambda}{m})-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\)
    • 观察上式,alpha一般非常小,而m一般非常大,所以他们的乘积应该是一个非常小的数,1减去一个非常小的数,就相当于会损失一点点,比如等于0.99,这样我们再观察上式可以看到,在梯度下降法的每次迭代中,我们都把当前的theta值减少了一点点,也就是前面说的系数项,从而达到防止过拟合
逻辑回归正则化
  • 带正则项的逻辑回归代价函数为:\(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^my^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\theta_j^2\)
  • 而逻辑回归的梯度下降法的步骤则是:\(\theta_j:=\theta_j-\alpha[\frac{1}{m}\sum\limits_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}\theta_j]\)
  • 这里的逻辑回归的方程和线性回归的方程一样纯粹是因为巧合,实际上两者并不是同一个方程,因为他们的假设函数是完全不同的两个函数

神经网络

人工神经元

  • image-20211031153723700
  • 上图中的x0是“偏置单元”, 上图名称为“带有sigmoid激活函数的人工神经元”,且为单个神经元
  • 激活函数:像sigmoid函数等一些非线性函数的别称
  • x为我们的输入单元,theta为我们的参数(权重)

神经网络

  • 神经网络是由多个神经元所构成的,如下图所示

  • image-20211031154859443
  • 其中的层一为输入层,层二为隐藏层,层三为输出层

  • 为什么叫隐藏层?

    • 因为该层的值在训练集里是看不到,所以叫隐藏层
    • 一个神经网络可拥有多个隐藏层,实际上除了输入层与输出层以外的都叫隐藏层
  • 既然隐藏层的值在训练集看不到,可以通过以下计算出隐藏层的值

    • \(a_1^{(2)}=g(\Theta_{10}^{(1)}x_0+\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3)\)
    • \(a_2^{(2)}=g(\Theta_{20}^{(1)}x_0+\Theta_{21}^{(1)}x_1+\Theta_{22}^{(1)}x_2+\Theta_{23}^{(1)}x_3)\)
    • \(a_3^{(2)}=g(\Theta_{30}^{(1)}x_0+\Theta_{31}^{(1)}x_1+\Theta_{32}^{(1)}x_2+\Theta_{33}^{(1)}x_3)\)
    • \(h_\Theta(x)=a_1^{(3)}=g(\Theta_{10}^{(2)}a_0^{(2)}+\Theta_{11}^{(2)}a_1^{(2)}+\Theta_{12}^{(2)}a_2^{(2)}+\Theta_{13}^{(2)}a_3^{(2)})\)
    • 可以看出以上计算可以统一归一到一个矩阵的计算,我们可以将其向量化一下
      • \(\Theta^{(1)}=\begin{bmatrix}\Theta_{10}^{(1)}&\Theta_{11}^{(1)}&\Theta_{12}^{(1)}&\Theta_{13}^{(1)}\\\Theta_{20}^{(1)}&\Theta_{21}^{(1)}&\Theta_{22}^{(1)}&\Theta_{23}^{(1)}\\\Theta_{30}^{(1)}&\Theta_{31}^{(1)}&\Theta_{32}^{(1)}&\Theta_{33}^{(1)}\end{bmatrix},\ X=\begin{bmatrix}x_0\\x_1\\x_2\\x_3\end{bmatrix},\ Z^{(2)}=\begin{bmatrix}z_1^{(2)}\\z_2^{(2)}\\z_3^{(2)}\end{bmatrix},\ A^{(2)}=\begin{bmatrix}a_0^{(2)}\\a_1^{(2)}\\a_2^{(2)}\\a_3^{(2)}\end{bmatrix}\)
      • \(Z^{(2)}=\Theta^{(1)}X\)
      • \(A^{(2)}=g(Z^{(2)})\ \ (添加a_0^{(2)})\)
      • \(Z^{(3)}=\Theta^{(2)}A^{(2)}\)
      • \(h_\Theta(x)=A^{(3)}=g(Z^{(3)})\ \ (添加a_0^{(3)})\)
  • 如果只有一层的神经网络,就有点类似于分类任务里的逻辑回归,如图所示

  • image-20211031220247647
  • 因为输入值就是我们的a1 - a3,没有隐藏层,所以也就只有一个计算层,也就是最后的输出h(x)

  • image-20211031221026901
  • 而超过了两层的神经网络则就和逻辑回归不太一样了,因为他有了两个计算层,也就是上图的层2和层3

  • 我们最终输出的层3是由隐藏层2计算得来的,而隐藏层又是由输入层1计算而来的

  • 也就是说,逻辑回归的特征值是从训练集中直接获得的,而这里的神经网络,则是先从训练集中获取特征值,然后再对原始特征值进行学习,从而得到一个更好的特征值,再用该特征值当参数来进行预测

向前传播(正向传播)

  • 向前传播其实就是上述表示的综合说法,就拿上图的神经网络来说,我们预先是不知道第二层和第三层的值的
  • 第二层的值需要通过第一层,也就是输入层的加权参数得来后才能计算得来,而我们第三层的值又需要第二层的加权参数传递后才能算出来
  • 这么一个过程,叫做向前传播

如何用神经网络进行多元分类?

  • 当我们想利用神经网络进行分类多个数据的时候,我们需要给神经网络增加多个输出口
  • 比如我们需要检测四个类型的对象,哪些是行人,汽车,摩托车,卡车,也就是多分类的问题,我们需要的神经网络如下图所示
  • image-20211101162311466
  • 我们可以看到,在最后的输出层现在有了四个输出单元,也就是说,我们的输出层现在是一个四维向量
  • 我们用第一个单元判断是否是行人,是的话为1不是为0,第二个单元判断是否是汽车,等等
  • 例如当检测到了是行人,则输出单元会变成这样\(h_\Theta(x)=\begin{bmatrix}1\\0\\0\\0\end{bmatrix}\)
  • 当检测成汽车,则输出单元是\(h_\Theta(x)=\begin{bmatrix}0\\1\\0\\0\end{bmatrix}\),等等
  • 这其实就是逻辑回归里的一对多分类,只不过现在变成了四个逻辑回归分类器来对可能检测到的类别进行分类
  • 在逻辑回归里,我们在训练集里输入的y值等于1、2、3等等值,而如果要用神经网络进行多元分类的话
  • 则训练集的y值则就应该是一个向量了,例如\(y^{(i)}=\begin{bmatrix}1\\0\\0\\0\end{bmatrix}(行人),\begin{bmatrix}0\\1\\0\\0\end{bmatrix}(汽车),\begin{bmatrix}0\\0\\1\\0\end{bmatrix}(摩托车),\begin{bmatrix}0\\0\\0\\1\end{bmatrix}(卡车)\)
  • 而与之对应对x则应该是相符合的y的图像,训练集就应该是这样的
  • \((x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\)

代价函数

  • 通过上诉表达,我们知道了神经网络的假设函数是怎么来的了,那么接下来,我们需要最小化代价函数从而得到最优化的假设函数的参数值,或者也叫权重值。
  • 我们先来看一下逻辑回归的代价函数:\(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^my^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum\limits_{j=1}^n\theta_j^2\)
  • 我们知道,逻辑回归中的分类问题都只是分出一个类就行了,所以y的值只是一个实数,而在神经网络中,我们可能需要分出好几类
  • 比如上面那个例子,我们需要同时分出哪个是车,哪个是行人,等等,所以这里的y的值,就需要用一个向量来完成对分类结果的存储,所以我们的代价函数就需要对y向量中的每一个分量再做一次累加
  • 同时在逻辑回归中,我们的假设函数也是只预测一个值,而在这里我们的假设函数预测的也是一个向量了,所以也需要对假设函数所预测的向量内的每一个分量进行一次累加,于是代价函数如下所示
  • \(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^m\sum\limits_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)})_k)]+\frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\theta_{ji}^{(i)})^2\)
  • 我们来解释一下上式代价值项
    • 在线性回归及逻辑回归中我们知道,代价函数中的代价值就是算你的预测值与在训练集中的实际值的误差,而代价函数就是将所有样本的误差累加起来求平均得到一个平均误差,在神经网络这里,我们的实际值y是一个向量,而我们的预测值h(x)也是一个向量,我们如何对这两个向量之间求误差呢?就是同时将其向量内的每个值取出来求误差即可,这也就是上式中多加一个求和符号K的原因
  • 我们再来解释一下上式正则项
    • 在逻辑回归中我们知道,对于所有的参数theta,我们都可以用一个向量来表示它,所以我们只需要对这个向量内的所有参数进行惩罚就行了(除了偏置项),用一个j就可以遍历整个向量了,而在神经网络中,我们的参数theta是一个矩阵形式存在的,i代表第几行,j代表第几列,所以我们需要用i,j两个值来累加这个矩阵中的所有theta参数,而l则是表示该参数是在第几层的权重矩阵中,因为在神经网络中,层数不只是一层,可能有多层,所以我们需要对每一层的权重矩阵都进行一个惩罚,而我们知道,在神经网络的第一层,也就是输入层,是没有权重矩阵的,因为输入层是直接将训练集的值输入进来,是一个确切的值,所以正则项最外层的累加是到L-1的

反向传播

介绍

  • 反向传播的目的很简单,就是用来求出每个神经元的误差,使得神经网络可以使用梯度下降法来最小化代价函数,从而找到最优的权重矩阵,能够使得假设函数可以最大程度拟合数据集

为什么需要反向传播?

  • 我们来回忆一下,我们在逻辑回归中是如何最小化代价函数的,没错,是用梯度下降法
  • 而用梯度下降法我们需要知道两个东西的值:\(J(\Theta),\ \ \frac{\partial}{\partial\theta_j}J(\Theta)\)
  • 这时我们思考一下,可否在神经网络中直接使用梯度下降法来最小化我们的代价函数呢?
  • 显然是很难的,因为在逻辑回归中我们可以看到,我们对于代价函数其中的每个参数求导都是可以直接得到的
  • 因为逻辑回归代价函数中的特征值x和所对应的y值都是通过训练集直接传递的
  • 而神经网络这里,在输入层与输出层之间可能存在多个隐藏层,每个隐藏层的值都是由上一层加权和之后代入激励函数中得到的,假设我们最后的输出层为L,则它需要L-1层所有单元的加权和且代入激励函数中得出
  • 若神经网络层数大于等于3层时,这时的L-1层的所有单元值,就已经不是我们从训练集获得的特征值了
  • 所以我们需要反向传播算法来快速获得代价函数对每个theta值的偏导数来为后续的梯度下降做准备

运用

  • 也就是我们需要知道\(J(\Theta),\ \ \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)\) 俩的值
  • 代价函数公式:\(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^m\sum\limits_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)})_k)]+\frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\theta_{ji}^{(i)})^2\)
  • 假设我们要用反向传播在下图神经网络中
  • image-20211103153643273
  • 我们在这里定义 \(\delta_j^{(l)}\) 为第l层的第j个单元激活值的误差
  • 那么我们可以知道,最后输出层的误差为:\(\delta^{(4)}=a^{(4)}-y\)
  • 也就是我们的预测值减去训练样本的实际值,上面用的是向量的形式写的
  • 而第三层的误差为:\(\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})\)
  • 第二层的误差为:\(\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)})\)
  • 第一层没有误差,因为第一层是直接从训练集取出的数据
  • 所以我们可以得到一个求误差delta的通用公式:\(\delta^{(l)}=\begin{cases} 0& \text{ if } l=0 \\ (\Theta^{(l)})^T\delta^{(l+1)}.*g'(z^{(l)})& \text{ if } 1\le l\le L-1 \\ y-a^{(l)}& \text{ if } l=L \end{cases}\)
  • 而我们对每一层参数theta的偏导数为:\(\frac{\partial}{\partial\Theta^{(l)}}J(\Theta)=\delta^{(l+1)}(a^{(l)})^T\)
  • 由此可以看到,反向传播就是先通过直接算出最后一层的误差,然后往前推,比如我们要计算第三层的误差,我们就可以用第四层的误差来进行计算,而我们要求出第二层的误差,那么就需要用到第三层的误差,这样从后往前推,这就是反向传播
  • 用一句话来概述就是,我们先随机放入一组参数值,然后正向传播进行预测,到了最后的输出层的时候,我们判断我们输出的结果和真实结果是否有误差,如果有误差我们进行反向传播,逐层将每层的误差算出来然后根据我们的误差来更新我们的参数值,然后用新的参数值再进行正向传播,算出新的误差,再反向传播更新参数值,以此来不停的缩小我们的误差值,从而进行参数的训练

步骤

  1. 首先我们得有m个训练集
  2. 将累计偏导数\(\Delta_{ij}^{(l)}\)给初始化为0
  3. 进行每个样本的迭代:For i in range(m)
    1. \(a^{(1)}=x^{(i)}\),将第i个样本赋值给输入层的激活函数
    2. 进行正向传播,计算每一层的\(a^{(l)},l=2,3,...,L\)
    3. 通过训练集中每个\(x^{(i)}\)对应的\(y^{(i)}\),我们计算出最后输出层所对应的误差项\(\delta^{(L)}=a^{(L)}-y^{(i)}\)
    4. 进行反向传播,计算每一层的误差\(\delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)}\)
    5. 通过得来的误差,计算出偏导数值,再将所有的偏导数值累加起来\(\Delta_{ij}^{(l)}:=\Delta_{ij}^{(l)}+a_j^{(l)}\delta_i^{(l+1)}\)
  4. \(D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)}\),当j不等于0时,计算出偏导数项的平均值并且对其正则化
  5. \(D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}\),当j=0时,代表该项为偏置项,所以不需要对其进行正则化
  6. \(\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=D_{ij}^{(l)}\),最后得出来的值就是参数theta的偏导数项

梯度检测

为啥要进行梯度检测?

  • 当我们进行反向传播时,可能会遇到一些bug或者因为我们的疏忽所导致的求偏导数的错误,但是我们又很难发现的了,因为他只是输出了错误的偏导数结果,程序可能不会崩溃,于是我们的程序就会用这个错误的结果来进行梯度下降或者是其他的高级算法来最小化代价函数,所以我们需要进行梯度检测以防止反向传播中可能出现的bug

原理

  • 举个例子,如下图所示,是一个非线性函数的图像
  • image-20211103202829055
  • 这条线是点theta在代价函数中的导数,我们通过什么办法可以找到一条线来相似于这个导数呢?
  • 众所周知,该点处导数的实际意义就是该点切线的斜率,我们可以这样做:
    • 我们给theta加上一个极小的值,和减去一个极小的值\(\varepsilon\)
    • 然后再连接这俩点的函数值,也就是\(J(\theta+\varepsilon),\ \ J(\theta-\varepsilon)\)
    • 我们可以得到一个如下图所示的红色斜线,这条线的斜率从理论上来说,只要\(\varepsilon\)足够小,那么该斜线的值将会无穷的相似于我们的导数值,甚至在计算机的有限精度下等于我们的导数值
    • 于是该斜线的公式就等于:\(gradApprox=\frac{J(\theta+\varepsilon)-J(\theta-\varepsilon)}{2\varepsilon}\)
    • 该式会在某个精度值之内,无限等于我们的偏导数:\(\frac{\partial}{\partial\theta}J(\Theta)=gradApprox\)
  • image-20211103203155758
  • 因为我们上面的例子只有一个参数,而在神经网络中,通常参数都是非常多的,由此,我们可以从低维推广到高维,通过分别对每个参数进行上述操作从而达到对每个参数的求偏导的近似值
    • \(\frac{\partial}{\partial\theta_1}J(\Theta)\approx\frac{J(\theta_1+\varepsilon,\theta_2,\theta_3,...,\theta_n)-J(\theta_1-\varepsilon,\theta_2,\theta_3,...,\theta_n)}{2\varepsilon}\)
    • \(\frac{\partial}{\partial\theta_2}J(\Theta)\approx\frac{J(\theta_1,\theta_2+\varepsilon,\theta_3,...,\theta_n)-J(\theta_1,\theta_2-\varepsilon,\theta_3,...,\theta_n)}{2\varepsilon}\)
    • ...
    • \(\frac{\partial}{\partial\theta_2}J(\Theta)\approx\frac{J(\theta_1,\theta_2,\theta_3,...,\theta_n+\varepsilon)-J(\theta_1,\theta_2,\theta_3,...,\theta_n-\varepsilon)}{2\varepsilon}\)

总结

  1. 我们先要通过反向传播计算出梯度值
  2. 使用梯度检测计算出梯度值
  3. 比较反向传播与梯度检测的值是否一致或者相差很小,若相差很大则需要检测自己的代码有没有写错
  4. 通过第3步确保梯度没错后,在将代码正式使用在测试集之前务必关闭梯度检测,因为梯度检测的时间复杂度非常高

随机初始化

机器学习诊断法

介绍

  • 可用来评估该机器学习算法是否能有效的运用与我们的数据集当中
  • 通常也能告诉我们我们算法问题出在了哪里
  • 应用场景如下:
    • 比如当我们用线性回归算法来预测房价,但是发现预测产生了严重的偏差,于是我们想要优化该算法
    • 于是可能有如下几种优化方案
      • 增加更多的训练样本
      • 减少冗余的特征值
      • 增加特征值的个数
      • 修改我们的正则项参数lamda
      • ······
    • 但是一般情况下我们是无从下手的,不知道我们需要选择哪一项优化方案,可能由于我们随机选择了一个优化方案后经过大量实践发现该方案并不适合我们,从而浪费了时间与资源
    • 而机器学习诊断法可以帮助我们来排除掉上述方案中的至少一半以上的对于我们方案的错误方案

步骤

  • 当要训练一个数据集,我们习惯将该数据集先进行打乱,然后抽取其中的70%当作训练集,30%当作测试集
  • 如果该数据集已经打乱了,我们可以将该数据的前70%当作训练集,后30%当作测试集

训练集、验证集、测试集

  • 一般将打乱后的数据的60%用于训练集,20%用于验证集,20%用于测试集

为什么需要验证集?

  • 验证集的作用是当我们通过训练集训练好了参数值之后或者在训练集训练参数时,可以在验证集上调整超参数,当遇到在参数在验证集上出现过拟合或者其他奇怪的结果时,可以及时调整我们的超参数,不用到测试集再调整
  • 举个例子:训练集就好比是我们在学校老师每天布置的作业,我们通过老师布置的作业来进行学习,而验证集则是老师平常给我们的模拟考试试卷,我们通过老师给我们的模拟考试试卷来知道我们现在的学习水平,并且对我们考差的部分进行补全知识,而测试集则是期末考试,我们通过测试集来知道我们经过这一段时间的学习之后的能力达到什么程度

如何检测高偏差和高方差?

  • 偏差:欠拟合
  • 方差:过拟合
  • 当出现高偏差:训练误差与交叉验证误差相差不多
  • 当出现高方差:交叉验证误差远大与训练误差

学习曲线

当碰到高偏差后的举措

  • 如果碰到高偏差后,我们会发现我们的假设函数已经不能拟合我们的图像了,所以这个时候我们添加再多的样本,将于事无补,所以我们可以考虑其他的优化方案
  • 如图所示
  • image-20211110162037586

当遇到高方差后的举措

  • 当遇到高方差时,也就是过拟合,当我们的训练量很少的时候,我们的图像肯定拟合的很好,而当训练集逐步增多时,我们的训练误差肯定会越来越大,因为此时的图像越来越难拟合了,而我们的交叉验证集误差再训练集少的情况下,误差会很大,因为训练集太少了,泛化能力会很差,而随着训练集的增多,函数的泛化能力随之也会越来越好,那么交叉验证集的误差也会越来越小

  • 所以当遇到高方差时,通过增加训练集的个数,可以有效提高我们的泛化能力,如下图所示

  • image-20211110163522114

偏斜类

介绍

  • 假设当我们训练好了逻辑回归模型,然后将其放入测试集中测试,发现其拥有99%的正确率,也就相当于只有1%的误差,这样看起来这个数值已经非常不错了,但是如果测试集本身就只有0.5%的正类呢?那这样的话这个模型看上去就没有那么好了

  • 我们甚至可以直接用一个预测函数预测测试集内所有样本均为负类,这么简单的预测函数的正确率却能达到99.5%

  • def predict(X):
      return y = 0
    
  • 像上述所说的类就是偏斜类,当正例和反例之间的样本数相差较大时,我们把这种数据集叫偏斜类

引入几个名词

  • 真阳性
    • 预测值等于实际值且该值为正例
  • 真阴性
    • 预测值等于实际值且该值为反例
  • 假阳性
    • 预测值为正例实际值为反例
  • 假阴性
    • 预测值为反例实际值为正例

查准率

含义
  • 我们所预测的正例有多大可能真的是正例
  • 当查准率越高就代表我们所预测的值是正确的概率越高
公式
  • \(查准率=\frac{真阳性}{真阳性+假阳性}\)

召回率

含义
  • 在实际所有的正例当中,我们能正确预测的正例有多少
  • 当召回率越高也就代表我们预测的准确性越高,也就代表我们的模型是一个好的模型
公式
  • \(召回率=\frac{真阳性}{真阳性+假阴性}\)

查准率与召回率的平衡

  • 假如我们有多个算法,它们的查准率与召回率如下图所示
  • image-20211112213843000
  • 我们如何权衡查准率和召回率之间的数值从而衡量它们之间哪个算法更优秀呢?
  • 我们很自然的可以求他们的平均值从而得到哪个算法更好\(\frac{P+R}{2}\)
  • image-20211112215915925
  • 可以发现算法3的平均值最高,但是我们发现了一个问题,算法3的查准率非常低,这也就意味着我们所预测的值是正确的概率很低,所以实际上来看这个模型其实并不好,于是我们引用了下面的公式
  • \(F_1=2\frac{PR}{P+R}\)
  • 很明显,该公式会给较低的查准率以及召回率一个较高的权重值,也就是当我们的查准率或召回率有一方或者双方都特别小的话,那么整个值也会特别小,使用F公式的结果如下
  • image-20211113102724598
  • 可以看出算法1的值是最大的,因为该算法的查准率和召回率相较于其他两个算法都处于一个比较平衡的点

支持向量机

代价函数

  • 我们首先来看到逻辑回归的代价函数
  • \(J(\Theta)=-\frac{1}{m}[\sum\limits_{i=1}^my^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\theta_j^2\)
  • 我们知道,代价函数就是对所有样本的误差进行一个求平均值,通过最小化该误差的平均值从而使得假设函数最拟合于样本
  • 而逻辑回归中的y=1和y=0的代价值函数的图像如下图所示
  • image-20211114162706690
  • image-20211114162756446
  • 而SVM中的代价值函数则与逻辑回归的有些许不同,图像如下图所示
  • image-20211114162909064
  • 代价值函数图也就是上图中紫色线所画的,我们分别把它命名为\(Cost_1(z),Cost_0(z)\)
  • 从图片上我们可以直观的看出支持向量机的代价值函数相比于逻辑回归来说在计算上非常简单,在y=1时,大于1的部分代价值函数都为0,小于1时代价值函数是一条直线,y=0时也一样
  • 这样我们的支持向量机的代价函数就如下所示
  • \(J(\Theta)=\sum\limits_{i=1}^m[y^{(i)}Cost_1(\Theta^TX^{(i)})+(1-y^{(i)})Cost_0(\Theta^TX^{(i)})] + \frac{\lambda}{2}\theta_j^2\)
  • 可以看到,我们把前面的1/m给去掉了,当然你也可以加上它,因为1/m是一个常数,有无一个常数这个是不影响最小化参数theta的,举个栗子
    • 假设我们要最小化该公式:\((u-5)^2+1\)
    • 直接就能看出,当u=5时该式在最小点,此时的u就相当 于我们的参数
    • 而我们把该式修改成:\(5000(u-5)^2+1\)
    • 可以发现能使该公式得出最小值的u还是等于5
  • 我们再来看到我们的式子,我们把式子看作两个部分,代价函数主体看作A,正则项看作B
  • 那我们的代价函数就是\(A+\lambda B\),这里的lambda的意思就是给B一个权重,若lambda越高,则B的权重就越大
  • 我们换个方式,先将lambda去掉,在A前面乘个常数C,也就是\(CA+B\)
  • 只要我们的C缩到足够的小,就相当于把A的权重降低了,同样就相当于把B的权重提升了
  • 这个变动只是为了体现出我们更关心哪个位置的值而引起的改变

公式

  • 最终我们的SVM代价函数:\(J(\Theta)=C\sum\limits_{i=1}^m[y^{(i)}Cost_1(\Theta^TX^{(i)})+(1-y^{(i)})Cost_0(\Theta^TX^{(i)})] + \frac{1}{2}\theta_j^2\)

决策边界

朴素贝叶斯

介绍

  • 首先从名字开始解释,朴素贝叶斯中的“朴素”二字突出了这个算法的简易性。朴素贝叶斯的简易性表现该算法基于一个很朴素的假设:所有的变量都是相互独立的,假设各特征之间相互独立。
  • 啥是条件独立性假设呢,用公式来说就是如果\(P(A,B|C)=P(A|C)P(B|C)\),那么A,B之间就是在C这个条件下独立的,举个例子
    • A:熬夜
    • B:上课迟到
    • C:赖床
    • 在赖床的条件下想使得熬夜通过赖床来影响到上课迟到的概率为0,这就表示熬夜和上课迟到他俩之间是条件相互独立的,这就叫做A与B相互独立
  • 贝叶斯呢就是贝叶斯公式啦

条件概率

  • 条件概率:\(P(B|A)\)
  • 意思就是在A的条件下,B发生的概率

先验概率与后验概率

  • 假设有一个事件B,他是由事件A引起的,那么P(A)就是我们的先验概率

  • 即在事件B发生之前,我们对事件A的概率的一个最初的判断

  • 好,现在我们已知道事件B的概率,想知道事件A的概率,也就是条件概率P(A|B)

  • 即在事件B发生后,我们重新对A的概率进行评估,这就是后验概率

  • 举个例子

    • 我们出去买西瓜,在没摸到西瓜前,我们只看到了西瓜的外表,于是我们判断该瓜是不是好瓜的概率就是先验概率
    • 而当我们摸到西瓜后,我们通过敲击西瓜等一系列方法判断出了该瓜是好瓜或坏瓜后,我们再用我们已经得到的经验来判断该瓜是好瓜的概率,这就是后验概率

全概率公式与贝叶斯公式

  • 全概率全概率,说的就是一个事件全部的概率加在一起的公式,我们可以用一个模型来推导出来
  • image-20211118165002941
  • 这是一个两步式模型,也就是第二步是由第一步得来的,可以看到有很多条路径A1、A2、、、An可以到达B
  • 第一步我们取A1的概率就是P(A1),第二步我们取B的概率就是P(B|A1),也就是在A1完成的条件下B的概率
  • 那么从A1这条路径完成B的概率是不是就是P(A1)P(B|A1),那么第二条第三条路径也是同理

全概率公式

  • 于是\(P(B)=P\left(B \mid A_{1}\right) P\left(A_{1}\right)+P\left(B \mid A_{2}\right) P\left(A_{2}\right)+\ldots+P\left(B \mid A_{n}\right) P\left(A_{n}\right)\)
  • 将各个通往B的路径的概率全部加在一起,这就是全概率公式
  • 那贝叶斯公式是什么呢?贝叶斯是已知B,我们来求A1、A2或者An的概率,也就是用后验概率来推理先验概率,也就是求P(A1|B)或者P(A2|B)等等

贝叶斯公式

  • 于是\(P\left(A_{i} \mid B\right)=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{\sum_{j=1}^{n} P\left(A_{j}\right) P\left(B \mid A_{j}\right)}=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{P\left(A_{1}\right) P\left(B \mid A_{1}\right)+\ldots+P\left(A_{n}\right) P\left(B \mid A_{n}\right)}\)
  • 贝叶斯公式也就是用一条路径的概率去除于所有路径的概率,举个例子
    • 我们有十条道路回家,那么随机选到第一条道路的概率是不是就是十分之一,也就是用这一条路的概率去除上所有回家的道路
  • 最后我们将全概率公式与贝叶斯公式结合起来,就是:
    • \(P\left(A_{i} \mid B\right)=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{P(B)}\)

概率因子(可能性函数)

  • 我们现在已经知道了贝叶斯公式:\(P\left(A_{i} \mid B\right)=P\left(A_{i}\right)\frac{ P\left(B \mid A_{i}\right)}{P(B)}\)

  • 我们将\(\frac{ P\left(B \mid A_{i}\right)}{P(B)}\)部分叫做概率因子

  • 于是我们可以得到如下几个推断:

    • 概率因子大于1时:意味着先验概率被增强,则事件A发生的可能性就会更大,也就是B有助于提高事件A的发生概率
    • 概率因子等于1时:意味着事件B对事件A发生的概率没有任何帮助
    • 概率因子小于1时:意味着先验概率被削弱,则事件A发生的可能性就会更小,也就是B减弱了提高事件A的发生概率

举个例子

  • 我们有一个判断程序员是不是大佬的训练集,其中有十个样本,每个样本有三个特征

  • 特征的选取范围如下

    • 数学:好、不好
    • 英语:好、不好
    • 代码能力:强、一般、弱
  • 数学 英语 代码能力 是否大佬
    不好 一般 不是
    不好 不好 不是
    一般
    不好
    不好 一般 不是
    不好 不好 不是
    不好
    不好 不是
  • 现在给出一个特征为(数学好,英语不好,代码能力弱)样本,根据这个训练集,我们来判断这个样本是否是大佬

  • 我们掏出贝叶斯公式:\(P\left(A_{i} \mid B\right)=P\left(A_{i}\right)\frac{ P\left(B \mid A_{i}\right)}{P(B)}\),将其转换一下:\(P\left(类别_{i} \mid 特征\right)=P\left(类别_{i}\right)\frac{ P\left(特征 \mid 类别_{i}\right)}{P(特征)}\)

  • 根据这个公式,我们就可以计算是不是大佬的概率了

  • 于是,是大佬的概率为:

    • \(P\left(是 \mid 数学好\ 英语不好\ 代码弱\right)=P\left(是\right)\frac{ P\left(数学好\ 英语不好\ 代码弱 \mid 是\right)}{P(数学好\ 英语不好\ 代码弱)}=P\left(是\right)\frac{ P\left(数学好\mid 是\right)P\left(英语不好\mid 是\right)P\left(代码弱\mid 是\right)}{P(数学好\ 英语不好\ 代码弱)}\)
  • 不是大佬的概率为:

    • \(P\left(不是 \mid 数学好\ 英语不好\ 代码弱\right)=P\left(不是\right)\frac{ P\left(数学好\ 英语不好\ 代码弱 \mid 不是\right)}{P(数学好\ 英不好\ 代码弱)}=P\left(不是\right)\frac{ P\left(数学好\mid 不是\right)P\left(英语不好\mid 不是\right)P\left(代码弱\mid 不是\right)}{P(数学好\ 英语不好\ 代码弱)}\)
  • 其中的\(P(数学好\ 英语不好\ 代码弱)\)为全概率公式,等价于:

    • \(P(是)P\left(数学好\mid 是\right)P\left(英语不好\mid 是\right)P\left(代码弱\mid 是\right)+P(不是)P\left(数学好\mid 不是\right)P\left(英语不好\mid 不是\right)P\left(代码弱\mid 不是\right)\)
  • 然后我们分别计算一下上面的概率,对比一下就知道该样本是不是大佬了

    • \(P(是)=\frac{1}{2},P(不是)=\frac{1}{2}\)
    • \(P(数学好|是)=\frac{4}{5},P(英语不好|是)=\frac{1}{5},P(代码弱|是)=\frac{1}{5}\)
    • \(P(数学好|不是)=\frac{1}{5},P(英语不好|不是)=\frac{3}{5},P(代码弱|不是)=\frac{2}{5}\)
  • 于是\(P\left(是 \mid 数学好\ 英语不好\ 代码弱\right)=\frac{\frac{1}{2}\frac{4}{5}\frac{1}{5}\frac{1}{5}}{\frac{1}{2}\frac{4}{5}\frac{1}{5}\frac{1}{5}+\frac{1}{2}\frac{1}{5}\frac{3}{5}\frac{2}{5}}=0.4\)

  • 同理可得\(P\left(不是 \mid 数学好\ 英语不好\ 代码弱\right)=0.6\)

  • 因为0.6>0.4,所以朴素贝叶斯算法预测该人不是大佬

朴素贝叶斯模型

多项式模型

  • 多项式模型的特点为重复的词视其出现了多次
  • 例如:
    • \(P(数学,数学,英语,英语,代码|是)=P(数学|是)P(数学|是)P(英语|是)P(英语|是)P(代码|是)=P^2(数学|是)P^2(英语|是)P(代码|是)\)
    • 可以看出多项式模型的思路和我们思维是一样的,在上述例子当中,“数学”,“英语”出现了两次,所以利用条件独立性,自然需要乘上两次

伯努利模型

  • 伯努利模型与多项式模型刚好相反,它则视重复出现的词为一次
  • 例如:
    • \(P(数学,数学,英语,英语,代码|是)=P(数学|是)P(数学|是)P(英语|是)P(英语|是)P(代码|是)=P(数学|是)P(英语|是)P(代码|是)\)
    • 伯努利则是无论出现了几次,均算其只出现了一次

高斯模型

  • 高斯模型就是服从正态分布的朴素贝叶斯
  • 正态分布公式:\(P\left(X_{j}=x_{j} \mid Y=C_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{k}^{2}}} \exp \left(-\frac{\left(x_{j}-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right)\)
  • 其中\(C_k\)是第k个类别,\(x_j\)是第j个样本,\(\mu_k\)\(\sigma_k\)是训练集的均值和方差

平滑处理

  • 什么是平滑处理,我们用一个例子来说明一下平滑处理
  • 还是拿上面那个例子,假设我们给数学特征的选择范围变成:好、一般、不好
  • 而上面那个表格只是训练集,相当于数学一般的样本可能在测试集当中,碰巧没有加进来
  • 且此时我们要预测的样本为(数学一般,英语好,代码能力强)
  • 这个时候我们再用贝叶斯公式来计算是大佬的概率:
    • \(P\left(是 \mid 数学一般\ 英语好\ 代码强\right)=P\left(是\right)\frac{ P\left(数学一般\ 英语好\ 代码强 \mid 是\right)}{P(数学一般\ 英语好\ 代码强)}=P\left(是\right)\frac{ P\left(数学一般\mid 是\right)P\left(英语好\mid 是\right)P\left(代码强\mid 是\right)}{P(数学一般\ 英语好\ 代码强)}\)
  • 当我们在训练集中计算\(P(数学一般|是)\)这个概率的时候发现是为0的,因为我们在训练集中根本找不到数学一般这个样本,所以其概率自然为0,这样一算,由于它是0,所以整个乘积也就为0了
    • 于是\(P\left(是 \mid 数学一般\ 英语好\ 代码强\right)\)的概率则就变成0了,只是因为训练集没有该样本不代表数据集就没有,这明显是不对的,所以此时我们要引入平滑处理这个概念
  • 引入平滑处理后公式为:\(P\left(A_{i} \mid B\right)=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)+\alpha}{P(B)+n\alpha}\)
  • 其中的alpha就是平滑值,当alpha=1时为拉普拉斯平滑,n是特征的个数
  • 一般朴素贝叶斯所采用的都是拉普拉斯平滑
  • 经过平滑处理后,即使我们的训练集当中没有要测试样本的特征,则最后算出来的值也依然不为0
  • 此时我们再预测刚刚所说的样本就能得出结果了,计算如下
    • \(P(是)=\frac{1}{2},P(数学一般|是)=\frac{1}{8},P(英语好|是)=\frac{5}{8},P(代码强|是)=\frac{4}{8}=\frac{1}{2}\)
    • \(P(不是)=\frac{1}{2},P(数学一般|不是)=\frac{1}{8},P(英语好|不是)=\frac{3}{8},P(代码强|不是)=\frac{2}{8}=\frac{1}{4}\)
    • \(P\left(是 \mid 数学一般\ 英语好\ 代码强\right)=\frac{\frac{1}{2}\frac{1}{8}\frac{5}{8}\frac{1}{2}}{\frac{1}{2}\frac{1}{8}\frac{5}{8}\frac{1}{2}+\frac{1}{2}\frac{1}{8}\frac{3}{8}\frac{1}{4}}=\frac{10}{13}\approx0.77\)
    • 而不是大佬的概率同上计算
    • \(P\left(不是 \mid 数学一般\ 英语好\ 代码强\right)=\frac{\frac{1}{2}\frac{1}{8}\frac{3}{8}\frac{1}{4}}{\frac{1}{2}\frac{1}{8}\frac{5}{8}\frac{1}{2}+\frac{1}{2}\frac{1}{8}\frac{3}{8}\frac{1}{4}}=\frac{3}{13}\approx0.23\)
  • 因为0.77 > 0.23,所以该样本是大佬

无监督学习

含义

  • 给算法一个数据集,但是不给算法任何其他的信息,例如对错等,让算法自行分组

聚类

  • 目的是自动从给定的数据集中自动分析其特征,并将其自动的分成一个个的簇

K-均值算法

介绍

  • 我们先想好要将整个数据集分为几个簇,若为K个簇,则分配K个聚类中心,将每个聚类中心随机分配一个数值,每个聚类中心的每次迭代都将比较所有样本和自己的距离,将离自己近的样本划分为自己的类别,然后计算自己类别下的所有样本的均值赋值给自己,再更新位置,最终碰到更新不动了,则划分完成,如下列步骤所示

  • image-20211116165355000
  • image-20211116165601227
  • image-20211116165819482
  • image-20211116165918374
  • image-20211116165955366
  • image-20211116170018006
  • 从上示图例可以清楚的看见两个聚类中心所移动的走向及其步骤的

大体步骤

  • 输入:
    • K个值(代表想要分成的簇的个数)
    • 训练集
  • 根据输入的K值随机确定\(\mu_1,\mu_2,...,\mu_K\in\mathbb{R}^n\)个簇
  • 递归(当聚类中心停止移动时跳出循环)
    • for i in range(1, m) m代表样本的个数
      • 计算出每个样本离每个聚类中心之间的距离,然后将其赋值给\(c^{(i)}\)
      • 例如:\(c^{(1)}=2\) 的意思为第一个样本离2号聚类中心最近,属于2号聚类中心
      • 计算样本与聚类中心的距离公式:\(\left \| x^{(i)}-\mu_k \right \| ^2\)
      • 该式可以不加平方,效果也是一样的,但是由于大家的公约都是加平方,所以我们这也加上平方
    • for k in range(1, K)
      • 计算每个聚类中心名下的所有样本的均值赋值给该聚类中心,移动聚类中心的位置

一个问题

  • 若划分完簇后,发现有聚类中心并没有任何样本怎么办,有两个方法
    • 删除该聚类中心(常见做法)
    • 重新随机聚类中心的数值位置,再进行迭代计算

优化目标函数(代价函数)

  • 先定义几个符号
    • \(c^{(i)}\) :第i个样本所属的簇
    • \(\mu_k\) :第k个簇
    • \(\mu_{c^{(i)}}\) :第i个样本所属的簇的聚类中心
      • 例如,当\(c^{(1)}=2\) 时代表第一个样本属于2号簇,而\(\mu_{c^{(1)}}=\mu_2\)
  • 优化目标函数:\(J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K)=\frac{1}{m}\sum\limits_{i=1}^{m}\left\|x^{(i)}-\mu_{c^{(i)}}\right\|^2\)
  • 不难看出,sum后面的就是我们的距离公式,该函数也就是要寻找出能使得该函数最小化的\(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K\)
  • 该函数也叫失真代价函数|K均值算法的失真

初始化聚类中心

  • 在初始化聚类中心之前我们首先需要确定我们的K值,一般情况下,K<m
  • 因为你想想,m是样本个数,K是我们想要将该样本分类的个数,所以K<m
  • 如何随机选择我们的聚类中心呢?
  • 我们可以随机挑选K个样本,然后使我们的K个聚类中心等于这K个样本
  • 也就如图所示
  • image-20211116211920690
  • 可以看到我们随机将我们的两个聚类中心放在了我们的两个样本上
  • 但是我们可以发现一个问题,上图中是刚好将两个聚类中心随机到了两坨样本上
  • 但是如果运气不好的话,就有可能出现如下情况
  • image-20211116212500954
  • 可以看到两个聚类中心在一坨样本当中,这样经过K均值算出的结果肯定和上图是不一样的
  • 那么我们就陷入了局部最优的情况,那么我们怎样得出全局最优呢?

局部最优及全局最优

  • 我们再来举个栗子
  • image-20211116212623051
  • 当我们有一个这样子的样本图,我们假设要将其分成3个簇
  • 那么我们可能得出以下的三种结果
    • 全局最优
      • image-20211116212722736
    • 局部最优
      • image-20211116212959091
  • 这个主要的原因就在于初始化聚类中心不同的点所造成的
  • 所以我们可以尝试多次初始化聚类中心,也就是运行多次K均值算法
  • 一般运行K均值算法的次数为50-1000次

多次运行K均值步骤

  • For i in range(1, 100) 运行100次K均值算法
    1. 随机初始化K均值聚类中心
    2. 运行K均值,获取\(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K\)
    3. 计算代价函数J
  • 经过上述运行后,我们可以得出100种分类该数据集的方法
  • 我们最后从这100种方法中选择出代价函数J最小的那个方法
PS
  • 一般情况下,当我们要分出的簇的个数较小,在10个以下的情况,我们运行多次初始化会有比较明显的效果,而如果K的值较大,例如100个以上,那么可能在第一次随机初始化的时候效果就比较好了,所以在给后续进行随机初始化的时候效果可能不会有很大的改进
  • 一般情况下,当我们要分出的簇的个数较小,在10个以下的情况,我们运行多次初始化会有比较明显的效果,而如果k的值较大,例如100个以上,那么可能在第一次随机初始化的时候效果就比较好了,所以在给后续进行随机初始化的时候效果可能不会有很大的改进,