Simple Perceptron using Processing

This code is mainly based on Processing, a flexible software sketchbook for visualizing things and arts.

First, we derive a class named Perceptron with two useful method guess and train.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int sign(float n) {
if (n >= 0) {
return 1;
} else {
return -1;
}
}

class Perceptron {
float[] weights = new float[2];
float lr = 0.2;

// constructor
Perceptron() {
// initialize the weight randomly
for (int i = 0; i < weights.length; i++) {
weights[i] = random(-1, 1);
}
}

int guess(float[] inputs) {
float sum = 0;
for (int i = 0; i < weights.length; i++) {
sum += inputs[i] * weights[i];
}
int output = sign(sum);
return output;
}

void train(float[] inputs, int target) {
int guess = guess(inputs);
int error = target - guess;

for (int i = 0; i < weights.length; i++) {
weights[i] += error * inputs[i] * lr;
}
}
}

To specify the training procession using a simple perceptron, we activate a sketchbook named Training.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Point {
float x;
float y;
int label;

Point() {
x = random(width);
y = random(height);

if (x > y) {
label = 1;
} else {
label = -1;
}
}

void show() {
stroke(0);
if (label == 1) {
fill(255);
} else {
fill(0);
}
ellipse(x, y, 32, 32);
}
}

Now, come to our basic purpose. Draw random samples and make trainings. Here is the main sketchbook file SimplePerceptron.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Perceptron brain;

Point[] points = new Point[100];

int trainingIndex = 0;

void setup() {
size(800, 800);
brain = new Perceptron();

for (int i = 0; i< points.length; i++) {
points[i] = new Point();
}
float[] inputs = {-1, 0.5};
int guess = brain.guess(inputs);
println(guess);
}

void draw() {
background(255);
stroke(0);
line(0, 0, width, height);
for (Point pt : points) {
pt.show();
}

for (Point pt : points) {
float[] inputs = {pt.x, pt.y};

int target = pt.label;
int guess = brain.guess(inputs);

if (guess == target) {
fill(0, 255, 0);
} else {
fill(255, 0, 0);
}

noStroke();
ellipse(pt.x, pt.y, 16, 16);
}

Point training = points[trainingIndex];
float[] inputs = {training.x, training.y};
int target = training.label;
brain.train(inputs, target);
trainingIndex++;
if (trainingIndex == points.length) {
trainingIndex = 0;
}
}

Simply click the run button, Processing will help start an interative interface (similar to the canvas) and render the result below.



文章作者: Monad Kai
文章链接: onlookerliu.github.io/2018/02/26/Simple-Perceptron-using-Processing/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Code@浮生记
支付宝打赏
微信打赏