Spark MLlib隨機梯度下降法概述與實例
機器學習算法中回歸算法有很多,例如神經(jīng)網(wǎng)絡回歸算法、蟻群回歸算法,支持向量機回歸算法等,其中也包括本篇文章要講述的梯度下降算法,本篇文章將主要講解其基本原理以及基于Spark MLlib進行實例示范,不足之處請多多指教。
梯度下降算法包含多種不同的算法,有批量梯度算法,隨機梯度算法,折中梯度算法等等。對于隨機梯度下降算法而言,它通過不停的判斷和選擇當前目標下最優(yōu)的路徑,從而能夠在最短路徑下達到最優(yōu)的結果。我們可以在一個人下山坡為例,想要更快的到達山低,最簡單的辦法就是在當前位置沿著最陡峭的方向下山,到另一個位置后接著上面的方式依舊尋找最陡峭的方向走,這樣每走一步就停下來觀察最下路線的方法就是隨機梯度下降算法的本質(zhì)。
隨機梯度下降算法理論基礎
在線性回歸中,我們給出回歸方程,如下所示:
我們知道,對于最小二乘法要想求得最優(yōu)變量就要使得計算值與實際值的偏差的平方最小。而隨機梯度下降算法對于系數(shù)需要通過不斷的求偏導求解出當前位置下最優(yōu)化的數(shù)據(jù),那么梯度方向公式推導如下公式,公式中的θ會向著梯度下降最快的方向減少,從而推斷出θ的最優(yōu)解。
因此隨機梯度下降法的公式歸結為通過迭代計算特征值從而求出最合適的值。θ的求解公式如下。
α是下降系數(shù),即步長,學習率,通俗的說就是計算每次下降的幅度的大小,系數(shù)越大每次計算的差值越大,系數(shù)越小則差值越小,但是迭代計算的時間也會相對延長。θ的初值可以隨機賦值,比如下面的例子中初值賦值為0。
Spark MLlib隨機梯度下降算法實例
下面使用Spark MLlib來迭代計算回歸方程y=2x的θ最優(yōu)解,代碼如下:
package cn.just.shinelon.MLlib.Algorithm import java.util import scala.collection.immutable.HashMap /** * 隨機梯度下降算法實戰(zhàn) * 隨機梯度下降算法:最短路徑下達到最優(yōu)結果 * 數(shù)學表達公式如下: * f(θ)=θ0x0+θ1x1+θ2x2+...+θnxn * 對于系數(shù)要通過不停地求解出當前位置下最優(yōu)化的數(shù)據(jù),即不停對系數(shù)θ求偏導數(shù) * 則θ求解的公式如下: * θ=θ-α(f(θ)-yi)xi * 公式中α是下降系數(shù),即每次下降的幅度大小,系數(shù)越大則差值越小,系數(shù)越小則差值越小,但是計算時間也相對延長 */ object SGD { var data=HashMap[Int,Int]() //創(chuàng)建數(shù)據(jù)集 def getdata():HashMap[Int,Int]={ for(i <- 1 to 50){ //創(chuàng)建50個數(shù)據(jù)集 data += (i->(2*i)) //寫入公式y(tǒng)=2x } data //返回數(shù)據(jù)集 } var θ:Double=0 //第一步 假設θ為0 var α:Double=0.1 //設置步進系數(shù) def sgd(x:Double,y:Double)={ //隨機梯度下降迭代公式 θ=θ-α*((θ*x)-y) //迭代公式 } def main(args: Array[String]): Unit = { val dataSource=getdata() //獲取數(shù)據(jù)集 dataSource.foreach(myMap=>{ //開始迭代 sgd(myMap._1,myMap._2) //輸入數(shù)據(jù) }) println("最終結果值θ為:"+θ) } }
需要注意的是隨著步長系數(shù)增大以及數(shù)據(jù)量的增大,θ值偏差越來越大。同時這里也遺留下一個問題,當數(shù)據(jù)量大到一定程度,為什么θ值會為NaN,筆者心中有所疑惑,如果哪位大佬有想法可以留言探討,謝謝!
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot自定義注解實現(xiàn)Token校驗的方法
這篇文章主要介紹了SpringBoot自定義注解實現(xiàn)Token校驗的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03使用Maven 搭建 Spring MVC 本地部署Tomcat的詳細教程
這篇文章主要介紹了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08java獲取兩個數(shù)組中不同數(shù)據(jù)的方法
這篇文章主要介紹了java獲取兩個數(shù)組中不同數(shù)據(jù)的方法,實例分析了java操作數(shù)組的技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03如何在IDE部署springboot項目(有swagger和無swagger都是一樣的)到服務器或者虛擬機上的docke
這篇文章主要介紹了如何在IDE部署springboot項目(有swagger和無swagger都是一樣的)到服務器或者虛擬機上的docker,本文給大家分享我的安裝歷程,需要的朋友可以參考下2023-01-01java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信)
這篇文章主要介紹了java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10Spring Boot集成Quartz注入Spring管理的類的方法
本篇文章主要介紹了Spring Boot集成Quartz注入Spring管理的類的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04