Rosenblatt感知器收敛算法C++实现

算法概述

自己用C++实现了下,测试的例子和模式用的都是双月分类模型,关于双月分类相关看之前的那个笔记:

https://blog.csdn.net/u013761036/article/details/90548819

直接上实现代码:

#pragma once
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;int gnM = 0;      //训练集空间维度
int gnN = 0;      //突触权值个数
double gdU = 0.01; //学习率参数void RosenBlattInit(double *dX, int nM, double *dW, int nN ,double dB ,double dU) {//dX 本次训练数据集//nM 训练集空间维度//dW 权值矩阵//nN 突触权值个数 RosenBlatt只有一个神经元,所以nM==nM//dB 偏置,正常这个是应该 走退火动态调整的,以后再说,现在固定得了。//dU 学习率参数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 ,gdU = dU;
}double Sgn(double dNumber) {return dNumber > 0 ? +1.0 : -1.0;
}//感知器收敛算法-学习
void RosenBlattStudy(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);if (dD == dY) {return;//不需要进行学习调整突触权值}for (int i = 1; i <= gnM && i <= gnN; i++) {dW[i] = dW[i] + gdU * (dD - dY) * dX[i];}
}//感知器收敛算法-泛化
double RosenBlattGeneralization(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 dU = 0.1;double dB = 0;RosenBlattInit(dX, 2, dW, 2, dB, dU);//初始化 感知器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;RosenBlattStudy(dX, dD, dW);//cout <<"Study:" << nLearning << " :X= " << dBimonthlyX << "Y= " << dBimonthlyY << " D=" << dBimonthlyResult<< "----W1= " << dW[1] << "  W2= " << dW[2] << endl;}//进行感知器泛化能力测试 测试数据量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 == RosenBlattGeneralization(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;
}

结果:

学习了10K次,泛化测试1K次,成功率96%

神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现相关推荐

  1. 神经网络与机器学习 笔记—多层感知器(MLP)

    多层感知器(MLP) Rosenblatt感知器和LMS算法,都是单层的并且是单个神经元构造的神经网络,他们的局限性是只能解决线性可分问题,例如Rosenblatt感知器一直没办法处理简单异或问题.然 ...

  2. 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火

    神经网络与机器学习 笔记-LMS(最小均方算法)和学习率退火 LMS算法和Rosenblatt感知器算法非常想,唯独就是去掉了神经元的压制函数,Rosenblatt用的Sgn压制函数,LMS不需要压制 ...

  3. 神经网络与机器学习 笔记—Rosenblatt感知机

    Rosenblatt感知机器 感知器在神经网络发展的历史上占据着特殊位置:它是第一个从算法上完整描述的神经网络.它的发明者Rosenblatt是一位心里学家,在20世纪60年代和70年代,感知器的启发 ...

  4. 机器学习笔记:感知器

    1 分类问题 2 感知器概述 感知机的思想是错误驱动.其模型是 其中sign是符号函数: 由于y∈{-1,1},所以对于误分类的数据来说,满足以下关系 (因为理论上和yi,如果分类正确的话,应该是同正 ...

  5. Rosenblatt感知器

    1.引言 感知器是用于线性可分模式(即模式分别位于超平面所分隔开的两边)分类的最简单的神经网络模型.基本上它由一个具有可调突触权值和偏置的神经元组成.用来调整这个神经网络中自由参数的算法最早出现在Ro ...

  6. Rosenblatt感知器详解

    在学习了机器学习十大算法之后,我决定将目光投向神经网络,从而攀登深度学习的高峰.这条险路的第一个拦路虎就是Rosenblatt感知器.为什么这么说呢?不仅是因为它开拓性的贡献--感知器是第一个从算法上 ...

  7. 机器学习算法系列(一)- 感知器学习算法(PLA)

    阅读本文需要的背景知识点:数学基础知识.一丢丢编程知识 一.引言   前面一节我们了解了机器学习算法系列(〇)- 基础知识,接下来正式开始机器学习算法的学习,首先我们从最简单的一个算法--感知器学习算 ...

  8. 神经网络与机器学习 笔记—单神经元解决XOR问题

    单神经元解决XOR问题 有两个输入的单个神经元的使用得到的决策边界是输入空间的一条直线.在这条直线的一边的所有的点,神经元输出1:而在这条直线的另一边的点,神经元输出0.在输入空间中,这条直线的位置和 ...

  9. 神经网络与机器学习 笔记—基本知识点(下)

                   神经网络与机器学习 笔记-基本知识点(下) 0.1 网络结构: 神经网络中神经元的构造方式与用于训练网络的学习算法有着密切的联系,有三种基本的网络结构: 0.7 知识表示 ...

最新文章

  1. php面向对象编程代码怎么写,php面向对象编程(一)
  2. .net一个函数要用另一个函数的值_VLOOKUP函数
  3. VCSA 6.7 U3部署(vCenter Server Appliance(VCSA)6.7 U3部署指南)
  4. linux 软件应用
  5. Qt + 运动控制 (固高运动控制卡)【1】环境准备,框架搭建
  6. 禁用驱动程序强制签名(终极办法)
  7. Minimax算法——井字棋
  8. google地图 lyrs_在线谷歌地图常用地址
  9. 谭浩强大师的世界纪录
  10. 【Python实例学习】用Python的xlsxwriter模块,进行Excel表格插入图标的操作
  11. 操作系统实验读者写者程序源码_我的操作系统梦破灭了
  12. ImportError: cannot import name ‘XXXA‘ from ‘XXXB‘
  13. tinyint(1)和tinyint(4)的区别和用法
  14. UVA1335-Beijin Guards(二分)
  15. 国内最全的Android市场,最全Android软件商店
  16. 如何把pyecharts的炫酷延续到PPT里!?
  17. Mean Average Precision(MAP):平均精度均值
  18. 如何从excel的多行中随机选出n行
  19. BackhaulRateDlWLAN 和BackhaulRateUlWLAN WLAN回程线路上行和下行带宽
  20. 计算机一级excel单元格,在Excel工作表中选择单元格及其内容

热门文章

  1. Kubernetes之路 1 - Java应用资源限制的迷思
  2. 使用思维导图,优雅的完成自己的代码
  3. 推荐一些好的linux学习网站
  4. HyperLink的使用
  5. nginx限制请求之四:目录进行IP限制
  6. Android之PowerManagerBatteryManager
  7. OSPFv2的综合实验试题分析第1例(CCNP阶段)
  8. Bluetooth4.0
  9. 爬虫中之Requests 模块的进阶
  10. ArcGis辅助编号(半自动)功能的插件式实现