访问main方法之外的指定变量

时间:2017-07-09 21:12:14

标签: java

一天中的好时光,大家好!我是新来的,试图为Java课程做好准备。现在我正在重新创建由YouTube上的The Coding Train编写的代码,该代码模拟了一个简单的感知器。我有一个单独的文件,我输入输入的值(3个数字),创建一个类Perceptron的对象p,然后得到p.guess。但是,它给出了0.0的结果。这是可能的,因为它是signum的有效输出,但不是所有时间。在这里,我缺乏Java知识让我失望。猜测是否必须识别对权重数组所做的更改?我认为它只是在乘法时使用最初创建的空数组...我该如何解决这个问题?我用页面末尾的代码调用它:

import java.io.*;
import java.lang.*;
import java.util.*;
public class Perceptron {
static double[] weights = new double [3];
    public static void main(String[] args){
        for (int i = 0; i<weights.length; i++){
            weights[i] = randomNumber(-1, 1);
        }
        System.out.println(Arrays.toString(weights));
    }
    public static double guess(double[] inputs){
        double sum = 0;
        for (int i = 0; i < weights.length; i++){
            sum += weights[i]*inputs[i];
        }
        double myguess = Math.signum(sum);
        return myguess;
    }
    public static double randomNumber(int min, int max) {
        double d = Math.random()*(max - min) + min;
        return d;
    }
}


public class myTest{
    public static void main(String[] args){
        Perceptron p = new Perceptron();
        double inputs[] = {-1, 0.5, -0.5};
        double eval = p.guess(inputs);
        System.out.println(eval);
    }
}

1 个答案:

答案 0 :(得分:0)

同意,零极不可能。我可以看到这种可能性的唯一方法是,如果您传递给猜测的输入都是零,可能将其添加到您的猜测方法中进行检查;

System.out.println(Arrays.toString(inputs)); 

您可以传递一些已知值来测试它的工作方式;

public static double guessWithKnownValues () {
    final double[] knownValues = {-0.1d,0.1d,-0.1d};
    final double guess = guess(knownValues);
    System.out.println(guess(knownValues));
    return guess;
}

关于权重数组 - 是的,猜测会注意到这个数组的更新,对main和guess方法中权重数组的引用指向数组的同一个实例。

作为对编辑的回应:当您将测试和perecptron作为单独的进程运行时,是的,权重尚未初始化 - 您的怀疑是正确的。摆脱静态并尝试像这样编写Percepton类,然后运行测试。

public class Perceptron {
    double[] weights = new double [3];

    public Perceptron() {
        for (int i = 0; i<weights.length; i++){
            weights[i] = randomNumber(-1, 1);
        }
    }

    public double guess(double[] inputs){
        double sum = 0;
        for (int i = 0; i < weights.length; i++){
            sum += weights[i]*inputs[i];
        }
        double myguess = Math.signum(sum);
        return myguess;
    }

    public double randomNumber(int min, int max) {
        double d = Math.random()*(max - min) + min;
        return d;
    }
}