机器学习

梯度下降

梯度下降是解决人工智能问题的流行算法。

一个简单的线性回归模型可以用来演示梯度下降。

线性回归的目标是将线性图拟合到一组 (x,y) 点。 这可以用数学公式来解决。 但是机器学习算法也可以解决这个问题。

上面的例子就是这样做的。

它以散点图和线性模型 (y = wx + b) 开始。

然后它训练模型以找到适合该图的线。 这是通过改变线的权重(斜率)和偏差(截距)来完成的。

下面是一个 Trainer Object 的代码,可以解决这个问题(以及许多其他问题)。


训练器对象

创建一个可以在两个数组 (xArr,yArr) 中获取任意数量 (x,y) 值的 Trainer 对象。

将权重和偏差都设置为零。

必须设置学习常数 (learnc),并且必须定义成本变量:

实例

function Trainer(xArray, yArray) {
  this.xArr = xArray;
  this.yArr = yArray;
  this.points = this.xArr.length;
  this.learnc = 0.00001;
  this.weight = 0;
  this.bias = 1;
  this.cost;


Cost 函数

解决回归问题的标准方法是使用"Cost 函数"来衡量解决方案的好坏。

该函数使用模型的权重和偏差 (y = wx + b) 并根据线与图的拟合程度返回错误。

计算这个误差的方法是遍历图中的所有(x,y)点,然后将每个点的y值与直线之间的平方距离相加。

最常规的方法是对距离求平方(以确保正值)并使误差函数可微。

this.costError = function() {
  total = 0;
  for (let i = 0; i < this.points; i++) {
    total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
  }
  return total / this.points;
}

Cost 函数的另一个名称是Error 函数

函数中使用的公式其实是这样的:

公式
  • E 是误差(成本)
  • N 是观察总数(点)
  • y 是每个观察的值(标签)
  • x 是每个观察的值(特征)
  • m 是斜率(重量)
  • b 是截距(偏差)
  • mx + b 是预测
  • 1/N * N∑1是平方平均值

训练函数

我们现在将运行梯度下降。

梯度下降算法应该将成本函数推向最佳线。

每次迭代都应将 m 和 b 都更新为具有较低成本(错误)的行。

为此,我们添加了一个 train 函数,多次循环遍历所有数据:

this.train = function(iter) {
  for (let i = 0; i < iter; i++) {
    this.updateWeights();
  }
  this.cost = this.costError();
}

更新权重函数

上面的 train 函数应该在每次迭代中更新权重和偏差。

使用两个偏导数计算移动方向:

this.updateWeights = function() {
  let wx;
  let w_deriv = 0;
  let b_deriv = 0;
  for (let i = 0; i < this.points; i++) {
    wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
    w_deriv += -2 * wx * this.xArr[i];
    b_deriv += -2 * wx;
  }
  this.weight -= (w_deriv / this.points) * this.learnc;
  this.bias -= (b_deriv / this.points) * this.learnc;
}

创建您自己的库

库代码

function Trainer(xArray, yArray) {
  this.xArr = xArray;
  this.yArr = yArray;
  this.points = this.xArr.length;
  this.learnc = 0.000001;
  this.weight = 0;
  this.bias = 1;
  this.cost;

// Cost Function
this.costError = function() {
  total = 0;
  for (let i = 0; i < this.points; i++) {
    total += (this.yArr[i] - (this.weight * this.xArr[i] + this.bias)) **2;
  }
  return total / this.points;
}

// Train Function
this.train = function(iter) {
  for (let i = 0; i < iter; i++) {
    this.updateWeights();
  }
  this.cost = this.costError();
}

// Update Weights Function
this.updateWeights = function() {
  let wx;
  let w_deriv = 0;
  let b_deriv = 0;
  for (let i = 0; i < this.points; i++) {
    wx = this.yArr[i] - (this.weight * this.xArr[i] + this.bias);
    w_deriv += -2 * wx * this.xArr[i];
    b_deriv += -2 * wx;
  }
  this.weight -= (w_deriv / this.points) * this.learnc;
  this.bias -= (b_deriv / this.points) * this.learnc;
}

} // End Trainer Object

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

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

亲自试一试 »