'''
算法:lms学习率的退火算法
解决的问题:学习率不变化,收敛速度较慢的情况
思路:由初始解和控制参数初值开始,对当前解重复进行"产生新解-->计算目标函数差-->
接受或舍弃"的迭代,并逐步衰减控制参数,算法终结时的当前解即为所得近似最优解
''' '''
变量约定:大写表示矩阵或数组,小写表示数字
X:表示数组或者矩阵
x:表示对应数组或矩阵的某个值
''' import numpy as np
import math
a0=0.1 ##学习率初始值 <a<
a=0.0 ##学习率变量
r=0.2 ##可调参数,改善退火曲线的形态
X=np.array([[,,],[,,],[,,],[,,]]) ##输入矩阵
D=np.array([,,-,-]) ##期望输出结果矩阵
W=np.array([,,]) ##权重向量
expect_e=0.005 ##期望误差
maxtrycount= ##最大尝试次数
cnt= ##当前循环次数 ##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-) def sgn(v):
if v>:
return
else:
return - ##读取实际输出
'''
这里是两个向量相乘,对应的数学公式:
a(m,n)*b(p,q)=m*p+n*q
在下面的函数中,当循环中xn=1时(此时W=([0.1,0.1])):
np.dot(W.T,x)=(,)*(0.1,0.1)=*0.1+*0.1=0.2> ==>sgn 返回1
'''
def get_v(W,x):
return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘 ##读取误差值
def get_e(W,x,d):
return d-get_v(W,x) ##权重计算函数(批量修正)
'''
对应数学公式: w(n+)=w(n)+a*x(n)*e
对应下列变量的解释:
w(n+) <= neww 的返回值
w(n) <=oldw(旧的权重向量)
a <= a(学习率,范围:<a<)
x(n) <= x(输入值)
e <= 误差值或者误差信号
''' '''
核心:学习率的计算(有多种退火方式,这里选取其中一个)
对应的数学公式:(非标准数学符号)
m(n)=m0/(+n/t)
参数解释:
m(n) <= 当前学习率(或者初始解)
m0 <= 学习率初始值(也叫控制参数)
n <= 循环次数
t <= 可调参数,改善退火曲线的形态 '''
def neww(oldW,d,x):
e=get_e(oldW,x,d)
#a=a0/(+float(cnt)/r)
a=a0/(+float(cnt)*r)
w=oldW+a*x*e
return (w,e) ##修正权值
'''
此循环的原理:
权值修正原理(批量修正)==>神经网络每次读入一个样本,进行修正,
达到预期误差值或者最大尝试次数结束,修正过程结束
''' while True:
err=
i=
for xn in X:
W,e=neww(W,D[i],xn)
i+=
err+=pow(e,) ##lms算法的核心步骤,即:MES
err=math.sqrt(err) ##与lms算法有区别的地方,求开方最小
cnt+=
print(u"第 %d 次调整后的权值:"%cnt)
print(W)
print(u"误差:%f"%err)
if err<expect_e or cnt>=maxtrycount:
break print("最后的权值:",W.T) ##输出结果
print("开始验证结果...")
for xn in X:
print("D%s and W%s =>%d"%(xn,W.T,get_v(W,xn))) ##测试准确性: print("开始测试...")
test=np.array([,,])
print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))
test=np.array([,,])
print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))

输出结果:

第 1 次调整后的权值:
[ 0.8 -0.6 -1.8]
误差:2.000000
第 2 次调整后的权值:
[ 0.96666667 -0.6 -0.3 ]
误差:3.464102
第 3 次调整后的权值:
[ 0.96666667 -0.88571429 -0.72857143]
误差:2.828427
第 4 次调整后的权值:
[ 0.96666667 -1.88571429 -2.60357143]
误差:4.000000
第 5 次调整后的权值:
[ 1.18888889 -1.55238095 -0.60357143]
误差:2.828427
第 6 次调整后的权值:
[ 1.28888889 -1.55238095 0.29642857]
误差:3.464102
第 7 次调整后的权值:
[ 1.28888889 -1.55238095 0.29642857]
误差:0.000000
最后的权值: [ 1.28888889 -1.55238095 0.29642857]
开始验证结果...

这次调整r值的结果是7次训练得出最优解,同样的数据用固定学习率的lms算法要8次训练。在调整r值的实验中,最快的一次是2次得出最优解。

机器学习:Python实现lms中的学习率的退火算法的更多相关文章

  1. 机器学习:Python实现最小均方算法(lms)

    lms算法跟Rosenblatt感知器相比,主要区别就是权值修正方法不一样.lms采用的是批量修正算法,Rosenblatt感知器使用的 是单样本修正算法.两种算法都是单层感知器,也只适用于线性可分的 ...

  2. 机器学习---python环境搭建

    一 安装python2.7 去https://www.python.org/downloads/ 下载,然后点击安装,记得记住你的安装路径,然后去设置环境变量,这些自行百度一下就好了. 由于2.7没有 ...

  3. 机器学习:R语言中如何使用最小二乘法

    详细内容见上一篇文章:http://www.cnblogs.com/lc1217/p/6514734.html 这里只是介绍下R语言中如何使用最小二乘法解决一次函数的线性回归问题. 代码如下:(数据同 ...

  4. 机器学习-Python 01

    机器学习中最常用最流行的语言工具现阶段应该是Python, 这篇文章主要介绍一些常用的Python语法知识.本篇博文适合那些有其他语言基础的程序员们,如果一点基础都没有,我建议先跳过.博主以前是做移动 ...

  5. pytorch中的学习率调整函数

    参考:https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate torch.optim.lr_scheduler提供 ...

  6. 在学习python的过程中,遇到的最大的困难是什么?

    本人文科生,回顾自己近 2 年的Python 自学经历,有一些学习心得和避坑经验分享给大家,让大家在学习 Python 的过程中少走一些弯路!减少遇到不必要的学习困难! 首先,最开始最大的困难应该就是 ...

  7. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  8. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

  9. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

随机推荐

  1. webpack入门与解析(一)

    每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...

  2. FPGA学习体会

    我是安徽工程大学电子信息科学与技术专业的学生刘美花,在v3学院的培训结束了,这十几天的培训对我来说还是挺有意义的,不过中间也有一些波折.还记得刚开始的时候和老师还有各个学校的学生不太熟,心中有诸多不满 ...

  3. 利用AForge.NET 调用电脑摄像头进行拍照

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

  4. P177 test 6-4 UVa439

    //P177 test 6-4 UVa439 #include<cstdio> #include<cstring> #include<queue> using na ...

  5. 用C++编一程序,先输出一行sun mon tue wed thu fri fri,接着使用右对齐打印出日期,像日历那样

    用C++编一程序,先输出一行sun mon tue wed thu fri fri,接着使用右对齐打印出日期,像日历那样 先输出一行sun mon tue wed thu fri fri,再提醒用户输 ...

  6. c++ STL常用算法使用方法

    #include <string> #include <vector> #include <functional> #include <iostream> ...

  7. 用react分页显示数据

    去年年底,尝试着用react写个组件化的页面! demo地址 里面有一个list页面弄了一下数据的分页展示 展示一下主要三个组件:父组件listBox.列表组件List.按钮组件PageButton ...

  8. 解释 : translate 功能,过程

    本来预计是这样设计的 admin在增加内容时,如:添加新的地点或新的FAQ,这时需要有中文,马来文等,但是顾客通常是不会添加的,所以这部分就不给顾客添加或更改. 用户来到前台,先看看localstor ...

  9. js本地预览图片

    废话不说  直接上代码 <script type="text/javascript" src="http://code.jquery.com/jquery-late ...

  10. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...