'''
算法: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. ajax提交File文件

    <script type="text/javascript">    $(function() {        $("input[name='image'] ...

  2. typedef struct 是什么意思

    typedef用于定义一种新类型例如定义了如下的结构typedef struct student{int age;int score;}STUDENT;那么则有STUDENT stu1;就相当于str ...

  3. 4G最快网速相当于30M宽带

    [导读]据北京移动方面介绍,目前其4G网络的覆盖范围包括:东西北三环.南至两广路以内的地区:清华北大.国贸CBD及园博会等地区. 在4G年内发牌已成定局的背景下,各运营商都在加快布局,北京移动近期就推 ...

  4. 利用hexo+github+nodejs搭建自我博客的一天

    放一张比较喜欢的背景图镇楼,伪文艺一波.因为刚刚抱着四个快递从公司大门走到宿舍,快递都比我高,坐电梯的时候电梯里面的灯一闪一闪,电梯还摇晃,上演了一波鬼吹灯,惊魂未定... 说正题:我喜欢的博客应该是 ...

  5. Spark 键值对RDD操作

    键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...

  6. MongoDB【第一篇】安装

    第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. MongoDB 版本 mongodb-linux-x86_64-rhel70-3.4.2 3. 设置 ...

  7. iOS应用 跳转到系统的设置界面

    现在很多APP都需要获取用户权限,例如,允许调用位置信息,读取短信,拨打电话,开启WIFI,掉头摄像头等,用户不允许APP获取这些权限的时候.最好的用户体验是,直接跳转到系统设置界面,让用户自己设置. ...

  8. 每天一个Linux命令(04)--mkdir命令

    Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项]目录 2.命令功能: ...

  9. PHP字符串三种定义方式

    PHP的字符串有三种定义方式:单引号 .双引号 .定界符  1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...

  10. asp.net core mvc剖析:mvc动作选择

    一个http请求过来后,首先经过路由规则的匹配,找到最符合条件的的IRouter,然后调用IRouter.RouteAsync来设置RouteContext.Handler,最后把请求交给RouteC ...