前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法研习:感知器算法原理解读

算法研习:感知器算法原理解读

作者头像
深度学习与Python
发布2019-06-25 19:59:00
2.8K0
发布2019-06-25 19:59:00
举报
文章被收录于专栏:深度学习与python

喜欢就点关注吧!

感知器算法是神经网络最早的形式,随着神经网络的不断发展与深化,感知器算法现在已经不经常使用了,但其原理对我们理解神经网络是非常有帮助的,而且感知器算法原理比较简单,理解起来难度不大。下面我们将从三个方面来解读一下感知器算法。

1.什么是Perceptron?

2.目标优化

3.在Python中实现

什么是Perceptron?

Perceptron由Frank Rosenblatt开发,并于1962年出版的“神经动力学原理:感知器和脑机制理论”一文中所提出。当时,Rosenblatt的文章被Marvin Minksy和Seymour Papert反对,认为神经网络有缺陷,只能解决线性分类问题。 然而,这种限制仅发生在单层神经网络中。Perceptron可用于解决二分类问题。 其算法的形式可以写成:

其中非线性激活函数表达式为:

像逻辑回归之类的算法是针对事件发生概率进行分诶,但对于Perceptron,使用目标值t = + 1作为第一类并且t = -1作为第二类更方便。 因此感知器算法没有分类概率,也不能处理K> 2分类问题。 另一个限制是算法只能处理固定基函数的线性组合。

目标优化

根据上面的两个公式,如果事件被正确分类则:

反之如果分类错误则

因此Perceptron的目标函数可写为:

M表示错误分类的事件数。通过取偏导数,我们可以得到损失函数的梯度:

我们可以初始化参数w和b ,然后随机选择错误分类事件,并使用随机梯度下降迭代更新参数w和b, 直到目标函数损失降到最低 :

在公式中,学习率a的范围从0到1。例如我们有3条记录, Y1 =(3,3),Y2 =(4,3),Y3 =(1,1) 。 Y1和Y2标记为+1, Y3标记为-1。 给定初始参数均为0。在第一轮中,通过应用前两个公式, Y3等于0,因此Y3被错误分类。 假设学习率等于1,通过应用上面显示的梯度下降,我们可以得到:

然后Perceptron分类器可以写成:

经过一轮梯度下降迭代的结果为下表所示:

上表显示了Perceptron经过循环遍历所有训练数据的梯度下降过程。 如果记录被正确分类,则权重向量w和b保持不变; 否则,当y = 1时,我们将向量x添加到当前权重向量上,当y = -1时,我们将当前权重向量w减去向量x 。 请注意最后3列是预测值,错误分类记录以红色突出显示。 如果我们迭代进行梯度下降,在第7次迭代中,所有事件都被正确标记。 即算法将停止。

在Python中实现

首先我们导入相应的函数库以及加载鸢尾花数据集

代码语言:javascript
复制
  from sklearn import datasets 
  import numpy as np 
  import pandas as pd 
  import matplotlib.pyplot as plt 
  import matplotlib.lines as mlines 

  np.random.seed(10) 

  # Load data 
  iris=datasets.load_iris() 
  X = iris.data[0:99,:2] 
  y = iris.target[0:99] 

可视化数据

代码语言:javascript
复制
  # Plot figure 
  plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0') 
  plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1') 
  plt.xlabel('sepal length') 
  plt.ylabel('sepal width') 
  plt.legend() 
代码语言:javascript
复制
  # Update y into -1 and 1 
  y=np.array([1 if i==1 else -1 for i in y]) 

使用梯度下降优化损失函数

代码语言:javascript
复制
  ################################# 
  # Gradient Descent 

  # Initialize parameters 
  w=np.ones((X.shape[1],1)); 
  b=1; 
  learning_rate=0.1; 
  Round=0; 
  All_Correct=False; 

  # Start Gradient Descent 
  while not All_Correct: 
  misclassified_count=0 
  for i in range(X.shape[0]): 
  XX=X[i,] 
  yy=y[i] 
  if yy * (np.dot(wT,XX.T)+b)<0: 
      w+=learning_rate * np.dot(XX,yy).reshape(2,1) 
      b+=learning_rate * yy 

      misclassified_count +=1 

  if misclassified_count==0: 
       All_Correct=True 
  else: 
       All_Correct=False 
       Round += 1 
       print(Round) 

  print(w) 
  print(b) 

使用stocastic梯度下降后,我们得到w =(7.9,-10.07)和b = -12.39。

代码语言:javascript
复制
  x_points = np.linspace(4,7,10) 
  y_ = -(w[0]*x_points + b)/w[1] 
  plt.plot(x_points, y_) 

  plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0') 
  plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1') 
  plt.xlabel('sepal length') 
  plt.ylabel('sepal width') 
  plt.legend() 

分类结果

参考

https://towardsdatascience.com/an-introduction-to-perceptron-algorithm-40f2ab4e2099

深度学习与Python,专注于深度学习、机器学习前沿知识与资讯

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深度学习与python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档