一天中的好时光,大家好!我是新来的,试图为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);
}
}
答案 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;
}
}