【发布时间】:2019-01-03 11:24:40
【问题描述】:
即使我添加了偏差,我的感知器也找不到正确的 y 轴截距。斜率是正确的。这是我第二次尝试从头开始编写感知器,我两次遇到相同的错误。 感知器评估画布上的点是高于还是低于截线。输入是 x 坐标、y 坐标和 1 表示偏差。
感知器类:
class Perceptron
{
float[] weights;
Perceptron(int layerSize)
{
weights = new float[layerSize];
for (int i = 0; i < layerSize; i++)
{
weights[i] = random(-1.0,1.0);
}
}
float Evaluate(float[] input)
{
float sum = 0;
for (int i = 0; i < weights.length; i++)
{
sum += weights[i] * input[i];
}
return sum;
}
float Learn(float[] input, int expected)
{
float guess = Evaluate(input);
float error = expected - guess;
for (int i = 0; i < weights.length; i++)
{
weights[i] += error * input[i] * 0.01;
}
return guess;
}
}
这是测试代码:
PVector[] points;
float m = 1; // y = mx+q (in canvas space)
float q = 0; //
Perceptron brain;
void setup()
{
size(600,600);
points = new PVector[100];
for (int i = 0; i < points.length; i++)
{
points[i] = new PVector(random(0,width),random(0,height));
}
brain = new Perceptron(3);
}
void draw()
{
background(255);
DrawGraph();
DrawPoints();
//noLoop();
}
void DrawPoints()
{
for (int i = 0; i < points.length; i++)
{
float[] input = new float[] {points[i].x / width, points[i].y / height, 1};
int expected = ((m * points[i].x + q) < points[i].y) ? 1 : 0; // is point above line
float output = brain.Learn(input, expected);
fill(sign(output) * 255);
stroke(expected*255,100,100);
strokeWeight(3);
ellipse(points[i].x, points[i].y, 20, 20);
}
}
int sign(float x)
{
return x >= 0 ? 1 : 0;
}
void DrawGraph()
{
float y1 = 0 * m + q;
float y2 = width * m + q;
stroke(255,100,100);
strokeWeight(3);
line(0,y1,width,y2);
}
【问题讨论】:
-
您将不得不做一些debugging 来确定您的代码行为与您预期的不同之处。尝试break your problem down into smaller steps 并发布仅一步的minimal reproducible example。祝你好运。
-
@KevinWorkman 感谢您的回复。我测试了一下,发现问题是我必须在计算错误之前对结果“签名”。
-
不客气。您要发布答案,还是希望我将评论扩展为答案?
-
我可以发布答案
标签: java neural-network processing perceptron