机器学习之Perceptron

本次实验到两个重要概念:感知器和随机梯度下降
感知器:
在人工智能领域,有一个方法叫机器学习。在机器学习这个方法里,有一类算法叫神经网络。神经网络的组成单元是神经元。神经元也叫做感知器。感知器算法也是非常简单的,属于入门型。
下图是一个感知器
在这里插入图片描述
可以看到一个感知器由三部分组成
输入权值 一个感知器可以接收多个输入,每个输入上有一个权值,此外还有一个偏置项,就是上图中的。
激活函数 感知器的激活函数可以有很多选择,比如我们可以选择下面这个阶跃函数来作为激活函数:
在这里插入图片描述
输出 感知的输入由下面这个的公式计算

在这里插入图片描述
随机梯度下降:
由于批量梯度下降法在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢。随机梯度下降法(Stochastic Gradient Descent,简称SGD)正是为了解决批量梯度下降法这一弊端而提出的。
将上能量函数写为如下形式:
在这里插入图片描述
利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ:
在这里插入图片描述
具体的伪代码形式为:
  1. Randomly shuffle dataset
  2. repeat{
    for i=1, … , m
{
      (for j=0, … , n)
    }
  }
  随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将θ迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
  优点:训练速度快;
  缺点:准确度下降,并不是全局最优;不易于并行实现。
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:

在这里插入图片描述

接下来我们进入编程环节。
第一步是写一个函数能够做出预测.
在随机梯度下降中的候选权重值的评估中以及在模型完成之后开始新数据进行预测时都会用到这个函数。
下面是一个名为predict()的函数,它预测给定一组权重的行的输出值。
在这里插入图片描述
给出数据和权重进行测试
在这里插入图片描述
有两个输入值(X1和X2)和三个权重值(bias,w1和w2)。 我们为此问题建模的激活方程是:
activation = (w1 * X1) + (w2 * X2) + bias
或者我们也可以选择具体的权重值
activation = (0.206 * X1) + (-0.234 * X2) + -0.1
运行后我们得到与预期输出(y)值匹配的预测。

在这里插入图片描述

第二步是训练网络的权重
我们可以使用随机梯度下降来估计训练数据的权重值。
随机梯度下降需要两个参数:
learning rate:用于限制每次更新时每个权重的校正量。
epoch:更新权重时运行训练数据的次数。
我们需要在函数中执行3个循环:
循环每个epoch。
循环遍历训练数据中的每一行以获得一个epoch。
循环遍历每个权重并将其更新为一个epoch中的一行。
我们将更新训练数据中每一行的每个权重,每个epoch。
权重会根据模型产生的误差进行更新。预期输出值与用候选权重进行的预测之间的差异就是我们计算的误差。
每个输入属性都有一个权重,这些权重以一致的方式更新,例如:
w(t+1)= w(t) + learning_rate * (expected(t) - predicted(t)) * x(t)
偏差以类似的方式进行更新
bias(t+1) = bias(t) + learning_rate * (expected(t) - predicted(t))
有了上面提到的前缀知识后,下面的函数就可以写出来了,主要功能就是使用随机梯度下降计算权重
在这里插入图片描述
在代码中我们还可以看到,我们还打印每个epoch的平方误差之和,这样我们就可以在每个外循环打印出更新的值。
同样给出数据进行测试

在这里插入图片描述
在代码中我们使用0.1的learning rate并且仅将模型训练5个epoch.
在这里插入图片描述
运行该示例在每个epoch打印一条消息,其中包含该epoch和最终权重集的总和平方误差。

在这里插入图片描述

感知器算法非常简单,就是上述的两步.接下来我们使用感知器算法解决实际的问题.数据集名为soanr.all-data.csv
这是一个描述声纳从各个角度返回的数据的数据集。 60个输入变量是不同角度的回报强度。这是一个二元分类问题,需要一个模型来区分声呐探测到的是岩石还是金属圆柱。
数据集中所有变量都是连续的,通常在0到1的范围内。因此我们不必对输入数据进行标准化的工作。
部分数据如下

在这里插入图片描述
首先加载数据集,并进行预处理。
这是通过函数load_csv(),str_column_to_float()和str_column_to_int()来实现的

在这里插入图片描述
然后我们使用k-fold交叉验证来估计学习模型的性能。
在这里插入图片描述
我们将构建和评估k模型并计算准确率。
在这里插入图片描述
使用交叉验证进行评估
在这里插入图片描述
根据权重做出预测
在这里插入图片描述

使用随机梯度下降估测感知器的权重
在这里插入图片描述
随机梯度下降的感知器算法
在这里插入图片描述
加载数据集并调用上述函数进行预测, k值为3用于交叉验证,设置learning rate为0.1和500个epoch。
在这里插入图片描述
完整代码在perceptron.py
运行后结果如图
在这里插入图片描述
运行后打印出3折交叉验证折叠中每折的分数,然后打印平均分类精度。
可以看到准确度约为72%。
参考:
1.<机器学习实战>
2.<机器学习>(周志华的西瓜书)
3. https://machinelearningmastery.com/category/algorithms-from-scratch/
4. http://www.cnblogs.com/maybe2030/p/5089753.html#_label1
5. https://zh.wikipedia.org/wiki/%E6%84%9F%E7%9F%A5%E5%99%A8
6. https://www.zybuluo.com/hanbingtao/note/433855

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值