Я новичок в машинном обучении и создаю свой первый персептрон с помощью JavaScript.
Я использую p5.js для рисования чего-то.
Вот что у меня такдалеко:
const data = [];
const screenWidth = 500;
const screenHeight = 500;
let count = 0
const results = []
function setup() {
createTrainingData();
perc = new Perceptron();
// Training my Perceptron
for (let i = 0; i < 10; i++) {
for (let a = 0; a < data.length; a++) {
perc.train(data[a]);
}
}
// Create results where I check the computed version
for (let i = 0; i < data.length; i++) {
results.push({x: data[i].x, y: data[i].y, label: perc.compute(data[i])});
}
}
function draw() {
createCanvas(screenWidth, screenHeight);
background(0);
stroke(255);
// Draw Solution Line
line(0, screenHeight - solution(0), screenWidth, screenHeight - solution(500))
// Draw Results
for (const r of results) {
if (r.label == 1) {
stroke(100);
} else {
stroke(255);
}
strokeWeight(5)
fill(250)
point(r.x, screenHeight - r.y);
}
}
function createTrainingData() {
for (let i = 0; i < 1000; i++) {
const x = random(0, screenWidth);
const y = random(0, screenHeight);
let label;
if (y < solution(x)) {
label = -1;
} else {
label = 1;
}
data.push({x: x, y: y, label: label});
}
}
function solution(x) {
return 0.5 * x + 100;
}
class Perceptron{
constructor() {
this.w1 = random(-1, 1); // Weight for X values
this.w2 = random(-1, 1); // Weight for Y values
this.learningRate = 0.0001
}
train(data) {
const computed = this.compute(data);
const desired = data.label;
const error = desired - computed
this.w1 += this.learningRate * error * data.x;
this.w2 += this.learningRate * error * data.y;
console.log(error)
}
compute(input) {
const result = input.x * this.w1 + input.y * this.w2;
if (result < 0) {
return -1
} else {
return 1
}
}
}
<html>
<head>
<script language="javascript" type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.8/p5.js"></script>
<script language="javascript" type="text/javascript" src="perceptron.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
</head>
<body>
</body>
</html>
Перцептрон может получить только 2 входа: X и Y. Таким образом, он имеет только 2 веса.Я не использую никакого смещения.
Однако мой персептрон кажется немного (слишком крутым и без y-перехвата)
Есть идеи, что не так?Я пытался изменить скорость обучения, размер данных и количество итераций обучения, но результат, похоже, тот же.Любая критика кода также приветствуется.