BP神经网络算法java实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

BP神经网络算法java实现

package backp;

import java.*;

import java.awt.*;

import java.io.*;

import java.util.Scanner;

//by realmagician

import org.omg.CORBA.portable.InputStream;

public class backpro {

public static void main(String args[])

{

String filename=new String("delta.in");

try {

FileInputStream fileInputStream=new FileInputStream(filename);

Scanner sinScanner=new Scanner(fileInputStream);

int attN,hidN,outN,samN;

attN=sinScanner.nextInt();

outN=sinScanner.nextInt();

hidN=sinScanner.nextInt();

samN=sinScanner.nextInt();

//System.out.println(attN+" "+outN+" "+hidN+" "+samN);

double samin[][]=new double[samN][attN];

double samout[][]=new double[samN][outN];

for(int i=0;i

{

for(int j=0;j

{

samin[i][j]=sinScanner.nextDouble();

}

for(int j=0;j

{

samout[i][j]=sinScanner.nextDouble();

}

}

int times=10000;

double rate=0.5;

BP2 bp2=new BP2(attN,outN,hidN,samN,times,rate);

bp2.train(samin, samout);

for(int i=0;i

{

for(int j=0;j

System.out.print(bp2.dw1[i][j]+" ");

System.out.println();

}

for(int i=0;i

{

for(int j=0;j

System.out.print(bp2.dw2[i][j]+" ");

System.out.println();

}

while(true)

{

double testout[]=new double[outN];

double testin[]=new double[attN];

Scanner testinScanner=new Scanner(System.in);

for(int i=0;i

{

testin[i]=testinScanner.nextDouble();

}

testout=bp2.getResault(testin);

for(int i=0;i

System.out.print(testout[i]+" ");

System.out.println(outN);

}

} catch (IOException e) {

// TODO: handle exception

}

System.out.println("End");

}

}

class BP2//包含一个隐含层的神经网络

{

double dw1[][],dw2[][];

int hidN;//隐含层单元个数

int samN;//学习样例个数

int attN;//输入单元个数

int outN;//输出单元个数

int times;//迭代次数

double rate;//学习速率

boolean trained=false;//保证在得结果前,先训练

BP2(int attN,int outN,int hidN,int samN,int times,double rate) {

this.attN=attN;

this.outN=outN;

this.hidN=hidN;

this.samN=samN;

dw1=new double[hidN][attN+1];//每行最后一个是阈值w0

for(int i=0;i

{

for(int j=0;j<=attN;++j)

dw1[i][j]=Math.random()/2;

}

dw2=new double[outN][hidN+1];//输出层权值,每行最后一个是阈值w0 for(int i=0;i

{

for(int j=0;j<=hidN;++j)

dw2[i][j]=Math.random()/2;

}

this.times=times;

this.rate=rate;

}

public void train(double samin[][],double samout[][])

{

double dis=0;//总体误差

int count=times;

double temphid[]=new double[hidN];

double tempout[]=new double[outN];

double wcout[]=new double[outN];

double wchid[]=new double[hidN];

while((count--)>0)//迭代训练

{

dis=0;

for(int i=0;i

{

for(int j=0;j

{

temphid[j]=0;

for(int k=0;k

temphid[j]+=dw1[j][k]*samin[i][k];

temphid[j]+=dw1[j][attN];//计算阈值产生的隐含层结果

temphid[j]=1.0/(1+Math.exp(-temphid[j] ));

}

for(int j=0;j

{

tempout[j]=0;

for(int k=0;k

tempout[j]+=dw2[j][k]*temphid[k];

相关文档
最新文档