package y6;
public class pro {
int datanumber,number;
int[] y=new int[201];
int[][] e=new int[201][4];
double sig;
double[] delta=new double[3];
double[] ddelta=new double[3];
double dsig;
public static void main(String[] args) {
pro t=new pro();
}
pro(){
datanumber=100;
number=2;
int s;
for(s=1;s<datanumber+1;s++){
e[s][1]=0;
if(Math.random()>0.5)e[s][1]=1;
e[s][2]=0;
if(Math.random()>0.5)e[s][2]=1;
int h=0;
if(e[s][1]>0.5)h=h+1;
if(e[s][2]>0.5)h=h+1;
if(Math.random()>0.2)h=h+1;
y[s]=0;
if(h==3)y[s]=1;
}
sig=0;
delta[1]=0;
delta[2]=0;
int mode=0;
while(mode<100){
ex_fin sub=new ex_fin();
sub.delta=delta;
sub.sig=sig;
sub.y=y;
sub.e=e;
sub.datanumber=datanumber;
sub.number=number;
double u1=sub.makedata();
double de=0.01;
ex_fin sub2=new ex_fin();
sub2.delta=delta;
sub2.sig=sig+de;
sub2.y=y;
sub2.e=e;
sub2.datanumber=datanumber;
sub2.number=number;
double u2=sub2.makedata();
dsig=(u2-u1)/de;
double[] deltax=new double[3];
for(s=1;s<number+1;s++){
int sx;
for(sx=1;sx<number+1;sx++){
deltax[sx]=delta[sx];
}
deltax[s]=deltax[s]+de;
ex_fin sub3=new ex_fin();
sub3.delta=deltax;
sub3.sig=sig;
sub3.y=y;
sub3.e=e;
sub3.datanumber=datanumber;
sub3.number=number;
double u3=sub3.makedata();
ddelta[s]=(u3-u1)/de;
}
double du=u1/100;
double dz=dsig*dsig;
for(s=1;s<number+1;s++){
dz=dz+ddelta[s]*ddelta[s];
}
double t=du/dz;
if(dz<0.001)mode=10000;
for(s=1;s<number+1;s++){
deltax[s]=delta[s]+t*ddelta[s];
}
ex_fin sub4=new ex_fin();
sub4.delta=deltax;
sub4.sig=sig+t*dsig;
sub4.y=y;
sub4.e=e;
sub4.datanumber=datanumber;
sub4.number=number;
double u4=sub4.makedata();
if(u4>u1){
sig=sig+dsig*t;
for(s=1;s<number+1;s++){
delta[s]=deltax[s];
}
}
if(u1>u4)mode=10000;
mode=mode+1;
}
for(s=1;s<datanumber+1;s++){
double y1=sig+delta[1]*e[s][1]+delta[2]*e[s][2];
double y2=1/(1+Math.exp(-y1));
System.out.println(y2+","+e[s][1]+","+e[s][2]);
}
}}
package y6;
public class ex_fin {
int datanumber,number;
int[] y=new int[201];
int[][] e=new int[201][4];
double sig;
double[] delta=new double[3];
double makedata(){
int s,sx;
double zz=0;
for(s=1;s<datanumber+1;s++){
double z=sig;
for(sx=1;sx<number+1;sx++){
z=z+delta[sx]*e[s][sx];
}
double z1=1/(1+Math.exp(-z));
if(y[s]>0.5)zz=zz+(z1-1)*(z1-1);
if(y[s]<0.5)zz=zz+z1*z1;
}
return zz;
}
}
最終更新:2016年12月24日 18:20