要求如下:

所以当神经元输出函数选择在硬极函数的时候,如果想分成上面的四个类型,则必须要2个神经元,其实至于所有的分类问题,n个神经元则可以分成2的n次方类型。

又前一节所证明出来的关系有:

从而算出了所有的权重的值。。

代码实现如下:

第一个类是用来操实际操作的类,真正核心的内容是在PerceptronClassifyNoLearn中。

package com.cgrj.com;

import java.util.Arrays;

import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.nnet.Perceptron; public class MyNeturol { public static void main(String[] args) {
// TODO Auto-generated method stub
DataSet trainingSet=new DataSet(2,2);
trainingSet.addRow(new DataSetRow(new double[]{1,2},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{1,1},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{2,0},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{2,-1},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{-1,2},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{-2,1},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{-1,-1},new double[]{Double.NaN,Double.NaN}));
trainingSet.addRow(new DataSetRow(new double[]{-2,-2},new double[]{Double.NaN,Double.NaN})); PerceptronClassifyNoLearn perceptronClassifyNoLearn=new PerceptronClassifyNoLearn(2); for(DataSetRow row:trainingSet.getRows()){
perceptronClassifyNoLearn.setInput(row.getInput());
perceptronClassifyNoLearn.calculate();
double[] netWorkOutput=perceptronClassifyNoLearn.getOutput();
System.out.println(Arrays.toString(row.getInput())+"="+Arrays.toString(netWorkOutput)); } } }

PerceptronClassifyNoLearn规定了输入层和输出层的属性和规则,由于是无法学的,所以其判定规则是依然设定好了的,在此类中。

package com.cgrj.com;

import org.neuroph.core.Layer;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.Neuron;
import org.neuroph.nnet.comp.neuron.BiasNeuron;
import org.neuroph.nnet.comp.neuron.InputNeuron;
import org.neuroph.util.ConnectionFactory;
import org.neuroph.util.LayerFactory;
import org.neuroph.util.NeuralNetworkFactory;
import org.neuroph.util.NeuralNetworkType;
import org.neuroph.util.NeuronProperties;
import org.neuroph.util.TransferFunctionType; public class PerceptronClassifyNoLearn extends NeuralNetwork { public PerceptronClassifyNoLearn(int inputNeuronsCount){
this.createNetWork(inputNeuronsCount); } private void createNetWork(int inputNeuronsCount) {
//设置网络感知机
this.setNetworkType(NeuralNetworkType.PERCEPTRON); //构建输入神经元,表示输入的刺激
NeuronProperties inputNeuronProperties=new NeuronProperties();
inputNeuronProperties.setProperty("neuronType", InputNeuron.class); //由输入神经元构成的输入层
Layer inputLayer=LayerFactory.createLayer(inputNeuronsCount,inputNeuronProperties);
this.addLayer(inputLayer);
//给输入层增加BiasNeron,表示神经元偏置
inputLayer.addNeuron(new BiasNeuron()); //构建输出神经元
NeuronProperties outputNeuronProperties=new NeuronProperties();
outputNeuronProperties.setProperty("transferFunction", TransferFunctionType.STEP);
Layer outputLayer=LayerFactory.createLayer(2, outputNeuronProperties);
this.addLayer(outputLayer); ConnectionFactory.fullConnect(inputLayer, outputLayer);
NeuralNetworkFactory.setDefaultIO(this);
Neuron n=outputLayer.getNeuronAt(0);
n.getInputConnections()[0].getWeight().setValue(-3);
n.getInputConnections()[1].getWeight().setValue(-1);
n.getInputConnections()[2].getWeight().setValue(1); n=outputLayer.getNeuronAt(1);
n.getInputConnections()[0].getWeight().setValue(1);
n.getInputConnections()[1].getWeight().setValue(-2);
n.getInputConnections()[2].getWeight().setValue(0); }
}

可以应用于象限的判定,修改上面的代码如下:

Neuron n=outputLayer.getNeuronAt(0);
n.getInputConnections()[0].getWeight().setValue(0);
n.getInputConnections()[1].getWeight().setValue(1);
n.getInputConnections()[2].getWeight().setValue(0); n=outputLayer.getNeuronAt(1);
n.getInputConnections()[0].getWeight().setValue(1);
n.getInputConnections()[1].getWeight().setValue(0);
n.getInputConnections()[2].getWeight().setValue(0);

则有第一个用来判定位于y的方向,第一个神经元则用来判定位于x轴的方向

switch (Arrays.toString(netWorkOutput)) {
case "[1.0, 1.0]":
str="第一象限";
break;
case "[0.0, 1.0]":
str="第四象限";
break;
case "[1.0, 0.0]":
str="第二象限";
break;
case "[0.0, 0.0]":
str="第三象限";
break; default:
break;
} System.out.println(Arrays.toString(row.getInput())+"="+Arrays.toString(netWorkOutput)+"---属于"+str);

这样就会有打印的结果了。。

运行截图(这里忽略坐标轴的影响,由于输出函数的特殊,所以把0当成负数看):

下一篇,将具体分析每个类和每个方法的含义,及其实现的原理。。。

非学习型单层感知机的java实现(日志三)的更多相关文章

  1. 基于STM32的学习型通用红外遥控设备的设计实现(三)

    CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 http://blo ...

  2. Java学习笔记之linux配置java环境变量(三种环境变量)

    0x00 压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车 ...

  3. 检查型异常和非检查型异常——Java

    文章目录 检查型异常和非检查型异常--Java 检查型异常 非检查型异常 结语 检查型异常和非检查型异常--Java Java语言规范将派生于Error类或RuntimeExceprion类的所有异常 ...

  4. Java检查型异常和非检查型异常

    1.代码 public class ExcepTest { /** * @param args */ public static void main(String[] args) { System.e ...

  5. 深度学习:多层感知机和异或问题(Pytorch实现)

    感知机模型 假设输入空间\(\mathcal{X}\subseteq \textbf{R}^n\),输出空间是\(\mathcal{Y}=\{-1,+1\}\).输入\(\textbf{x}\in \ ...

  6. Java学习笔记(十七)——java序列化

    [前面的话] 做项目总是要用到很多东西,遇到一个新的知识,并不是这个知识出来的时间短,而是对于自己来说是新的,所以就需要自己去学习,希望今后可以提高学习的效率. 这篇文章是关于Java 序列化的,选择 ...

  7. Java基础学习总结(83)——Java泛型总结

    1. 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型 ...

  8. Java 学习(7):java 日期时间 & 正则表达式

    目录 --- 日期时间 --- 正则表达式 日期时间:java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 构造函数:用于初始化对 ...

  9. Java 学习(9):java Stream & File & IO

    Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...

随机推荐

  1. echarts柱图自定义为硬币堆叠的形式

    看这标题,可能会有一些人不太明白,那么直接上图,就是柱图展示形式如下图(兼容IE8) 要想实现这样展示效果.我们想用echarts直接实现不行的,即使是纹理填充也不可行的,但是我们可以借助echart ...

  2. TFS发布计划发送到钉钉消息群

    由于工作中需要用到钉钉,每天都要和钉钉打交道:上下班打卡.出差请假流程.各种工作讨论组,不一而足,工作已然和钉钉绑在了一起,难怪有广告词: 微信是一个生活方式,钉钉是一个工作方式. 我们是钉钉机器人内 ...

  3. 初识vuex

    1.简介 vuex是 vue官方推荐的一个状态管理器.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就展现出来. 我们从vuex的原理以及vuex的api两个部分介绍vue ...

  4. ECMAScript版本号总结

      最近想要研究下ES6,关于这个标准的发展历史.ES5. ES6.ES2015等等名称的定义都不怎么明确,查了很多资料,去除了程序员不关心的信息,下面是对ECMAScript规范发展历史及名词定义的 ...

  5. python爬虫实战(一)--------中国作物种质信息网

    相关代码已经修改调试成功----2017-4-1 目标网址:http://www.cgris.net/query/croplist.php 实现:爬取相关信息如图所示,爬取的数据存入mysql数据库. ...

  6. VMware workstation转到vsphere解决办法

    一.前因 上一篇http://www.cnblogs.com/cuncunjun/p/6611837.html 中提到,我想把本地的vmware workstation的虚拟机拷贝到服务器上,因为鄙人 ...

  7. 原生tab切换

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  8. 用Gradle构建Spring Boot项目

    相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本.本文将从无到有创建一个用Gradle构建的Spring Boot项目, ...

  9. 【转载】关于c++中的explicit

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p );  ...

  10. phpcms 笔记

      首先是要把首页分为三个部分  : 导航部分 .尾部和首页中间部分  用了三个不同的文件 header.html ; index.html; footer.html   在使用phpcms之前 首先 ...