菜单
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP 使用方法 W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

机器学习

循环学习

ML 模型通过多次循环数据来训练

每次迭代都会调整权重值

当迭代无法降低成本时,训练完成。

训练我找到最佳拟合线

自己动手试一试 »


梯度下降

梯度下降是解决 AI 问题的流行算法。

简单的线性回归模型可用于演示梯度下降。

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

以上示例就是这样做的。

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

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

下面是一个可以解决此问题(以及许多其他问题)的Trainer 对象的代码。


Trainer 对象

创建一个 Trainer 对象,它可以接受任意数量的 (x,y) 值到两个数组(xArr, yArr)中。

将权重设置为零,偏差设置为 1。

必须设置学习常数(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;


成本函数

解决回归问题的标准方法是使用“成本函数”来衡量解决方案的好坏。

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

计算此误差的方法是遍历图中的所有 (x,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;
}

成本函数的另一个名称是误差函数

函数中使用的公式实际上是这个

Formula
  • 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.00001;
  this.weight = 0;
  this.bias = 1;
  this.cost;

// 成本函数
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;
}

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

// 更新权重函数
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;
}

} // Trainer 对象结束

现在你可以在 HTML 中包含该库

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

自己动手试一试 »


×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持