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 * 10
x >= -10 && x <= 10
y >= 0 && y <= 10
域2:下半个圆,圆心坐标(10 ,-1)
(x - 10) * (x - 10) + (y + 1) * (y + 1) = 10 * 10;
x >= 0 && x <= 20
y >= -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;
}
//进行感知器泛化能力测试 测试数据量1K
int 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. 神经网络与机器学习第3版学习笔记-第1章 Rosenblatt感知器

    神经网络与机器学习第3版学习笔记 -初学者的笔记,记录花时间思考的各种疑惑 本文主要阐述该书在数学推导上一笔带过的地方.参考学习,在流畅理解书本内容的同时,还能温顾学过的数学知识,达到事半功倍的效果. ...

  5. 机器学习:Python实现单层Rosenblatt感知器

    如果对Rosenblatt感知器不了解,可以先查看下相关定义,然后对照下面的代码来理解. 代码中详细解释了各步骤的含义,有些涉及到了数学公式的解释. 这篇文章是以理解Rosenblatt感知器的原理为 ...

  6. Rosenblatt感知器

    一.定义 Rosenblatt感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入项求和后进行调节. 二.基本计算过程 Rose ...

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

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

  8. 神经网络与机器学习 笔记—卷积神经网络(CNN)

    卷积神经网络 之前的一些都是考虑多层感知器算法设计相关的问题,这次是说一个多层感知器结构布局相关的问题.来总结卷积神经网络.对于模式分类非常合适.网络的提出所隐含的思想收到了神经生物学的启发. 第一个 ...

  9. 【机器学习笔记一】协同过滤算法 - ALS

    参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...

随机推荐

  1. [通达OA] RCE + Getshell

    跟着大佬轻松复现:https://github.com/jas502n/OA-tongda-RCE 通达OA下载:https://www.tongda2000.com/download/2019.ph ...

  2. P1725 琪露诺 题解(单调队列)

    题目链接 琪露诺 解题思路 单调队列优化的\(dp\). 状态转移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考虑单调队列优化. ...

  3. LZZY高级语言程序设计之输入秒数并用时钟的方式表达

    import java.util.Scanner;public class MQ5 { public static void main(String[] args) { Scanner sc = ne ...

  4. GUI编程学习笔记——day01

    GUI编程 前言:告诉大家应该怎么学? 这是什么? 它怎么玩? 该如何在我们平时运用? 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 一.是什么 GUI是图形 ...

  5. ch2_8_3求解回文序列问题(递归实现)

    思路:回文序列中左右两边的值一定相等,所以可以将该问题分解为两边化为相同元素操作的次数和去掉两边相等元素后后剩下元素变成回文序列的操作次数. 题目: 如果一个数字序列逆置之后跟原序列是一样的就称这样的 ...

  6. 图解 | 原来这就是 IO 多路复用

    为了讲多路复用,当然还是要跟风,采用鞭尸的思路,先讲讲传统的网络 IO 的弊端,用拉踩的方式捧起多路复用 IO 的优势. 为了方便理解,以下所有代码都是伪代码,知道其表达的意思即可. Let's go ...

  7. OpenCV 之 平面单应性

    上篇 OpenCV 之 图象几何变换 介绍了等距.相似和仿射变换,本篇侧重投影变换的平面单应性.OpenCV相关函数.应用实例等. 1  投影变换 1.1  平面单应性 投影变换 (Projectiv ...

  8. 前端 | JS 任务和微任务:promise 的回调和 setTimeout 的回调到底谁先执行?

    首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么? console.log("script start"); setTimeout(function () { con ...

  9. Apache Hudi核心概念一网打尽

    1. 场景 https://hudi.apache.org/docs/use_cases.html 近实时写入 减少碎片化工具的使用 CDC 增量导入 RDBMS 数据 限制小文件的大小和数量 近实时 ...

  10. [递推]B. 【例题2】奇怪汉诺塔

    B . [ 例 题 2 ] 奇 怪 汉 诺 塔 B. [例题2]奇怪汉诺塔 B.[例题2]奇怪汉诺塔 题目描述 汉诺塔问题,条件如下: 这里有 A A A. B B B. C C C 和 D D D ...