网络拓扑结构5-3-1读取数据库并训练预测

来源:互联网 发布:苹果cms精仿模板 编辑:程序博客网 时间:2024/05/02 06:04
 

参考书:尹朝庆等。人工智能与专家系统。北京:中国水利水电出版社,2001

                   P325。书上是归一化之后的,本文重新归一化。

先翻书看看,画出拓扑结构,才能轻松明白下文所说的内容。

1、  创建数据库

CREATE TABLE `test`.`table713` (

  `ID` INTEGER ,

  `sun` varchar(20) NOT NULL,

  `temprature` varchar(20) NOT NULL,

  `airpress` varchar(20) NOT NULL,

  `PH` varchar(20) NOT NULL,

  `humidity` varchar(20) NOT NULL,

  `DO` varchar(20) NOT NULL

);

2、  导入数据

insert into table713 values(1,1399,1467,1567,1595,1588,1622);

insert into table713 values(2,1467,1567,1595,1588,1622,1611);

insert into table713 values(3,1567,1595,1588,1622,1611,1615);

insert into table713 values(4,1595,1588,1622,1611,1615,1685);

insert into table713 values(5,1588,1622,1611,1615,1685,1789);

insert into table713 values(6,1622,1611,1615,1685,1789,1790);

3、  检验数据库结构合理,数据准确可靠。

select * from table713;

4、  写个类

BP和连数据库在一个类中。

package pa;import java.util.*;import java.math.*;import java.sql.*;public class Table713 {public static int M=6;//记录条数public static int N=6;//字段个数public static double Data[][]=new double[M][N];//从数据库中读取的原始数据,并归一化public static double Max[]=new double[N];//各个字段的最大值,归一化和反归一化时要用到public static double Min[]=new double[N];//各个字段的最小值,归一化和反归一化时要用到public static double Step=0.6;//学习次数public static int TrainTimes=8000;public static int L0=5;//输入层节点数public static int L1=3;//隐层节点数public static int L2=1;//输出层节点数public static double Weight01[][]=new double[L0][L1];public static double Weight12[][]=new double[L1][L2];public static double Threshold1[]=new double[L1];public static double Threshold2[]=new double[L2];/*函数说明 * public static void getData()//准备数据 * public static void init()//初始化权值和阈值 * public static double transfer(double x)//传递函数 * public static double train(double i1 ,double i2,double i3, double i4,double i5,double d) * 训练函数。输入参数是归一化处理之后的数据,返回正向传播的结果 * public static double run(double i1,double i2,double i3,double i4,double i5) * 测试函数。输入参数是归一化处理之后的数据,返回值也是归一化的。和实际值进行比较,需要反归一化 * public static void print()//打印所有的权值和阈值 * public static void main(String[] args) //主函数,负责调用训练函数和测试函数,输出测试的结果 */public static void getData(){//从数据库中读取String driverName="com.mysql.jdbc.Driver";//驱动程序名String userName="root";//数据库用户名String userPasswd="xhp";//密码String dbName="test";//数据库名String tableName="table713";//表名try{String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;//连接字符串Class.forName(driverName);Connection connection=DriverManager.getConnection(url);Statement statement = connection.createStatement();String sql="SELECT * FROM "+tableName+" where ID >=1";ResultSet rs = statement.executeQuery(sql);for(int i=0;i<M;i++){if(rs.next()){Data[i][0]=Double.parseDouble(rs.getString("sun"));Data[i][1]=Double.parseDouble(rs.getString("temprature"));Data[i][2]=Double.parseDouble(rs.getString("airpress"));Data[i][3]=Double.parseDouble(rs.getString("PH"));Data[i][4]=Double.parseDouble(rs.getString("humidity"));Data[i][5]=Double.parseDouble(rs.getString("DO"));}}rs.close();statement.close();connection.close();}catch(ClassNotFoundException e){e.printStackTrace();}catch(SQLException e){e.printStackTrace();}//寻找每个字段的最大值最小值for(int i=0;i<N;i++){Max[i]=-32767;Min[i]=32767;for(int j=0;j<M;j++){if(Data[j][i]>Max[i]){Max[i]=Data[j][i];}if(Data[j][i]<Min[i]){Min[i]=Data[j][i];}}}//归一化处理for(int i=0;i<M;i++){for(int j=0;j<N;j++){Data[i][j]=(Data[i][j]-Min[j])/(Max[j]-Min[j]);}}}public static void printData(){for(int i=0;i<M;i++){for(int j=0;j<N;j++){System.out.print(Data[i][j]+"");}System.out.println();}}public static void init(){for(int i=0;i<L0;i++){for(int j=0;j<L1;j++){Weight01[i][j]=Math.random()*2-1;}}for(int i=0;i<L1;i++){for(int j=0;j<L2;j++){Weight12[i][j]=Math.random()*2-1;}}for(int i=0;i<L1;i++){Threshold1[i]=Math.random()*2-1;}for(int i=0;i<L2;i++){Threshold2[i]=Math.random()*2-1;}}public static double transfer(double x){return 1/(1+Math.exp(-x));}public static double train(double i1 ,double i2,double i3, double i4,double i5,double d){double Hide1,Hide2,Hide3,out;//计算隐含层的神经元值,隐层的输入Hide1=Threshold1[0]+i1*Weight01[0][0]+i2*Weight01[1][0]+i3*Weight01[2][0]+i4*Weight01[3][0]+i5*Weight01[4][0];Hide2=Threshold1[1]+i1*Weight01[0][1]+i2*Weight01[1][1]+i3*Weight01[2][1]+i4*Weight01[3][1]+i5*Weight01[4][1];Hide3=Threshold1[2]+i1*Weight01[0][2]+i2*Weight01[1][2]+i3*Weight01[2][2]+i4*Weight01[3][2]+i5*Weight01[4][2];//使用S函数,隐层的输出Hide1=transfer(Hide1);Hide2=transfer(Hide2);Hide3=transfer(Hide3);//计算输出层的值,输出层的输入out=Threshold2[0]+Hide1*Weight12[0][0]+Hide2*Weight12[1][0]+Hide3*Weight12[2][0];//使用S函数,输出层的输出out=transfer(out);//计算误差,反向传播double error1[]=new double[L1];double error2[]=new double[L2];error2[0]=out*(1-out)*(d-out);error1[0]=Hide1*(1-Hide1)*(Weight12[0][0])*(error2[0]);error1[1]=Hide2*(1-Hide2)*(Weight12[1][0])*(error2[0]);error1[2]=Hide3*(1-Hide3)*(Weight12[2][0])*(error2[0]);//调整阈值{Threshold1[0]+=Step*error1[0];Threshold1[1]+=Step*error1[1];Threshold1[2]+=Step*error1[2];}Threshold2[0]+=Step*error2[0];//调整权值{Weight01[0][0]+=Step*i1*error1[0];Weight01[0][1]+=Step*i1*error1[1];Weight01[0][2]+=Step*i1*error1[2];Weight01[1][0]+=Step*i2*error1[0];Weight01[1][1]+=Step*i2*error1[1];Weight01[1][2]+=Step*i2*error1[2];Weight01[2][0]+=Step*i3*error1[0];Weight01[2][1]+=Step*i3*error1[1];Weight01[2][2]+=Step*i3*error1[2];Weight01[3][0]+=Step*i4*error1[0];Weight01[3][1]+=Step*i4*error1[1];Weight01[3][2]+=Step*i4*error1[2];Weight01[4][0]+=Step*i5*error1[0];Weight01[4][1]+=Step*i5*error1[1];Weight01[4][2]+=Step*i5*error1[2];}Weight12[0][0]+=Step*Hide1*error2[0];Weight12[1][0]+=Step*Hide2*error2[0];Weight12[2][0]+=Step*Hide3*error2[0];return out;}public static double run(double i1,double i2,double i3,double i4,double i5){double Hide1,Hide2,Hide3,out;Hide1=1*Threshold1[0]+i1*Weight01[0][0]+i2*Weight01[1][0]+i3*Weight01[2][0]+i4*Weight01[3][0]+i5*Weight01[4][0];Hide2=1*Threshold1[1]+i1*Weight01[0][1]+i2*Weight01[1][1]+i3*Weight01[2][1]+i4*Weight01[3][1]+i5*Weight01[4][1];Hide3=1*Threshold1[2]+i1*Weight01[0][2]+i2*Weight01[1][2]+i3*Weight01[2][2]+i4*Weight01[3][2]+i5*Weight01[4][2];Hide1=transfer(Hide1);Hide2=transfer(Hide2);Hide3=transfer(Hide3);out=1*Threshold2[0]+Hide1*Weight12[0][0]+Hide2*Weight12[1][0]+Hide3*Weight12[2][0];return transfer(out);}public static void print(){System.out.println("权值Weight01:");for(int i=0;i<L0;i++){for(int j=0;j<L1;j++){System.out.print(Weight01[i][j]+"");}System.out.println();}System.out.println("权值Weight12:");for(int i=0;i<L1;i++){for(int j=0;j<L2;j++){System.out.print(Weight12[i][j]+"");}System.out.println();}System.out.println("阈值Threshold1:");for(int i=0;i<L1;i++){System.out.print(Threshold1[i]+"");}System.out.println("\n阈值Threshold2:");for(int i=0;i<L2;i++){System.out.print(Threshold2[i]+"");}System.out.println("\n权值阈值打印完毕!");}public static void main(String[] args) {getData();init();for(int i=0;i<TrainTimes;i++){train(Data[0][0],Data[0][1],Data[0][2],Data[0][3],Data[0][4],Data[0][5]);train(Data[1][0],Data[1][1],Data[1][2],Data[1][3],Data[1][4],Data[1][5]);train(Data[2][0],Data[2][1],Data[2][2],Data[2][3],Data[2][4],Data[2][5]);train(Data[3][0],Data[3][1],Data[3][2],Data[3][3],Data[3][4],Data[3][5]);train(Data[4][0],Data[4][1],Data[4][2],Data[4][3],Data[4][4],Data[4][5]);}print();double result=run(Data[5][0],Data[5][1],Data[5][2],Data[5][3],Data[5][4]);result=result*(Max[5]-Min[5])+Min[5];System.out.println("预测值:"+result);double act=Data[5][5]*(Max[5]-Min[5])+Min[5];System.out.println("实际值:"+act);}}


 

5、  运行结果

 

权值Weight01:

-0.8870265840753442  -1.411667526758367   -1.3711018193180835 

-1.4361644068349546  -1.2357329039660891  -0.7446145691811765 

-1.2926210204908846  -0.40827529629832776 -1.695546795295116  

0.6962419242925223   -0.2984534175795556  -0.18596873411075834

-6.043997287856981   -1.9547170477973128  -3.384013297247308  

权值Weight12:

-7.417833707927703  

-2.8633915801971908 

-4.768225047851177  

阈值Threshold1:

3.993345698425868 1.9394469774422567   3.096237179782667

阈值Threshold2:

5.804060219460048

权值阈值打印完毕!

预测值:1789.302733863499

实际值:1790.0

6、  训练前5组数据,测试最后一组数据。

原创粉丝点击