【发布时间】:2017-03-27 18:47:42
【问题描述】:
所以我试图用一个感知器来训练一个或门。问题是它不起作用。错误的是 0 0 -> 期望 = 0,实际 = 1。而且那个不会改变。
此外,当我放置要测试的权重时,它们似乎也根本不起作用,但这可能是我的 testOut 函数有问题。
public class Temp {
double[][] data = {{0.d, 0.d}, {0.d, 1.d}, {1.d, 0.d}, {1.d, 1.d}};
double[] outputs = {0.d, 1.d, 1.d, 1.d};
double[][] weights = {
{ThreadLocalRandom.current().nextDouble(-.5, .5),
ThreadLocalRandom.current().nextDouble(-.5, .5)},
{ThreadLocalRandom.current().nextDouble(-.5, .5),
ThreadLocalRandom.current().nextDouble(-.5, .5)},
{ThreadLocalRandom.current().nextDouble(-.5, .5),
ThreadLocalRandom.current().nextDouble(-.5, .5)},
{ThreadLocalRandom.current().nextDouble(-.5, .5),
ThreadLocalRandom.current().nextDouble(-.5, .5)}
};
public double[][] train(int maxEpoch, double threshhold) {
for (int i = 0; i < maxEpoch; i++) {
System.out.println("EPOCH " + i);
double sum = 0.0d;
double actualOutput = 0.0d;
double[] ep = new double[outputs.length];
for (int j = 0; j < data.length; j++) {
for (int k = 0; k < data[j].length; k++) {
sum += data[j][k] * weights[j][k];
}
actualOutput = step(sum - threshhold);
ep[j] = outputs[j] - actualOutput;
for (int k = 0; k < data[j].length; k++) {
weights[j][k] = weights[j][k] + .1 * data[j][k] * ep[j];
}
System.out.println("output " + j + " " + actualOutput + " " + outputs[j] +" - " + ep[j]);
}
}
return weights;
}
public void testOut(double[][] data, double[][] weights, double threshhold){
double sum = 0;
double[] actualOutput = new double[data.length];
for (int j = 0; j < data.length; j++) {
for (int k = 0; k < data[j].length; k++) {
sum += data[j][k] * weights[j][k];
}
actualOutput[j] = step(sum - threshhold);
}
System.out.println(Arrays.toString(actualOutput));
}
public static void main(String[] args) {
Temp t = new Temp();
double[][] weights = t.train(200, 0);
t.testOut(t.data, weights, .5);
}
}
任何帮助表示赞赏。
编辑:step(sum - threshold) 是阶跃函数。
public static int step(double x) {
return x >= 0.d ? 1 : 0;
}
【问题讨论】:
-
能否也提供steps()方法定义??
-
public static int step(double x) { return x >= 0.d ? 1:0; }
-
O/p 类似于:EPOCH 0............,EPOCH 1........,----EPOCH 199。然后在哪里 ru遇到问题??你到底想要什么??
-
基本上我把数据放在 x1, x2 值中,输出应该代表一个或门,所以 0 0 -> 0, 0 1 -> 1 等...问题是它没有t 收敛(有 200 个 epoch,这很多。实际上应该在 ~5 内收敛)。所以我不断得到 0 0 -> 1,这是一个错误,不应该是这种情况。
标签: java artificial-intelligence perceptron