训练感知器
- 创建一个 感知器对象
- 创建一个 训练功能
- 火车 感知器与正确答案
训练任务
想象空间中有一条直线,上面有散布的 xy 点。
训练感知器对线上和线下的点进行分类。
创建感知器对象
创建一个感知器对象。将其命名为任意名称(例如“感知器”)。
让感知器接受两个参数:
- 输入数量(无)
- 学习率(learningRate)。
将默认学习率设置为 0.00001。
然后为每个输入创建 -1 到 1 之间的随机权重。
例子
// 感知器对象
函数感知器(否,学习率 = 0.00001){
// 设置初始值
this.learnc = 学习率;
这个.偏见=1;
// 计算随机权重
这个.权重 = [];
对于(设 i = 0;i <= 否;i++){
这个.权重[i] = Math.random() * 2 - 1;
}
// 结束感知器对象
}
随机权重
感知器将首先 随机权重 对于每个输入。
学习率
对于每个错误,在训练感知器时,权重将进行一小部分调整。
这一小部分就是“感知器的学习率".
在感知器对象中我们称它为 学习.
偏见
有时,如果两个输入都为零,感知器可能会产生错误的输出。
为了避免这种情况,我们给感知器一个额外的输入,值为 1。
这被称为 偏见.
添加激活函数
记住感知器算法:
- 将每个输入与感知器的权重相乘
- 总结结果
- 计算结果
例子
this.activate = 函数(输入){
设总和=0;
对于(让 i = 0; i < 输入.长度; i++){
总和 += 输入[i] * 这个.权重[i];
}
如果 (总和 > 0) {返回 1} 否则 {返回 0}
}
激活函数将输出:
- 如果总和大于 0,则为 1
- 如果总和小于 0,则为 0
创建训练函数
训练函数根据激活函数猜测结果。
每次猜测错误时,感知器就应该调整权重。
经过多次猜测和调整后,权重就会正确。
例子
this.train = 函数(输入,期望){
输入.推送(这个.偏见);
让 guess = this.activate(inputs);
让错误 = 期望 - 猜测;
如果 (错误 != 0) {
对于(让 i = 0; i < 输入.长度; i++){
this.weights[i] += this.learnc * 错误 * 输入[i];
}
}
}
反向传播
每次猜测之后,感知器都会计算出猜测的错误程度。
如果猜测错误,感知器就会调整偏差和权重,以便下次猜测会更正确一些。
这种学习方式被称为 反向传播.
经过尝试(几千次)后,你的感知器将变得非常擅长猜测。
创建自己的图书馆
图书馆代码
// 感知器对象
函数感知器(否,学习率 = 0.00001){
// 设置初始值
this.learnc = 学习率;
这个.偏见=1;
// 计算随机权重
这个.权重 = [];
对于(设 i = 0;i <= 否;i++){
这个.权重[i] = Math.random() * 2 - 1;
}
// 激活函数
this.activate = 函数(输入){
设总和=0;
对于(让 i = 0; i < 输入.长度; i++){
总和 += 输入[i] * 这个.权重[i];
}
如果 (总和 > 0) {返回 1} 否则 {返回 0}
}
// 训练函数
this.train = 函数(输入,期望){
输入.推送(这个.偏见);
让 guess = this.activate(inputs);
让错误 = 期望 - 猜测;
如果 (错误 != 0) {
对于(让 i = 0; i < 输入.长度; i++){
this.weights[i] += this.learnc * 错误 * 输入[i];
}
}
}
// 结束感知器对象
}
现在您可以将该库包含在 HTML 中:
<script src="myperceptron.js"></script>
使用你的图书馆
例子
// 初始化值
const numPoints = 500;
const 学习率 = 0.00001;
// 创建绘图仪
const 绘图仪 = new XYPlotter (“myCanvas”);
绘图仪.transformXY();
const xMax = 绘图仪.xMax;
const yMax = 绘图仪.yMax;
const xMin = 绘图仪.xMin;
const yMin = 绘图仪.yMin;
// 创建随机 XY 点
const xPoints = [];
const yPoints = [];
对于(让 i = 0; i < numPoints; i++){
xPoints[i] = Math.random() * xMax;
yPoints[i] = Math.random() * yMax;
}
// 线函数
函数 f(x) {
返回 x * 1.2 + 50;
}
//绘制线条
绘图仪.plotLine(xMin,f(xMin),xMax,f(xMax),“黑色”);
// 计算所需答案
const 期望 = [];
对于(让 i = 0; i < numPoints; i++){
期望[i] = 0;
如果 (yPoints[i] > f(xPoints[i])) {desired[i] = 1}
}
// 创建一个感知器
const ptron = new Perceptron(2,学习率);
// 训练感知器
对于(设 j = 0;j <= 10000;j++){
对于(让 i = 0; i < numPoints; i++){
ptron.train([xPoints[i], yPoints[i]],desired[i]);
}
}
// 显示结果
对于(让 i = 0; i < numPoints; i++){
const x = xPoints[i];
const y = yPoints[i];
让 guess = ptron.activate([x, y, ptron.bias]);
让颜色=“黑色”;
如果(猜测==0)颜色=“蓝色”;
绘图仪.plotPoint(x, y,颜色);
}