为什么这段代码乱序

时间:2016-01-16 08:33:27

标签: java exponentiation

这是我的代码,我按如下方式给出了输入,我删除了用户给出实际输出值的步骤,因为它是在代码中计算的,但仍然会发生同样的事情

“1”表示第一次输入 然后,第一个输入重量为“0.5” “0”然后是第二个输入 然后它的重量为“0.6” 然后,“0”表示所需的输出 然后定义值为“0.002” 学习率为“0.23”。

 package Neural4copy;

import java.util.Scanner;

import java.lang.Math;

public class Demo {

    // inputs are declared
    private int x[][]=new int[1][2];
    //weights are declared
    private double w[][]=new double[1][2];
    private double temp;

    private double z[]=new double[1];
    private double desiredOutput;
    private double actualOutput;
    private double error;
    private double definedValue=0.004;
    private double weightChange[][]=new double[1][2];
    private double learningRate;
    private double epilision=0.000000001;
    private static double zTotal;

    private Scanner user_input= new Scanner(System.in);

    public void getData(){

        for(int j=0;j<x.length;j++){
            for(int i=0;i<x[0].length;i++){
                System.out.println("Enter "+j+"th neuron "+i+"th input values :");
                x[j][i]=user_input.nextInt();
                System.out.println("Enter "+j+"th neuron "+i+" weight of the input value :");
                w[j][i]=user_input.nextDouble();
            }
        }

        System.out.println("Enter the desired Output :");
        desiredOutput=user_input.nextDouble();

        System.out.println("Enter the defined value for checking the condition");
        definedValue=user_input.nextDouble();

        System.out.println("Enter the learning rate");
        learningRate=user_input.nextDouble();

        calculate();


    }

    public void calculate(){

        for(int j=0;j<x.length;j++){
            for(int i=0; i<w[0].length; i++){
                temp=0;
                temp=x[j][i]*w[j][i];


              z[j]+=temp;

            }
            zTotal+=z[j];
            System.out.println("temp value :"+zTotal);
        }   

        System.out.println("ztotal "+zTotal);

        //double negZ= -zTotal;

        double temp2=1+Math.exp(-zTotal);
        actualOutput=1/temp2;
        //actualOutput=1/(1+Math.exp(-zTot));


        System.out.println("actualOutput "+actualOutput);

        if(Math.abs(actualOutput-desiredOutput)>epilision){

            calculateError();
        }
        else{
            printWeights();
        }






    }


    public void calculateError(){
        System.out.println("desired out put :"+desiredOutput+" actual out put :"+actualOutput);
        error=0.5*((desiredOutput-actualOutput)*(desiredOutput-actualOutput));
        System.out.println("error "+error+"\n\n");

        //error=0.003;



        checkingCondition();

    }

    public void checkingCondition(){

        if(error<definedValue){

            printWeights();
        }
        else{

            balanceWeights();
        }

    }


    public void balanceWeights(){

        //System.out.println("new Weights are");
        for(int j=0;j<w.length;j++){

            for(int i=0;i<w[0].length;i++){

                weightChange[j][i]=(-learningRate)*(desiredOutput-actualOutput)*actualOutput*(1-actualOutput)*x[j][i];
                System.out.println("weight change "+weightChange[j][i]);
                w[j][i]+=weightChange[j][i];

                //System.out.print(w[i]+"\t");
            }

        }
        calculate();




    }

    public void printWeights(){
        System.out.print("The balanced weights are: ");


        for(int j=0;j<x.length;j++){
            for(int i=0;i<x[0].length;i++){
                System.out.println("Neuron "+j+"Weight of input"+i+"=\t"+w[j][i]);
            }

        }


    }



}

但是这些代码不按规定运行,而不是先按zTotal方法编码calculate()打印出来。并且输出从zTotal开始为335851.72992330056值,这是不可能的,并且error不会更改它保持值为0.5并且发生finall“StackOverFlowError”。 为什么这个

这是我输出的顶部

weight change 0.0
zTotal :348355.7408125164
temp value :348986.9403243046
ztotal 348986.9403243046
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5


weight change 0.0
weight change 0.0
zTotal :348986.9403243046
temp value :349618.7111663145
ztotal 349618.7111663145
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5


weight change 0.0
weight change 0.0
zTotal :349618.7111663145
temp value :350251.053338546
ztotal 350251.053338546
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5


weight change 0.0
weight change 0.0
zTotal :350251.053338546
temp value :350883.96684099914
ztotal 350883.96684099914
actualOutput 1.0
desired out put :0.0 actual out put :1.0
error 0.5

zTotal :348355.7408125164为什么这是从高值开始

2 个答案:

答案 0 :(得分:0)

我看到了你得到的这些价值观,但他们不在输出的开头,而是进一步下降。请参阅:http://ideone.com/06KyMj

在输出的顶部,我看到:

temp value :0.5
ztotal 0.5
actualOutput 0.6224593312018546
desired out put :0.0 actual out put :0.6224593312018546
error 0.19372780950013005

这可能与输出显示方式有关。有些环境只显示最后几千行,而顶部会被切断。

答案 1 :(得分:-1)

查看您的异常消息,您将看到堆栈(您调用调用方法的方法)...基本的stackoverflow异常。

计算&gt; calculateError&gt; checkingCondition&gt; balanceWeights&gt;的计算

堆栈的大小有限,所以你使用迭代实现,但我认为当神经元值为0或从不时,此代码不会收敛,我没有真正理解这个算法没有注释。