神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
LMS算法和Rosenblatt感知器算法非常想,唯独就是去掉了神经元的压制函数,Rosenblatt用的Sgn压制函数,LMS不需要压制函数,两者一样是只有单个神经元。
LMS算法信号流图
算法小结:
然后在说下退火:
#pragma once#include "stdafx.h"#include <string>#include <iostream>using namespace std;int gnM = 0; //训练集空间维度int gnN = 0; //突触权值个数double gdU0 = 0.1; //初始学习率参数,用于退火,前期可以较大double gdT = 1; //控制退火用的开始降温的时间点double gdN = 0; //当前工作时间(神经网络学习次数)//退火//U=U0/(1+(N/T))double GetNowU() {gdN++;//cout<< gdU0 / (1.0 + (gdN / gdT))<<endl;return gdU0 / (1.0 + (gdN / gdT));}void LMSInit(double *dX, const int &nM, double *dW, const int &nN, const double &dB, const double &dU0 ,const double &dT) {//dX 本次训练数据集//nM 训练集空间维度//dW 权值矩阵//nN 突触权值个数 LMS只有一个神经元,所以nM==nM//dB 偏置,正常这个是应该 走退火动态调整的,以后再说,现在固定得了。//dU0 初始学习率参数,用于退火,前期可以较大//dT控制退火用的开始降温的时间点if (nM > 0) {dX[0] = 1;//把偏置永远当成一个固定的突触}for (int i = 0; i <= nN; i++) {if (i == 0) {dW[i] = dB;//固定偏置}else {dW[i] = 0.0;}}gnM = nM, gnN = nN, gdU0 = dU0, gdT = dT;}double Sgn(double dNumber) {return dNumber > 0 ? +1.0 : -1.0;}//感知器收敛算法-学习void LMSStudy(const double *dX, const double dD, double *dW) {//dX 本次训练数据集//dD 本次训练数据集的期望值//dW 动态参数,突触权值double dY = 0;for (int i = 0; i <= gnM && i <= gnN; i++) {dY = dY + dX[i] * dW[i];}//dY = Sgn(dY); LMS这个地方不用了,Rosenblatt是需要的if (dD == dY) {return;//不需要进行学习调整突触权值}for (int i = 1; i <= gnM && i <= gnN; i++) {dW[i] = dW[i] + GetNowU() * (dD - dY) * dX[i];}}//感知器收敛算法-泛化double LMSGeneralization(const double *dX, const double *dW) {//dX 本次需要泛化的数据集//dW 已经学习好的突触权值//返回的是当前需要泛化的数据集的泛化结果(属于那个域的)double dY = 0;for (int i = 0; i <= gnM && i <= gnN; i++) {dY = dY + dX[i] * dW[i];}return Sgn(dY);}//双月分类模型,随机获取一组值/* 自己稍微改了下域1:上半个圆,假设圆心位坐标原点(0,0)(x - 0) * (x - 0) + (y - 0) * (y - 0) = 10 * 10x >= -10 && x <= 10y >= 0 && y <= 10域2:下半个圆,圆心坐标(10 ,-1)(x - 10) * (x - 10) + (y + 1) * (y + 1) = 10 * 10;x >= 0 && x <= 20y >= -11 && y <= -1*/const double gRegionA = 1.0; //双月上const double gRegionB = -1.0;//双月下void Bimonthly(double *dX, double *dY, double *dResult) {//dX 坐标x//dY 坐标y//dResult 属于哪个分类*dResult = rand() % 2 == 0 ? gRegionA : gRegionB;if (*dResult == gRegionA) {*dX = rand() % 20 - 10;//在区间内随机一个X*dY = sqrt(10 * 10 - (*dX) * (*dX));//求出Y}else {*dX = rand() % 20;*dY = sqrt(10 * 10 - (*dX - 10) * (*dX - 10)) - 1;*dY = *dY * -1;}}int main(){//system("color 0b");double dX[2 + 1], dD, dW[2 + 1]; //输入空间维度为3 平面坐标系+一个偏置double dB = 0;double dU0 = 0.1;double dT = 128; //128之后开始降温LMSInit(dX, 2, dW, 2, dB, dU0, dT);//初始化 感知器double dBimonthlyX, dBimonthlyY, dBimonthlyResult;int nLearningTimes = 1024 * 10;//进行10K次学习for (int nLearning = 0; nLearning <= nLearningTimes; nLearning++) {Bimonthly(&dBimonthlyX, &dBimonthlyY, &dBimonthlyResult);//随机生成双月数据dX[1] = dBimonthlyX;dX[2] = dBimonthlyY;dD = dBimonthlyResult;LMSStudy(dX, dD, dW);//cout <<"Study:" << nLearning << " :X= " << dBimonthlyX << "Y= " << dBimonthlyY << " D=" << dBimonthlyResult<< "----W1= " << dW[1] << " W2= " << dW[2] << endl;}//进行LMS泛化能力测试 测试数据量1Kint nGeneralizationTimes = 1 * 1024;int nGeneralizationYes = 0, nGeneralizationNo = 0;double dBlattGeneralizationSuccessRate = 0;for (int nLearning = 1; nLearning <= nGeneralizationTimes; nLearning++) {Bimonthly(&dBimonthlyX, &dBimonthlyY, &dBimonthlyResult);//随机生成双月数据dX[1] = dBimonthlyX;dX[2] = dBimonthlyY;//cout << "Generalization: " << dBimonthlyX << "," << dBimonthlyY;if (dBimonthlyResult == LMSGeneralization(dX, dW)) {nGeneralizationYes++;//cout << " Yes" << endl;}else {nGeneralizationNo++;//cout << " No" << endl;}}dBlattGeneralizationSuccessRate = nGeneralizationYes * 1.0 / (nGeneralizationNo + nGeneralizationYes) * 100;cout << "Study : " << nLearningTimes << " Generalization : " << nGeneralizationTimes << " SuccessRate:" << dBlattGeneralizationSuccessRate << "%" << endl;getchar();return 0;}
执行结果:
Study : 10240 Generalization : 1024 SuccessRate:96.6797%
注意:
相对于Rosenblatt算法,LMS如果直接把sgn去掉了可能出现泛化能力急剧下降的问题,我就是,直接变成50%了(和没学习一样),因为此时的学习率参数恒等于0.1有点大(为什么说0.1大,因为没有sgn了,算出的XW是比较大的,而这个时候我们训练数据集的期望结果,还是+1和-1)。同时,退火的那个地方,去动态调整那几个参数,会得到你意想不到的效果,挺微妙的。
神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火相关推荐
- python 最小值算法_机器学习:Python实现最小均方算法(lms)
lms算法跟Rosenblatt感知器相比,主要区别就是权值修正方法不一样.lms采用的是批量修正算法,Rosenblatt感知器使用的 是单样本修正算法.两种算法都是单层感知器,也只适用于线性可分的 ...
- 最小均方算法(LMS)
一.LMS算法 全称Least mean square 算法.中文是最小均方算法. 感知器和自适应线性元件在历史上几乎是同时提出的,并且两者在对权值的调整的算法非常相似.它们都是基于纠错学习规则 ...
- 神经网络与机器学习 笔记—基本知识点(下)
神经网络与机器学习 笔记-基本知识点(下) 0.1 网络结构: 神经网络中神经元的构造方式与用于训练网络的学习算法有着密切的联系,有三种基本的网络结构: 0.7 知识表示 ...
- 神经网络与机器学习 笔记—基本知识点(上)
神经网络与机器学习 笔记-基本知识点(上) 0.1 什么是神经网络: 神经网络是由简单处理单元构成的大规模并行分布处理器,天然具有存储经验知识和使之可用的特性.神经网络在两个方面与大脑类似. 神经网络 ...
- 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)
吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection) 对于异常检测算法,使用特征是至关重要的,下面谈谈 ...
- Python机器学习笔记:异常点检测算法——Isolation Forest
Python机器学习笔记:异常点检测算法--Isolation Forest 参考文章: (1)Python机器学习笔记:异常点检测算法--Isolation Forest (2)https://ww ...
- 神经网络与机器学习 笔记—小规模和大规模学习问题
监督学习的可行性依赖于下面的关键问题: 由N个独立同分布的样本(X1,D1),(X2,D2),-,(Xn,Dn) 组成的训练样本是否包含了构造具有良好泛化性能的机器学习的足够信息? 计算考虑: 神经网 ...
- 机器学习算法|LMS(Least Mean Square)最小均方算法公式推导
- lms算法的verilog实现_最小均方算法(LMS Algorithm)理论及DSP实现
LMS算法可认为是机器学习里面最基本也比较有用的算法,神经网络中对参数的学习使用的就是LMS的思想,在通信信号处理领域LMS也非常常见,比如自适应滤波器. 本文主要对LMS(Least Mean Sq ...
最新文章
- linux shell 执行多个文件,/etc/profile、~/.bash_profile等几个文件的执行过程
- 重构广义应用数学:人工智能,数学发展的重大机遇
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
- QQ会员2018春节红包抵扣券项目背后的故事
- java EE map
- python入门--函数
- js调用php和php调用js的方法举例
- oracle 删除表 索引也会删除吗,Oracle 删除当前用户下所有的表、索引、序列
- nagios整合cacti2011版(五)
- 如何使用HTML5嵌入视频
- 算法导论PDF原文算法分享
- Unity 不使用BMFont创建Font字体
- 金橙子dll使用说明
- VS2010过期密钥
- Java开发手册!java项目描述模板,挥泪整理面经
- Linux哲学家进餐杀死进程,经典进程的同步问题之——哲学家进餐
- MapReduce名词解释
- 计算机函数average意思,average函数的功能是计算什么
- Source Insight 4.0 代码自动排版 2019
- 企业为什么需要B2B电商系统