參考資料:html
【1】 Spark MLlib 機器學習實踐算法
【2】 機器學習之梯度降低 http://www.cnblogs.com/rcfeng/p/3958926.htmlapache
【3】 統計學習方法dom
一、迴歸分析概念機器學習
在統計學中,線性迴歸(Linear Regression)是利用稱爲線性迴歸方程的最小平方函數對一個或多個自變量和因變量之間關係進行建模的一種迴歸分析。函數
二、梯度降低的概念學習
梯度降低是一個尋找函數極值的過程,在低維度下很是容易理解。例如存在函數,則咱們有導數。spa
假設當前x=1,假設dx的步長爲0.1,則咱們有,即下一次x的取值應爲0.8,獲得新的更小的y值。scala
備註:在機器學習的應用場景裏,梯度降低只是自變量的維度變多,也能夠理解梯度降低的方向變多而已。3d
三、梯度降低算法
1)假設存在建模函數
2)則有對應的代價函數
3)每次迭代時求代價函數的偏導數,並根據負梯度的思想更新權值
4)迭代屢次直到知足代價函數的收斂閾值
備註:
此處要區分的是梯度降低算法的兩種常見類型,一個是隨機梯度降低、另外一個是批量梯度降低。對於批量梯度降低,須要對全部的訓練樣本完成遍歷後,將誤差的總和再去更新參數值。而對於隨機梯度降低,每個訓練樣本都會立刻更新參數值,所以速度更快,但也更容易獲取局部最優解。
上面的例子屬於批量隨機降低,而隨機梯度降低公式爲:,注意這裏沒有對m個參數的求總和。也就是說不在每個時刻考慮全部方向(維度)的最優值,而是隨便找一個方向(維度)就開始作負梯度降低。
四、隨機梯度降低Spark Mlib例子
package com.fredric.spark.lr import org.apache.spark.{SparkContext, SparkConf} import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD} import scala.util.Random /*- * 線性迴歸-隨機梯度降低 * Fredric 2017 */ object lr { def main(args:Array[String]): Unit ={ val conf = new SparkConf().setMaster("local").setAppName("Lr01") val sc = new SparkContext(conf) //以二元線性迴歸y = 7*x1 + 5*x2 + 3爲例,初始化數據 val Array = new Array[LabeledPoint](500) for(t <- 1 to 500){ val random = new Random(); val x1 = random.nextInt(4) + random.nextDouble(); val x2 = random.nextInt(3) + random.nextDouble(); val y = 7 * x1 + 5 * x2 + (new Random()).nextDouble() + 3; //注意對於常量3,須要預留對應的向量,根據矩陣相乘,應填寫1 Array(t-1) = new LabeledPoint(y, Vectors.dense(x1, x2, 1)); } val data = sc.makeRDD(Array); //Train a linear regression model with no regularization using Stochastic Gradient Descent val model = new LinearRegressionWithSGD(); model.optimizer.setNumIterations(100);//迭代100次 val res = model.run(data); //輸出結果爲 [7.0162907792955345,5.013683400288775,3.4386169185061966],分別對應x1 x2和常數 println(res.weights) } }