随机梯度下降算法

一、算法思想

随机梯度下降算法就是不停地寻找某个节点中下降幅度最大的那个趋势进行迭代计算,直到将数据收缩到符合要求的范围之内。

误差公式:


关键的一点是如何调整theta值,使误差函数J最小化。J函数构成一个曲面或者曲线,我们的目的是找到该曲面的最低点:


假设随机站在该曲面的一点,要以最快的速度到达最低点,我们当然会沿着坡度最大的方向往下走(梯度的反方向)

用数学描述就是一个求偏导数的过程:


这样,参数theta的更新过程描述为以下:

   (α表示算法的学习速率)

二、随机梯度下降算法实战

import scala.collection.immutable.HashMap
object testVector {
  var data = HashMap[Int,Int]();
  def getData():HashMap[Int,Int] = {
    for(i <- 1 to 50){
      data += (i -> (2*i));
    }
    return data;
  }
  var theta: Double = 0;
  var alpha: Double = 0.1;
  def sgd(x: Double, y: Double) = {
    theta = theta -alpha * ((theta * x) - y) * x;
  }

  def main(args: Array[String]): Unit = {
    val dataSource = getData();
    dataSource.foreach(myMap => {
      sgd(myMap._1,myMap._2);
    })
    println("最终结果theta值为:" + theta);
  }
}
最终结果theta值为:1.107930363598007E78(theta = 50)

最终结果theta值为:1.6245837550856537E129(theta = 70)

最终结果theta值为:9.452306800048934E214(theta = 100)

三、过拟合

解决过拟合的方法:对数据进行处理,回归正则化。

正则化的两种方法:其目的是通过对最小二乘法估计假如处罚约束,使某些系数的估计值为0.

(1)lasso回归

(2)岭回归

你可能感兴趣的:(matplotlib)