我试图学习神经网络,并从感知器开始。 我看了一些教程并完全按照它们进行操作,但它对我不起作用。
var canvas = document.querySelector('canvas')
canvas.width = innerWidth;
canvas.height = innerHeight;
var c = canvas.getContext('2d')
function sign(val) {
if (val >= 0) {
return 1
} else {
return -1
}
}
class Perceptron {
constructor(num) {
this.weights = []
this.lr = 0.1
for (var i = 0; i < num; i++) {
this.weights.push(Math.random() * 2 - 1)
}
}
guess(inputs) {
var sum = 0
for (var i = 0; i < this.weights.length; i++) {
sum += this.weights[i] * inputs[i]
}
var output = sign(sum)
return output
}
train(inputs, target) {
var guess = this.guess(inputs)
var error = target - guess
for (var i = 0; i < this.weights.length; i++) {
this.weights[i] += error * inputs[i] * this.lr
}
}
}
var brain = new Perceptron(2)
var points = []
class Point {
constructor(x, y) {
this.x = x
this.y = y
this.label = 0
c.lineWidth = 2
if (this.y < canvas.height / 2) {
this.label = 1
} else if (this.y > canvas.height / 2) {
this.label = -1
}
}
draw() {
c.beginPath()
c.arc(this.x, this.y, 10, 0, Math.PI * 2, false)
c.fill()
if (this.label == 1) {
c.stroke()
}
}
update() {
this.draw()
}
}
for (var i = 0; i < 100; i++) {
points.push(new Point(Math.random() * canvas.width, Math.random() * canvas.height))
}
function animate() {
requestAnimationFrame(animate)
c.clearRect(0, 0, canvas.width, canvas.height)
points.forEach(point => {
brain.train([point.x, point.y], point.label)
var guess = brain.guess([point.x, point.y])
if (guess == point.label) {
c.fillStyle = "green"
} else {
c.fillStyle = "red"
}
point.update()
})
}
animate()
* {
margin: 0;
padding: 0;
}
canvas {
position: absolute;
}
<canvas></canvas>
这是我的代码
谁能告诉我这是怎么回事?
我的目标是让感知器对点进行分类,其中屏幕一半以上的点应具有 1 的值,而屏幕一半以下的点应具有 -1 的值