训练感知器

  • 创建一个感知器对象
  • 创建一个培训功能
  • 火车针对正确答案的感知器

训练任务

想象一下在具有分散 xy 点的空间中的一条直线。

训练感知器对线上方和下方的点进行分类。


创建感知器对象

创建一个感知器对象。给它起任何名字(比如感知器)。

让感知器接受两个参数:

  1. 输入数量(个)
  2. 学习率(learningRate)。

将默认学习率设置为 0.00001。

然后为每个输入创建 -1 到 1 之间的随机权重。

示例

// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {

// Set Initial Values
this.learnc = learningRate;
this.bias = 1;

// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// End Perceptron Object
}

随机权重

感知器将从随机权重对于每个输入。

学习率

对于每个错误,在训练感知器时,权重都会进行一小部分调整。

这个小部分就是“感知器的学习率”。

在感知器对象中我们称之为学习

偏见

有时,如果两个输入都为零,感知器可能会产生不正确的输出。

为了避免这种情况,我们为感知器提供了一个值为 1 的额外输入。

这被称为偏见



添加激活功能

记住感知器算法:

  • 将每个输入乘以感知器的权重
  • 对结果求和
  • 计算结果

示例

this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs[i] * this.weights[i];
  }
  if (sum > 0) {return 1} else {return 0}
}

激活函数将输出:

  • 如果总和大于 0,则为 1
  • 如果总和小于 0,则为 0

创建训练函数

训练函数根据激活函数猜测结果。

每次猜测错误时,感知器都应该调整权重。

经过多次猜测和调整,权重就会正确。

示例

this.train = function(inputs, desired) {
  inputs.push(this.bias);
  let guess = this.activate(inputs);
  let error = desired - guess;
  if (error != 0) {
    for (let i = 0; i < inputs.length; i++) {
      this.weights[i] += this.learnc * error * inputs[i];
    }
  }
}

亲自试一试 »


反向传播

每次猜测后,感知器都会计算猜测的错误程度。

如果猜测错误,感知器会调整偏差和权重,以便下次猜测会更正确一些。

这种类型的学习称为反向传播

经过尝试(几千次)后,你的感知器将变得非常善于猜测。


创建您自己的图书馆

图书馆代码

// Perceptron Object
function Perceptron(no, learningRate = 0.00001) {

// Set Initial Values
this.learnc = learningRate;
this.bias = 1;

// Compute Random Weights
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights[i] = Math.random() * 2 - 1;
}

// Activate Function
this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs[i] * this.weights[i];
  }
  if (sum > 0) {return 1} else {return 0}
}

// Train Function
this.train = function(inputs, desired) {
  inputs.push(this.bias);
  let guess = this.activate(inputs);
  let error = desired - guess;
  if (error != 0) {
    for (let i = 0; i < inputs.length; i++) {
      this.weights[i] += this.learnc * error * inputs[i];
    }
  }
}

// End Perceptron Object
}

现在您可以在 HTML 中包含该库:

<script src="myperceptron.js"></script>

使用你的图书馆

示例

// Initiate Values
const numPoints = 500;
const learningRate = 0.00001;

// Create a Plotter
const plotter = new XYPlotter("myCanvas");
plotter.transformXY();
const xMax = plotter.xMax;
const yMax = plotter.yMax;
const xMin = plotter.xMin;
const yMin = plotter.yMin;

// Create Random XY Points
const xPoints = [];
const yPoints = [];
for (let i = 0; i < numPoints; i++) {
  xPoints[i] = Math.random() * xMax;
  yPoints[i] = Math.random() * yMax;
}

// Line Function
function f(x) {
  return x * 1.2 + 50;
}

//Plot the Line
plotter.plotLine(xMin, f(xMin), xMax, f(xMax), "black");

// Compute Desired Answers
const desired = [];
for (let i = 0; i < numPoints; i++) {
  desired[i] = 0;
  if (yPoints[i] > f(xPoints[i])) {desired[i] = 1}
}

// Create a Perceptron
const ptron = new Perceptron(2, learningRate);

// Train the Perceptron
for (let j = 0; j <= 10000; j++) {
  for (let i = 0; i < numPoints; i++) {
    ptron.train([xPoints[i], yPoints[i]], desired[i]);
  }
}

// Display the Result
for (let i = 0; i < numPoints; i++) {
  const x = xPoints[i];
  const y = yPoints[i];
  let guess = ptron.activate([x, y, ptron.bias]);
  let color = "black";
  if (guess == 0) color = "blue";
  plotter.plotPoint(x, y, color);
}

亲自试一试 »