机器学习笔记(二)—— 线性单元 梯度下降 logistic回归


参考链接:
零基础入门深度学习(2) - 线性单元和梯度下降

1 线性单元

1.1 概念:

感知器有一个问题,当面对的数据集不是线性可分的时候,『感知器规则』可能无法收敛,这意味着我们永远也无法完成一个感知器的训练。为了解决这个问题,我们使用一个可导的线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集时,会收敛到一个最佳的近似上。
为了简单起见,我们可以设置线性单元的激活函数为:
f ( x ) = x f(x)=x f(x)=x

这样的线性单元如下图所示
在这里插入图片描述
这样替换了原来的激活函数(阶跃函数)之后,线性单元将返回一个实数值而不是0,1分类。因此线性单元用来解决回归问题而不是分类问题。

1.2 线性单元的模型

模型是什么: 根据输入预测输出的算法。例如:
y = h ( x ) = w ∗ x + b y=h(x)=w*x+b y=h(x)=wx+b
函数 h(x) 叫做假设,而w、b是它的参数。如果预测工资的话,将“工作年限”、“行业”、“职级”等都称为特征。如果有人工作了5年,行业是IT,职级是3级,那么可以用这样的特征向量描述:
x = ( 5 , I T , 3 ) x = (5, IT, 3) x=(5,IT,3)
这样输入x就变成了向量。此时一个参数w也就不够用了,应该使用三个w:
y = h ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + b y=h(x)=w_1*x_1+w_2*x_2+w_3*x_3+b y=h(x)=w1x1+w2x2+w3x3+b
为了书写和计算方便,我们可以令w_0等于b,同时令w_0对应于特征x_0,且x_0恒等于1。
y = h ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + w 0 ∗ x 0 y=h(x)=w_1*x_1+w_2*x_2+w_3*x_3+w_0*x_0 y=h(x)=w1x1+w2x2+w3x3+w0x0
写成向量形式:

y = h ( x ) = w T x y =h(x)= w^T x y=h(x)=wTx

长成这种样子模型就叫做线性模型,因为输出就是输入特征的线性组合。

1.3 线性单元的目标函数

假设现在只考虑监督学习
在监督学习下,对于一个样本,我们知道它的特征x,以及标记y。同时,我们还可以根据模型h(x)计算得到输出 y ˉ \bar{y} yˉ 注意这里面我们用y表示训练样本里面的标记,也就是实际值;用带上划线的 y ˉ \bar{y} yˉ 表示模型计算的出来的预测值。我们当然希望模型计算出来的和越接近越好。
在这里插入图片描述

2 梯度下降优化算法

2.1 梯度:

在这里插入图片描述
梯度的意义:是一个向量,它指向函数值上升最快的方向,,显然,梯度的反方向就是函数值下降最快的方向。
你可能要问了,为啥每次修改 x 的值,都能往函数最小值那个方向前进呢?这里的奥秘在于,我们每次都是向函数 y = f ( x ) y=f(x) y=f(x)的梯度的相反方向来修改 x 。
我们每次沿着梯度相反方向去修改 x 的值,当然就能走到函数的最小值附近。之所以是最小值附近而不是最小值那个点,是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。
梯度下降算法的公式:
x n e w = x o l d − η ∇ f ( x ) \mathrm{x}_{new}=\mathrm{x}_{old}-\eta\nabla{f(x)} xnew=xoldηf(x)
其中, ∇ \nabla 是梯度算子, ∇ f ( x ) \nabla{f(x)} f(x)就是指的 f(x) 梯度。 η \eta η是步长,也称作学习速率。
尝试这样理解: ∇ f ( x ) \nabla{f(x)} f(x)是一个向量,表明调整的方向,相当于 δ x \delta{x} δx η \eta η是调整 δ x \delta{x} δx 的参数。
在这里插入图片描述
在这里插入图片描述

2.2 随机梯度下降算法(Stochastic Gradient Descent, SGD)

在这里插入图片描述


3 实现线性单元

在这里插入图片描述
除了激活函数 f f f 不同之外,两者的模型和训练规则是一样的.
代码参考:
零基础入门深度学习(1) - 感知器
修改的部分:

from perceptron import Perceptron
#定义激活函数f
f = lambda x: x
class LinearUnit(Perceptron):
    def __init__(self, input_num):
        '''初始化线性单元,设置输入参数的个数'''
        Perceptron.__init__(self, input_num, f)

创建简单的数据进行测试:

def get_training_dataset():
    '''
    捏造5个人的收入数据
    '''
    # 构建训练数据
    # 输入向量列表,每一项是工作年限
    input_vecs = [[5], [3], [8], [1.4], [10.1]]
    # 期望的输出列表,月薪,注意要与输入一一对应
    labels = [5500, 2300, 7600, 1800, 11400]
    return input_vecs, labels    
def train_linear_unit():
    '''
    使用数据训练线性单元
    '''
    # 创建感知器,输入参数的特征数为1(工作年限)
    lu = LinearUnit(1)
    # 训练,迭代10轮, 学习速率为0.01
    input_vecs, labels = get_training_dataset()
    lu.train(input_vecs, labels, 10, 0.01)
    #返回训练好的线性单元
    return lu
if __name__ == '__main__': 
    '''训练线性单元'''
    linear_unit = train_linear_unit()
    # 打印训练获得的权重
    print linear_unit
    # 测试
    print 'Work 3.4 years, monthly salary = %.2f' % linear_unit.predict([3.4])
    print 'Work 15 years, monthly salary = %.2f' % linear_unit.predict([15])
    print 'Work 1.5 years, monthly salary = %.2f' % linear_unit.predict([1.5])
    print 'Work 6.3 years, monthly salary = %.2f' % linear_unit.predict([6.3])

4 Logistic回归

4.1 拟合与回归:

假设我们现有一些数据点,我们用一条直线对这些点进行拟合,这个拟合的过程就称作回归。利用logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。
主要是二分类预测,也即是对于0~1之间的概率值,当概率大于0.5预测为1,小于0.5预测为0。因此Logistic回归也被看成是一种概率估计。

4.2 sigmoid函数:

该函数的曲线类似于一个s型,看起来像是阶跃函数。
在这里插入图片描述
于是,为了实现logistic分类器,我们可以在每个特征上都乘以一个回归系数,然后所有的结果值进行累加,将这个总和作为输入,输入到sigmoid函数中,从而得到一个大小为0~1之间的值,当该值大于0.5归类为1,否则归类为0,这样就完成了二分类的任务。所以logistic回归可以看成是一种概率估计。

4.3 基于最优化方法的最佳回归系数确定:

sigmoid函数的输入记为z,即 z = w 0 x 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n z=w_0x_0+w_1x_1+w_2x_2+...+w_nx_n z=w0x0+w1x1+w2x2+...+wnxn,如果用向量表示即为 z = w T x z=w^Tx z=wTx,它表示将这两个数值向量对应元素相乘然后累加起来。其中,向量x是分类器的输入数据,w即为我们要拟合的最佳参数。也就是说,logistic回归最重要的是要找到最佳的拟合参数w

4.3.1 梯度上升法

梯度上升法(等同于我们熟知的梯度下降法,前者是寻找最大值,后者寻找最小值),它的基本思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向搜寻。如果函数为f,梯度记为Da为步长,那么梯度上升法的迭代公式为:w:= w+a*Dwf(w)。该公式停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。我们熟知的梯度下降法迭代公式为:w:w-a*Dwf(w)

5 小结

事实上,一个机器学习算法其实只有两部分

  • 模型: 从输入特征x预测输出y的那个函数h(x)
  • 目标函数:目标函数取最小(最大)值时所对应的参数值,就是模型的参数的最优值。很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值。

接下来,你会用优化算法去求取目标函数的最小(最大)值。[随机]梯度{下降|上升}算法就是一个优化算法。针对同一个目标函数,不同的优化算法会推导出不同的训练规则。

其实在机器学习中,算法往往并不是关键,真正的关键之处在于选取特征。而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值