量化研究 | 機(jī)器學(xué)習(xí)算法——梯度下降法與線性回歸

作者簡(jiǎn)介

呂洋洋?
某大型資管公司在職量化策略研究員,熟悉數(shù)據(jù)清洗工作,擅于運(yùn)用宏觀因子、行業(yè)因子等進(jìn)行對(duì)期貨品種價(jià)格影響建模與相關(guān)性分析,理解機(jī)器學(xué)習(xí)多元回歸法,SVM,XGboost,金融時(shí)間序列等底層算法邏輯,部分算法可自定義函數(shù)封裝。掌 握各種機(jī)器學(xué)習(xí)包與數(shù)據(jù)計(jì)算分析包的運(yùn)用。包括不限于:Alphalens,pandans,爬蟲技術(shù),sklearn,statsmodels 等。

『正文』
ˇ
從新的一年開(kāi)始,立的flag要一步一步逼迫自己完成。今天第一篇分享的是手?jǐn)]機(jī)器學(xué)習(xí)算法,這里不僅有算法的數(shù)學(xué)推導(dǎo)公式,還有demo代碼的實(shí)現(xiàn)。也算是給自己提高一些數(shù)學(xué)素養(yǎng)了吧。
梯度下降法,顧名思義……em……算了,百度一個(gè)吧。
梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解無(wú)約束最優(yōu)化問(wèn)題最常用的方法,它是一種迭代方法,每一步主要的操作是求解目標(biāo)函數(shù)的梯度向量,將當(dāng)前位置的負(fù)梯度方向作為搜索方向(因?yàn)樵谠摲较蛏夏繕?biāo)函數(shù)下降最快,這也是最速下降法名稱的由來(lái))。
梯度下降法特點(diǎn):越接近目標(biāo)值,步長(zhǎng)越小,下降速度越慢
在用梯度下降法結(jié)合線性回歸之前呢,我先給大家用一個(gè)很通俗易懂的方法跟大家解釋一下,梯度下降法的數(shù)學(xué)基本表達(dá)。請(qǐng)看下面截圖。
我們假設(shè)一個(gè)函數(shù),y=x^2+2x+5?求這個(gè)函數(shù)的最小值,眾所周知,要對(duì)函數(shù)求導(dǎo),讓一階導(dǎo)函數(shù)等于0。那么當(dāng)x=-1的時(shí)候,導(dǎo)數(shù)等于0。但是,如何用梯度下降法去求解呢?也很簡(jiǎn)單,第一個(gè)照片的前半部分:X -= x-α*導(dǎo)數(shù)。

我們先假設(shè)一個(gè)步長(zhǎng)alpha,然后在初始化一個(gè)x,也就是照片中的theta,然后一次一次的循環(huán)往復(fù),循環(huán)的次數(shù)也是一個(gè)經(jīng)驗(yàn)值。根據(jù)梯度下降的循環(huán)公式,按照照片中的假設(shè)定義,我們第一次梯度下降得出來(lái)的theta=2.52,然后從2.52在進(jìn)行循環(huán),如下圖所示:

第二次循環(huán),我們得到theta=2.0976,循環(huán)往復(fù)下去,這個(gè)theta會(huì)在一個(gè)臨界值點(diǎn)穩(wěn)定下來(lái),那么這個(gè)點(diǎn)或者說(shuō)臨界值就是我們要找的最終下降的點(diǎn),整個(gè)過(guò)程稱為“梯度下降法”。
上面是本人手寫的筆記,下面是demo代碼。


注意:
1、alpha不能過(guò)大,因?yàn)檫^(guò)大會(huì)導(dǎo)致 梯度下降不能收斂。
例如下圖所示:

2、設(shè)置最后一個(gè)迭代的數(shù)值與上一次的迭代的數(shù)值的差值,小于一個(gè)特別特別小的數(shù),說(shuō)明下降穩(wěn)定了,就可以停止迭代
當(dāng)我們加大迭代次數(shù)后,,我們可以看到最終我們想要的結(jié)果,x=-1

以上就是梯度下降的基本原理,其實(shí)甚是簡(jiǎn)單,但是還不知道為什么全網(wǎng)少有能最接地氣的方式講明白的。
下面,我繼續(xù)來(lái)分享如何與線性回歸放在一起,求解線性回歸,其實(shí)梯度下降降法和最小二乘法是殊途同歸的兩種方式。
如下圖所示:
注釋:我們先有一個(gè)假設(shè)函數(shù),也就是h(x)(theta就不打了),這個(gè)函數(shù)是theta(i)*x(i)的乘積再連加,連加符號(hào)i=0到n,n指的就是特征數(shù),也就是自變量x的個(gè)數(shù)。
代價(jià)函數(shù)或者叫成本函數(shù),就是假設(shè)函數(shù)減去真實(shí)值的差再求平方。這一部分其實(shí)就是最小二乘法中的計(jì)算。
實(shí)際中,我們的函數(shù)可能是N維的,我們?cè)谇笃珜?dǎo)過(guò)程中,以j來(lái)表示,當(dāng)j=0時(shí)候,就是對(duì)theta(0)求偏導(dǎo),以此類推。
還有一個(gè)需要提醒的是,一般往往機(jī)器學(xué)習(xí)中的向量指的都是列向量,如果沒(méi)有特殊情況,那么轉(zhuǎn)置后就是行向量。

J(theta)對(duì)theta1(j)進(jìn)行求偏導(dǎo),整個(gè)偏導(dǎo)過(guò)程如下圖所示:
在函數(shù)內(nèi)部偏導(dǎo)過(guò)程中,我們將h(x)變換為向量點(diǎn)積連加求和的形式,在手稿里面我用了f用以區(qū)分前面i=1到m的連加,實(shí)際上不區(qū)分也沒(méi)什么。在theta(f)*x(f)(i) - y(i)這個(gè)展開(kāi)式中,f實(shí)際也是從0開(kāi)始,那么如下圖箭頭所指,其余項(xiàng)均是常數(shù)項(xiàng),求導(dǎo)為0,剩下f中的j項(xiàng),那么最終也就剩下了theta(j)前面的系數(shù) X(j)
注釋:i表示的是特征數(shù),在右上角的角標(biāo)里面代表的是第i個(gè)數(shù)據(jù),也就是說(shuō)當(dāng)j=0,i=1表示的是第0個(gè)特征的,第一個(gè)數(shù)據(jù)。

最終,我們對(duì)J(theta)求完偏導(dǎo)后的導(dǎo)數(shù),帶入到上文介紹的梯度下降降法的公式里面。
下面照片是手稿中手寫的一個(gè)案例。
注釋:theta(0)*x(0)是展開(kāi)式中的一個(gè)默認(rèn)項(xiàng),其中x(0) 均為1,theta項(xiàng)均為初始化定義,在不斷的迭代過(guò)程中變化。


下面是python代碼實(shí)現(xiàn)線性回歸和梯度下降法的結(jié)合
第一步:先導(dǎo)入數(shù)據(jù),然后特征歸一化,定義代價(jià)成本函數(shù)

第二步:通過(guò)根據(jù)偏導(dǎo)后的公式,寫梯度下降降法的線性回歸


第三步:損失函數(shù)以及畫圖

通過(guò)損失函數(shù)圖,我們可以看出,在迭代到200次左右,基本上成本函數(shù)值區(qū)域平穩(wěn)。

至此,我們這一期從頭到尾梯度下降如何與線性回歸結(jié)合的,就到這里結(jié)束了。
??
End