線性回歸實(shí)踐

理論部分

對(duì)于最基本的線性回歸問(wèn)題兼贡,公式如下:

X是自變量,也就是我們實(shí)際場(chǎng)景中的特征變量未荒,比如我項(xiàng)目中每個(gè)時(shí)刻芯片的電壓荧降,溫度接箫,串口狀態(tài)、串口數(shù)據(jù)朵诫、電流值辛友、功耗、電流波形等等參數(shù)剪返;
θ是權(quán)重參數(shù)废累,也就是我們需要去梯度下降求解的具體值,(我們拿一堆的數(shù)據(jù)來(lái)擬合出最佳的θ[誤])用數(shù)據(jù)擬合h(x)脱盲,通過(guò)最佳的θ邑滨,得到最佳擬合曲線hθ(x),然后在預(yù)測(cè)的時(shí)候就只要直接用這個(gè)公式就好了钱反。
梯度下降時(shí)掖看,你如何評(píng)估你最新的參數(shù)是向著正確的方向進(jìn)行修正的呢?我們引入損失函數(shù)面哥,直觀上理解就是我更新一組參數(shù)后哎壳,你效果必須是越來(lái)越好的,誤差也是越來(lái)越少的尚卫。

注意:是最小二乘誤差的喲耳峦,也就是m個(gè)樣本每個(gè)都要計(jì)算一次樣本(在當(dāng)前的θ參數(shù)下);前面的1/2是為了求偏導(dǎo)時(shí)消除系數(shù)的焕毫。

ps. 為什么用最小二乘作為誤差函數(shù)呢蹲坷? 答案在這!知乎上解釋的很透徹了邑飒。
簡(jiǎn)單來(lái)說(shuō)就是前提假設(shè)是高斯分布循签,因此化簡(jiǎn)(見(jiàn)上述鏈接)后就是最小二乘,而高斯分布是大自然里很自然的一個(gè)屬性疙咸,遵天道县匠。

這是直觀化的梯度下降圖示:

圖片來(lái)源百度

梯度下降更新權(quán)重參數(shù)的過(guò)程中我們需要對(duì)損失函數(shù)求偏導(dǎo)數(shù):


梯度下降標(biāo)準(zhǔn)數(shù)學(xué)推導(dǎo)

求完偏導(dǎo)數(shù)以后就可以進(jìn)行參數(shù)更新了:



上面公式中的alpha就是下面圖中的步長(zhǎng)lamda:
學(xué)習(xí)率參數(shù)

總結(jié):理論上是先求得誤差函數(shù),然后誤差函數(shù)對(duì)參數(shù)θ求偏導(dǎo)撒轮,求得后再更新參數(shù)就好了


實(shí)踐部分

深度學(xué)習(xí)的核心理念:輸入乞旦,然后設(shè)定期望的輸出,找到二者的相關(guān)性题山。


最小二乘:

我們先猜測(cè)函數(shù)的位置兰粉,然后平方其誤差,重新做出猜測(cè)顶瞳,以減少平方誤差的和玖姑。這是線性回歸的種子愕秫。


#最小二乘法least squares
################################################################################
#在當(dāng)前給定的參數(shù)a,b下計(jì)算所有誤差值的平方和并取均值
# ################################################################################
def compute_error_for_line_given_points(b,a,datas):
    totalError = 0
    for i in range(0,len(datas)):
        x = datas[i][0]
        y = datas[i][1]
        totalError += (y-(a*x+b))**2
    return totalError/float(len(datas))

print compute_error_for_line_given_points(1,2,[[3,6],[6,9],[12,18]])

總結(jié):這里講了如何求誤差函數(shù),當(dāng)然這里求的是最簡(jiǎn)單的一元變量焰络。在一個(gè)給定參數(shù)情況下計(jì)算整體的平均誤差值戴甩。


梯度下降:

比如下面這個(gè)函數(shù),我們知道在極小值左邊導(dǎo)數(shù)是小于0的闪彼,右邊是大于0 的甜孤,同時(shí)越靠近極值點(diǎn)導(dǎo)數(shù)絕對(duì)值越小(可理解為梯度很形吠蟆)缴川。

  • 那么我們可以這樣思考:首先我隨機(jī)選擇一個(gè)x點(diǎn),然后計(jì)算其導(dǎo)致郊尝,假如小于0我就往右挪動(dòng)一點(diǎn)二跋,大于0我就往左移動(dòng)一點(diǎn),最終總會(huì)挪動(dòng)到極值點(diǎn)處的流昏;
  • 這其中需要思考的是:移動(dòng)步長(zhǎng)多少為好呢扎即?太大了不收斂,太小了時(shí)間花銷大况凉;既然無(wú)法確定谚鄙,那么我們就定一個(gè)超參數(shù)嘛,讓這個(gè)值(就是上面參數(shù)更新公式中的alpha刁绒,也就是下面代碼中的學(xué)習(xí)率)手動(dòng)來(lái)調(diào)闷营,多調(diào)幾次就知道了嘛(目前階段這樣做無(wú)可厚非嘛)~
current_x += -learning_rate*slope_at_given_x_value(previous_x)
################################################################################
#http://mp.weixin.qq.com/s/8as8ai5W0RlLOhHT6sswjA
#梯度下降
################################################################################
current_x = 0.5 #啟動(dòng)點(diǎn)
learning_rate = 0.01#學(xué)習(xí)率
num_iterations = 10 #迭代次數(shù)
#這個(gè)是斜率
def slope_at_given_x_value(x):
    return 5*x**4 - 6*x**2
#整體表達(dá)的是一個(gè)移動(dòng)的概念,往“城市”中心移動(dòng)(基于斜率)知市。
#也就是我選定一個(gè)初始點(diǎn)傻盟,然后看這一點(diǎn)的斜率值,在極小值點(diǎn)左邊是斜率小于零嫂丙,右邊是斜率大于零娘赴,
#因此我們隨機(jī)選擇一個(gè)點(diǎn)后,把當(dāng)前點(diǎn)加上一個(gè)趨勢(shì)跟啤,在極值點(diǎn)左邊就加诽表,右邊就減去,這樣不斷迭代就好了隅肥。
for i in range(num_iterations):
    previous_x = current_x
    current_x += -learning_rate*slope_at_given_x_value(previous_x)
    print(previous_x)
print "the local minimum occurs at %f" % current_x

這里可以把x看作是梯度下降里面的參數(shù)竿奏,假設(shè)只有一個(gè)參數(shù)時(shí)的情況,屬一元變量腥放。

總結(jié):可以將上述的slope_at_given_x_value(x)函數(shù)看作誤差函數(shù)泛啸,然后這里講了如何求導(dǎo)誤差函數(shù)的極小值,當(dāng)然也是在一元變量的情況下做的捉片。


線性回歸:

通過(guò)組合最小二乘法和梯度下降法平痰,就可以得到線性回歸汞舱。

################################################################################
#最小二乘法 + 梯度下降 == 線性回歸
################################################################################
#price of wheat/Kg and the average price of bread
wheat_and_bread = [[0.5,5],[0.6,5.5],[0.8,6],[1.1,6.8],[1.4,7]]

def step_gradient(b_current,a_current,datas,learningRate):
    b_gradient = 0
    a_gradient = 0
    N = float(len(datas))
    #這里是把所有的數(shù)據(jù)集的誤差值求出來(lái)伍纫,然后
    for i in range(0,len(datas)):
        x = datas[i][0]
        y = datas[i][1]
        b_gradient += -(2/N) * (y - ((a_current*x + b_current)))
        a_gradient += -(2/N) * x * (y - ((a_current*x + b_current)))
    
    new_b = b_current - (learningRate * b_gradient)
    new_a = a_current - (learningRate * a_gradient)
    return [new_b,new_a]

def gradient_descent_runner(datas,starting_b,starting_a,learning_rate,num_iterations):
    b = starting_b
    a = starting_a
    for i in range(num_iterations):
        b,a = step_gradient(b,a,datas,learning_rate)
    return [b,a]
print gradient_descent_runner(wheat_and_bread,1,1,0.01,100)

因?yàn)槭且辉兞康木€性擬合宗雇,所以擬合函數(shù)是y=ax+b,需要求的參數(shù)是a,b莹规;

自變量(特征)={x};只有x一個(gè)赔蒲。
參數(shù)θ={a,b};兩個(gè)參數(shù)需求解。

因此我的梯度下降是這樣做的:首先把a(bǔ),b參數(shù)初始化為0良漱,然后由于已知擬合函數(shù)形式了舞虱,因此直接代入偏導(dǎo)函數(shù)求參數(shù):

梯度下降標(biāo)準(zhǔn)數(shù)學(xué)推導(dǎo)

對(duì)應(yīng)代碼為:
b_gradient += -(2/N) * (y - ((a_current*x + b_current)))
上面的2是因?yàn)槲覀兌x誤差函數(shù)的時(shí)候是沒(méi)有加1/2的,因此這里求偏導(dǎo)后有個(gè)2(2次方)母市,同時(shí)求得是整體的平均誤差矾兜,因此每個(gè)誤差前面乘以個(gè)1/N。
a_gradient += -(2/N) * x * (y - ((a_current*x + b_current)))
分析同上患久,但是這里多乘了個(gè)x椅寺,為啥?因?yàn)樘荻裙奖緛?lái)就是這樣的敖А返帕!那個(gè)b_gradient因?yàn)槭浅?shù)項(xiàng),即x的0次方(特征1)所以直接是1了篙挽,省略荆萤;而這個(gè)是x的1次方(特征2),因此直接按公式將這個(gè)特征乘以就好了铣卡。

總結(jié):對(duì)比之前的那個(gè)一元變量的導(dǎo)數(shù)(斜率)可知链韭,這里的偏導(dǎo)思路跟那是一樣的啊,目標(biāo)就是更新參數(shù)煮落,而參數(shù)的更新就是偏導(dǎo)嘛(導(dǎo)數(shù)咯)敞峭,偏導(dǎo)就是上面一元函數(shù)里面的斜率嘛,這么對(duì)照著直接理解的話就可以知道過(guò)程是一樣的州邢,都是圍繞某一個(gè)參數(shù)變量求導(dǎo)數(shù)(當(dāng)然數(shù)據(jù)量多的時(shí)候求導(dǎo)數(shù)的平均值)儡陨,然后不斷修改之就好啦~


三種梯度下降方法

【資料引用來(lái)源】
一般線性回歸函數(shù)的假設(shè)函數(shù)為(x是一些特診變量):

對(duì)應(yīng)的損失函數(shù)為(這里的1/2是為了后面求梯度計(jì)算方便):


批量梯度下降法(BGD)

我們的目的是要誤差函數(shù)盡可能的小,即求解weights使誤差函數(shù)盡可能小量淌。
首先骗村,我們隨機(jī)初始化weigths,然后不斷反復(fù)的更新weights使得誤差函數(shù)減小呀枢,直到滿足要求時(shí)停止胚股。
這里更新算法我們選擇梯度下降算法,利用初始化的weights并且反復(fù)更新weights:

這里代表學(xué)習(xí)率裙秋,表示每次向著J最陡峭的方向邁步的大小琅拌。為了更新weights缨伊,我們需要求出函數(shù)J的偏導(dǎo)數(shù)。首先當(dāng)我們只有一個(gè)數(shù)據(jù)點(diǎn)(x,y)的時(shí)候进宝,J的偏導(dǎo)數(shù)是:


則對(duì)所有數(shù)據(jù)點(diǎn)刻坊,上述損失函數(shù)的偏導(dǎo)(累和)為:

再最小化損失函數(shù)的過(guò)程中,需要不斷反復(fù)的更新weights使得誤差函數(shù)減小党晋,更新過(guò)程如下:

那么好了谭胚,每次參數(shù)更新的偽代碼如下:

由上圖更新公式我們就可以看到,我們每一次的參數(shù)更新都用到了所有的訓(xùn)練數(shù)據(jù)(比如有m個(gè)未玻,就用到了m個(gè))灾而,如果訓(xùn)練數(shù)據(jù)非常多的話,是非常耗時(shí)的扳剿。
下面給出批梯度下降的收斂圖:


隨機(jī)梯度下降法(SGD)

由于批梯度下降每跟新一個(gè)參數(shù)的時(shí)候旁趟,要用到所有的樣本數(shù),所以訓(xùn)練速度會(huì)隨著樣本數(shù)量的增加而變得非常緩慢庇绽。隨機(jī)梯度下降正是為了解決這個(gè)辦法而提出的锡搜。它是利用每個(gè)樣本的損失函數(shù)對(duì)θ求偏導(dǎo)得到對(duì)應(yīng)的梯度,來(lái)更新θ:


更新過(guò)程如下:

隨機(jī)梯度下降是通過(guò)每個(gè)樣本來(lái)迭代更新一次敛劝,對(duì)比上面的批量梯度下降余爆,迭代一次需要用到所有訓(xùn)練樣本(往往如今真實(shí)問(wèn)題訓(xùn)練數(shù)據(jù)都是非常巨大),一次迭代不可能最優(yōu)夸盟,如果迭代10次的話就需要遍歷訓(xùn)練樣本10次蛾方。
但是,SGD伴隨的一個(gè)問(wèn)題是噪音較BGD要多上陕,使得SGD并不是每次迭代都向著整體最優(yōu)化方向桩砰。
隨機(jī)梯度下降收斂圖如下:

我們可以從圖中看出SGD迭代的次數(shù)較多,在解空間的搜索過(guò)程看起來(lái)很盲目释簿。但是大體上是往著最優(yōu)值方向移動(dòng)亚隅。


小批量梯度下降法(MBGD)

我們從上面兩種梯度下降法可以看出,其各自均有優(yōu)缺點(diǎn)庶溶,那么能不能在兩種方法的性能之間取得一個(gè)折衷呢煮纵?既算法的訓(xùn)練過(guò)程比較快,而且也要保證最終參數(shù)訓(xùn)練的準(zhǔn)確率偏螺,而這正是小批量梯度下降法(Mini-batch Gradient Descent行疏,簡(jiǎn)稱MBGD)的初衷。
我們假設(shè)每次更新參數(shù)的時(shí)候用到的樣本數(shù)為10個(gè)(不同的任務(wù)完全不同套像,這里舉一個(gè)例子而已
更新偽代碼如下:


三種梯度下降方法的總結(jié)

  1. 批梯度下降每次更新使用了所有的訓(xùn)練數(shù)據(jù)酿联,最小化損失函數(shù),如果只有一個(gè)極小值,那么批梯度下降是考慮了訓(xùn)練集所有數(shù)據(jù)贞让,是朝著最小值迭代運(yùn)動(dòng)的周崭,但是缺點(diǎn)是如果樣本值很大的話,更新速度會(huì)很慢喳张。

  2. 隨機(jī)梯度下降在每次更新的時(shí)候续镇,只考慮了一個(gè)樣本點(diǎn),這樣會(huì)大大加快訓(xùn)練數(shù)據(jù)蹲姐,也恰好是批梯度下降的缺點(diǎn)磨取,但是有可能由于訓(xùn)練數(shù)據(jù)的噪聲點(diǎn)較多人柿,那么每一次利用噪聲點(diǎn)進(jìn)行更新的過(guò)程中柴墩,就不一定是朝著極小值方向更新,但是由于更新多輪凫岖,整體方向還是大致朝著極小值方向更新江咳,又提高了速度。

  3. 小批量梯度下降法是為了解決批梯度下降法的訓(xùn)練速度慢哥放,以及隨機(jī)梯度下降法的準(zhǔn)確性綜合而來(lái)歼指,但是這里注意,不同問(wèn)題的batch是不一樣的甥雕,根據(jù)實(shí)驗(yàn)結(jié)果來(lái)迭代調(diào)整踩身。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市社露,隨后出現(xiàn)的幾起案子挟阻,更是在濱河造成了極大的恐慌,老刑警劉巖峭弟,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件附鸽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞒瘸,警方通過(guò)查閱死者的電腦和手機(jī)坷备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)情臭,“玉大人省撑,你說(shuō)我怎么就攤上這事「┰冢” “怎么了竟秫?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)朝巫。 經(jīng)常有香客問(wèn)我鸿摇,道長(zhǎng),這世上最難降的妖魔是什么劈猿? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任拙吉,我火速辦了婚禮潮孽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筷黔。我一直安慰自己往史,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布佛舱。 她就那樣靜靜地躺著椎例,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请祖。 梳的紋絲不亂的頭發(fā)上订歪,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音肆捕,去河邊找鬼刷晋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慎陵,可吹牛的內(nèi)容都是我干的眼虱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼席纽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捏悬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起润梯,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤过牙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仆救,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抒和,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片医寿。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镊辕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚁袭,我是刑警寧澤征懈,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站揩悄,受9級(jí)特大地震影響卖哎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一亏娜、第九天 我趴在偏房一處隱蔽的房頂上張望焕窝。 院中可真熱鬧,春花似錦维贺、人聲如沸它掂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虐秋。三九已至,卻和暖如春垃沦,著一層夾襖步出監(jiān)牢的瞬間客给,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工栏尚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留起愈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓译仗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親官觅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纵菌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • AI人工智能時(shí)代,機(jī)器學(xué)習(xí)休涤,深度學(xué)習(xí)作為其核心咱圆,本文主要介紹機(jī)器學(xué)習(xí)的基礎(chǔ)算法,以詳細(xì)線介紹 線性回歸算法 及其 ...
    erixhao閱讀 13,827評(píng)論 0 36
  • 第二個(gè)Topic講深度學(xué)習(xí)功氨,承接前面的《淺談機(jī)器學(xué)習(xí)基礎(chǔ)》序苏。 深度學(xué)習(xí)簡(jiǎn)介 前面也提到過(guò),機(jī)器學(xué)習(xí)的本質(zhì)就是尋找最...
    我偏笑_NSNirvana閱讀 15,577評(píng)論 7 49
  • 注:題中所指的『機(jī)器學(xué)習(xí)』不包括『深度學(xué)習(xí)』捷凄。本篇文章以理論推導(dǎo)為主忱详,不涉及代碼實(shí)現(xiàn)。 前些日子定下了未來(lái)三年左右...
    我偏笑_NSNirvana閱讀 39,911評(píng)論 12 145
  • 機(jī)器學(xué)習(xí)是做NLP和計(jì)算機(jī)視覺(jué)這類應(yīng)用算法的基礎(chǔ)跺涤,雖然現(xiàn)在深度學(xué)習(xí)模型大行其道匈睁,但是懂一些傳統(tǒng)算法的原理和它們之間...
    在河之簡(jiǎn)閱讀 20,482評(píng)論 4 65
  • 第一款:800g2014年普通茯磚,原料三級(jí)搭配老梗桶错,松煙香明顯航唆,滋味較厚,剛開(kāi)始量多味稍苦院刁,湯色橙黃明亮糯钙。 第二...
    不一不二閱讀 151評(píng)論 0 0