前叙

读前简介

机器学习的流派很多,现在比较流行的便是联结学派,其计算的重点在于权重更新,而其它学派比如贝叶斯学派,基于统计学,进化学派则注重结构学习.

本篇博客以线性感知器为基础,将会对神经网络与一些机器学习算法进行介绍,如果你只想简单的了解,那么可以浏览一遍即可,当然你也可以花费些时间读这篇文章,那么你也可以受益许多.

神经网络与联结学派

神经网络就是联结学派的”作品”,从最基本的线性感知器到现在的深度学习都隶属于联结学派,其实现人工智能的思想在于利用计算机模拟生物神经网络,而计算过程最后则转化为求最优解问题,计算过程的核心则在于迭代与权值更新,主要陷阱为局部最优解陷阱等等.

而联结学派的核心观点即为:智能的本质是连接机制,神经网络是一个由大量简单的处理单元组成的高度复杂的大规模非线性自适应系统.联结主义模拟人脑智能行为四个层面为: 
a.物理结构; 
b.计算模拟 
c.存储与操作 
d.训练

神经网络图解:

Rosonblatt感知器图解

基本计算过程与权值修正

基本计算过程:

  1. 数据输入
  2. 计算诱导局部域,计算公式如下 

    最后求出的超平面: 
  3. 诱导局部域输入输出函数(硬限幅函数sgn()),并输出最后结果
# 硬限幅函数 python语言
def sgn(v):if v> 0:return 1else:return -1

权值更新(图片来自他处):

代码

# 单样本感知器算法
import numpy as np
b = 1 # 偏置
# 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败
a = 0.3 # 学习率
x = np.array([[1,1,3],[1,2,5],[1,1,8],[1,2,15],[1,3,7],[1,4,29]])
d = np.array([1,1,-1,-1,1,-1])
w = np.array([b,0,0])
def sgn(v):if v> 0:return 1else:return -1
def comy(myw,myx):return  sgn(np.dot(myw.T,myx))
def neww(oldw,myd,myx,a):print("comy:",comy(oldw,myx))return oldw+a*(myd - comy(oldw,myx))*myx
i = 0
for xn in x:print("wn:",xn)w =neww(w,d[i],xn,a)i+=1print("w:",w)
for xn in x:print("%d or %d => %d"%(xn[1],xn[2],comy(w,xn)))
test = np.array([b,9,19])
print("%d or %d => %d"%(test[1],test[2],comy(w,test)))
test = np.array([b,9,64])
print("%d or %d => %d"%(test[1],test[2],comy(w,test)))

梯度下降与批量修正算法

公式如下(图片来自书籍):

具体算法过程如下: 
1) 初始化权值.学习率,以及期望误差率 
2) 读取所有样本数据 
3) 依次对样本进行训练.更新权值,其更新策略如(8-1)所示 
4) 检查误差率是否小于指定误差率,或者训练次数已达到,否则转到第二步执行

code

import numpy as np
b = 1 # 偏置
# 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败
a = 0.5 # 学习率
x = np.array([[1,1,3],[1,2,5],[1,1,8],[1,2,15]])
d = np.array([1,1,-1,-1])
w = np.array([b,0,0])
wucha = 0
ddcount = 50
def sgn(v):if v> 0:return 1else:return -1
def comy(myw,myx):return  sgn(np.dot(myw.T,myx))
# 权值更新策略
def tiduxz(myw,myx,mya):i = 0sum_x =np.array([0,0,0])for xn in myx:if comy(myw,xn)!=d[i]:sum_x+=d[i]*xni+=1return mya*sum_x
i = 0
while True:tdxz = tiduxz(w,x,a)print('tdxz:',tdxz)w = w+tdxzprint("w:",w)i = i+1if abs(tdxz.sum())<=wucha or i >= ddcount:break
test = np.array([1,9,19])
print("%d or %d => %d"%(test[1],test[2],comy(w,test)))
test = np.array([1,3,22])
print("%d or %d => %d"%(test[1],test[2],comy(w,test)))
print()

Rosonblatt感知器 优化

LMS(最小均方算法:Least-Mean-Square)

均方误差MSE:参数估计中均方误差是指参数估计值与参数真值之差平方的期望值,即样本预测输出值与实际输出值之差平方的期望值.

而MSE的策略则是使MSE最小, 
代价函数: 
 
在之前的例子中继续使用批量修正算法,并在其误差信号基础上计算梯度向量: 
 
权值生成方案:

# 代码来自<机器学习实践指南2>
import numpy as np
# LMS算法实现逻辑或运算
b = 1 # 偏置
# 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败
a = 0.1 # 学习率
x = np.array([[1,1,1],[1,1,0],[1,0,1],[1,0,0]])
d = np.array([1,1,1,0])
w = np.array([b,0,0])
expect_e=0.005
maxtrycount=20
def sgn(v):if v> 0:return 1else:return 0
def get_v(myw,myx):return sgn(np.dot(myw.T,myx))
def neww(oldw,myd,myx,a):mye = get_e(oldw,myx,myd)return (oldw+a*mye*myx,mye)
def get_e(myw,myx,myd):return myd-get_v(myw,myx) # 实际输出值 - 样本预测输出值
mycount = 0
while True:mye = 0i = 0for xn in x:w,e = neww(w, d[i], xn, a)i+=1mye+=pow(e,2) # 在 ANN 领域 MSE(均方误差)是指样本预测输出至于实际输出值之差平方的期望mye/=float(i)mycount+=1print(u"第 %d 次调整后的权值:"%mycount)print("w:",w)print(u"误差: %f "%mye)if abs(mye) < expect_e or mycount > maxtrycount:break
for xn in x:print("%d or %d => %d"%(xn[1],xn[2],get_v(w,xn)))

LMS退火算法

LMS算法的一个限制在于学习率的设定: 
当学习率较大时,收敛速度较快 
当学习率较小时才能保证权值的修正是再让代价函数一步比一步小 
因而比较科学的方法应该是学习率随着权值的不断修改而不断减小,于是便有了LMS退火算法,其公式如下: 

退火算法原理源于固体退火原理,其为基于蒙特卡罗迭代求解法的一种启发式随机搜索过程

修改之前的例子:

a0 = 0.1
a = 0.0
def neww(oldw,myd,myx,a):mye = get_e(oldw,myx,myd)a=a0/(1+float(mycount)/r)return (oldw+a*mye*myx,mye)

Rosonblatt感知机的局限

Rosonblatt感知机的局限在于其本质为一个线性感知机,因此当样本线性不可分时则使用delta法则进行感知机的训练,而delta的关键思想在于使用梯度下降来搜索可能的权向量的假设空间,已找到最佳拟合训练样本的权向量.

通过这种方式可以一定程度上对非线性数据进行分类,但想要解决Rosonblatt感知器无法处理非线性关系(无法学习”异或”逻辑运算)的问题,需要的是双层感知机,或者多层感知机(也就是神经网络),实际上在历史上正是因为Rosonblatt无法学习线性关系才导致了神经网络十几年的低潮,也正是双层感知机找到了异或的学习方法以及传统冯诺依曼计算机模拟智能遇到了不可逾越的瓶颈才再一次掀起了神经网络的热潮.

参考资料

  • [1] 麦好 <机器学习实践指南 案例应用解析 第二版> 机械工业出版社 2017.7

Rosonblatt线性感知器相关推荐

  1. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  2. ML:基于自定义数据集利用Logistic、梯度下降算法GD、LoR逻辑回归、Perceptron感知器、SVM支持向量机、LDA线性判别分析算法进行二分类预测(决策边界可视化)

    ML:基于自定义数据集利用Logistic.梯度下降算法GD.LoR逻辑回归.Perceptron感知器.支持向量机(SVM_Linear.SVM_Rbf).LDA线性判别分析算法进行二分类预测(决策 ...

  3. 神经网络 | 网络优化-线性神经网络-delta学习规则-梯度下降法(单层感知器-异或问题Python源代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  4. 感知器原理及线性分类技术实现

    在说起感知器之前,需要先说一下神经网络的定义: 神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应. 感知器(M-P神经元模型)  感 ...

  5. ML之NB:基于news新闻文本数据集利用纯统计法、kNN、朴素贝叶斯(高斯/多元伯努利/多项式)、线性判别分析LDA、感知器等算法实现文本分类预测

    ML之NB:基于news新闻文本数据集利用纯统计法.kNN.朴素贝叶斯(高斯/多元伯努利/多项式).线性判别分析LDA.感知器等算法实现文本分类预测 目录 基于news新闻文本数据集利用纯统计法.kN ...

  6. 线性判别函数(Python实现批感知器算法、Ho Kashyap算法和MSE多类扩展方法)——模式识别编程作业

    文章目录 写在前面 批感知器算法 Ho Kashyap算法 MSE多类扩展方法 Ref. 写在前面 本博客为模式识别作业的记录,实现批感知器算法.Ho Kashyap算法和MSE多类扩展方法,可参考教 ...

  7. 用java实现基于感知器的数据线性分类

    感知器(perceptron) 是比较简单的二分类器,通过对训练样本集的学习,从而得到判别函数权值的解,产生线性可分的样本判别函数.该算法属于非参数算法,优点是不需要对各类样本的统计性质作任何假设,属 ...

  8. 线性分类器:感知器/SVM

    线性可分 存在一个超平面,可以将数据集的正负例完全正确地划分至超平面两侧.如:左图中的数据是线性可分,而右图不是.     线性模型形式 是x在第i个特征的取值. 反映了第i个特征的重要程度.如 可看 ...

  9. 机器学习 —— 基础整理(六)线性判别函数:感知器、松弛算法、Ho-Kashyap算法...

    这篇总结继续复习分类问题.本文简单整理了以下内容: (一)线性判别函数与广义线性判别函数 (二)感知器 (三)松弛算法 (四)Ho-Kashyap算法 闲话:本篇是本系列[机器学习基础整理]在time ...

最新文章

  1. HDU-5532(LIS-nlogn)
  2. 死磕Java并发:Java内存模型之总结
  3. 手把手教你写一个Java的orm框架(4)
  4. 数据库之取出表中最新时间的数据
  5. CuteEditor6.0使用配置心得体会(转)
  6. 读取mysql数据到select_MySQL数据库8(十三)高级数据操作之select指令
  7. 旋转校正原理_「牛车实验室」四轮定位和动平衡如何选择?趣谈两种项目的原理和区别...
  8. Tomcat路径配置
  9. 记模拟面试日记2(更新...)
  10. Perl文件内容对比
  11. springboot获取Spring容器中的bean(ApplicationContextAware接口的应用)避免过多的或不用if..else,switch
  12. 关于sizeof(struct student)的问题
  13. 组合优化问题MATLAB程序,组合优化问题(一).ppt
  14. 解决dos打开界面变小和打开软件字体乱码的问题
  15. 人脸识别考勤机选型验收标准
  16. 淘宝无人直播赚钱模式
  17. amd显卡用黑苹果输出黑屏_黑苹果AMD NVIDIA Intel显卡咋驱动?速戳这里
  18. 薛之谦一半的高潮用计算机弹怎么按,如何解读薛之谦的歌《一半》?
  19. 蓝桥杯2013年第四届C++B组省赛真题
  20. 蓝牙标签与蓝牙信标的区别

热门文章

  1. iOS轻量分组日志工具 Log4OC
  2. 【MongoDB】NoSQL Manager for MongoDB 教程(基础篇)
  3. PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes)
  4. 在CentOS7上配置SVN
  5. 解决python在eclipse运行正常在命令行里运行提示包导入错误
  6. 一入职!就遇到MySQL亿级大表优化....
  7. 崩溃了,一个HashMap跟面试官扯了半个小时
  8. 持续集成工具Jenkins看这篇就够啦!
  9. 分享一波Kafka面试题答案
  10. JVM:7种垃圾回收器总结