BP神经网络算法java实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];