LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 370|回复: 0

训练感知器

[复制链接]
发表于 2024-1-18 18:40:28 | 显示全部楼层 |阅读模式


创建感知器对象
创建一个感知器对象。 将其命名为任何名称(例如 Perceptron)。

让感知器接受两个参数:

输入数量(否)
学习率 (learningRate)。
将默认学习率设置为 0.00001。

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

实例
// 感知器对象
function Perceptron(no, learningRate = 0.00001) {

// 设置初始值
this.learnc = learningRate;
this.bias = 1;

// 计算随机权重
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights = Math.random() * 2 - 1;
}

// 结束感知器对象
}
随机权重
感知器将从每个输入的随机权重开始。

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

这小部分是"感知器的学习率"。

在 Perceptron 对象中,我们称之为 learnc。

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

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

这称为偏差。

添加激活函数
记住感知器算法:

将每个输入与感知器的权重相乘
总结结果
计算结果
实例
this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs * this.weights;
  }
  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 += this.learnc * error * inputs;
    }
  }
}

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

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

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

在尝试(几千次)之后,你的感知器会变得非常擅长猜测。

创建您自己的库
库代码
// 感知器对象
function Perceptron(no, learningRate = 0.00001) {

// 设置初始值
this.learnc = learningRate;
this.bias = 1;

// 计算随机权重
this.weights = [];
for (let i = 0; i <= no; i++) {
  this.weights = Math.random() * 2 - 1;
}

// 激活函数
this.activate = function(inputs) {
  let sum = 0;
  for (let i = 0; i < inputs.length; i++) {
    sum += inputs * this.weights;
  }
  if (sum > 0) {return 1} else {return 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 += this.learnc * error * inputs;
    }
  }
}

// 结束感知器对象
}
现在您可以在 HTML 中包含该库:

<script src="myperceptron.js"></script>
使用您的库
实例
// 初始化值
const numPoints = 500;
const learningRate = 0.00001;

// 创建绘图仪
const plotter = new XYPlotter("myCanvas");
plotter.transformXY();
const xMax = plotter.xMax;
const yMax = plotter.yMax;
const xMin = plotter.xMin;
const yMin = plotter.yMin;

// 创建随机 XY 点
const xPoints = [];
const yPoints = [];
for (let i = 0; i < numPoints; i++) {
  xPoints = Math.random() * xMax;
  yPoints = Math.random() * yMax;
}

// 线函数
function f(x) {
  return x * 1.2 + 50;
}

// 画线
plotter.plotLine(xMin, f(xMin), xMax, f(xMax), "black");

// 计算期望的答案
const desired = [];
for (let i = 0; i < numPoints; i++) {
  desired = 0;
  if (yPoints > f(xPoints)) {desired = 1}
}

// 创建一个感知器
const ptron = new Perceptron(2, learningRate);

// 训练感知器
for (let j = 0; j <= 10000; j++) {
  for (let i = 0; i < numPoints; i++) {
    ptron.train([xPoints, yPoints], desired);
  }
}

// 显示结果
for (let i = 0; i < numPoints; i++) {
  const x = xPoints;
  const y = yPoints;
  let guess = ptron.activate([x, y, ptron.bias]);
  let color = "black";
  if (guess == 0) color = "blue";
  plotter.plotPoint(x, y, color);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表