JavaScript Перцептрон неточный - PullRequest
       44

JavaScript Перцептрон неточный

0 голосов
/ 26 сентября 2018

Я новичок в машинном обучении и создаю свой первый персептрон с помощью 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-перехвата)

Есть идеи, что не так?Я пытался изменить скорость обучения, размер данных и количество итераций обучения, но результат, похоже, тот же.Любая критика кода также приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...