Spark中组件Mllib的学习23之随机梯度下降(SGD)

更多代码请见:https://github.com/xubo245/SparkLearning
Spark中组件Mllib的学习之回归分析篇
1解释
SGD(Stochastic Gradient Descent-随机梯度下降)

这里写图片描述
sgd解决了梯度下降的两个问题: 收敛速度慢和陷入局部最优。
具体的介绍请见【4】、【5】和【6】

背景:
梯度下降法的缺点是:
靠近极小值时速度减慢。
直线搜索可能会产生一些问题。
可能会’之字型’地下降。

随机梯度下降法stochastic gradient descent,也叫增量梯度下降
由于梯度下降法收敛速度慢,而随机梯度下降法会快很多

–根据某个单独样例的误差增量计算权值更新,得到近似的梯度下降搜索(随机取一个样例)

–可以看作为每个单独的训练样例定义不同的误差函数

–在迭代所有训练样例时,这些权值更新的序列给出了对于原来误差函数的梯度下降的一个合理近似

–通过使下降速率的值足够小,可以使随机梯度下降以任意程度接近于真实梯度下降

•标准梯度下降和随机梯度下降之间的关键区别

–标准梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查某个训练样例来更新的

–在标准梯度下降中,权值更新的每一步对多个样例求和,需要更多的计算

–标准梯度下降,由于使用真正的梯度,标准梯度下降对于每一次权值更新经常使用比随机梯度下降大的步长

–如果标准误差曲面有多个局部极小值,随机梯度下降有时可能避免陷入这些局部极小值中

2.代码:

/**
  * @author xubo
  *         ref:Spark MlLib机器学习实战
  *         more code:https://github.com/xubo245/SparkLearning
  *         more blog:http://blog.csdn.net/xubo245
  */
package org.apache.spark.mllib.learning.regression

import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.HashMap

/**
  * Created by xubo on 2016/5/23.
  */
object SGDLearning {
  val data = HashMap[Int, Int]()

  //创建数据集
  def getData(): HashMap[Int, Int] = {
    //生成数据集内容
    for (i <- 1 to 50) {
      //创建50个数据
      data += (i -> (20 * i)) //写入公式y=2x
    }
    data //返回数据集
  }

  var θ: Double = 0
  //第一步假设θ为0
  var α: Double = 0.1 //设置步进系数

  def sgd(x: Double, y: Double) = {
    //设置迭代公式
    θ = θ - α * ((θ * x) - y) //迭代公式
  }

  def main(args: Array[String]) {
    val dataSource = getData() //获取数据集
    println("data:")
    dataSource.foreach(each => print(each + " "))
    println("\nresult:")
    var num = 1;
    dataSource.foreach(myMap => {
      //开始迭代
      println(num + ":" + θ+" ("+myMap._1+","+myMap._2+")")
      sgd(myMap._1, myMap._2) //输入数据
      num = num + 1;
    })
    println("最终结果θ值为 " + θ) //显示结果
  }
}

3.结果:

data:
(23,460) (50,1000) (32,640) (41,820) (17,340) (8,160) (35,700) (44,880) (26,520) (11,220) (29,580) (38,760) (47,940) (20,400) (2,40) (5,100) (14,280) (46,920) (40,800) (49,980) (4,80) (13,260) (22,440) (31,620) (16,320) (7,140) (43,860) (25,500) (34,680) (10,200) (37,740) (1,20) (19,380) (28,560) (45,900) (27,540) (36,720) (18,360) (9,180) (21,420) (48,960) (3,60) (12,240) (30,600) (39,780) (15,300) (42,840) (24,480) (6,120) (33,660) 
result:
1:0.0 (23,460)
2:46.0 (50,1000)
3:-84.0 (32,640)
4:248.8 (41,820)
5:-689.2800000000002 (17,340)
6:516.4960000000003 (8,160)
7:119.29920000000004 (35,700)
8:-228.24800000000016 (44,880)
9:864.0432000000006 (26,520)
10:-1330.469120000001 (11,220)
11:155.04691200000025 (29,580)
12:-236.58913280000047 (38,760)
13:738.4495718400013 (47,940)
14:-2638.263415808005 (20,400)
15:2678.263415808006 (2,40)
16:2146.610732646405 (5,100)
17:1083.3053663232024 (14,280)
18:-405.3221465292811 (46,920)
19:1551.159727505412 (40,800)
20:-4573.4791825162365 (49,980)
21:17934.568811813326 (4,80)
22:10768.741287087996 (13,260)
23:-3204.6223861264007 (22,440)
24:3889.546863351681 (31,620)
25:-8106.04841303853 (16,320)
26:4895.6290478231185 (7,140)
27:1482.6887143469353 (43,860)
28:-4806.872757344887 (25,500)
29:7260.309136017331 (34,680)
30:-17356.741926441595 (10,200)
31:20.0 (37,740)
32:20.0 (1,20)
33:20.0 (19,380)
34:20.0 (28,560)
35:20.0 (45,900)
36:20.0 (27,540)
37:20.0 (36,720)
38:20.0 (18,360)
39:20.0 (9,180)
40:20.0 (21,420)
41:20.0 (48,960)
42:20.0 (3,60)
43:20.0 (12,240)
44:20.0 (30,600)
45:20.0 (39,780)
46:20.0 (15,300)
47:20.0 (42,840)
48:20.0 (24,480)
49:20.0 (6,120)
50:20.0 (33,660)
最终结果θ值为 20.0

分析:
当α为0.1的时候,一般30次计算就计算出来了;如果是0.5,一般15次计算就有正确结果 。如果是1,则50次都没有结果

参考
【1】http://spark.apache.org/docs/1.5.2/mllib-guide.html
【2】http://spark.apache.org/docs/1.5.2/programming-guide.html
【3】https://github.com/xubo245/SparkLearning
【4】Spark MlLib机器学习实战
【5】http://blog.csdn.net/zbc1090549839/article/details/38149561
【6】http://blog.csdn.net/woxincd/article/details/7040944

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值