Stanford UFLDL教程 逻辑回归的向量化实现样例
邏輯回歸的向量化實(shí)現(xiàn)樣例
我們想用批量梯度上升法對logistic回歸分析模型進(jìn)行訓(xùn)練,其模型如下:
讓我們遵從公開課程視頻與CS229教學(xué)講義的符號規(guī)范,設(shè) ,于是 ,, 為截距。假設(shè)我們有m個訓(xùn)練樣本{(, ) ,...,( , )},而批量梯度上升法的更新法則是: ,這里的 是對數(shù)似然函數(shù), 是其導(dǎo)函數(shù)。
[注:下文的符號規(guī)范與<公開課程視頻>或<教學(xué)講義CS229:機(jī)器學(xué)習(xí)>中的相同,詳細(xì)內(nèi)容可以參見公開課程視頻或教學(xué)講義#1 http://cs229.stanford.edu/]
于是,我們需要如下計(jì)算梯度:
我們用Matlab/Octave風(fēng)格變量x表示輸入數(shù)據(jù)構(gòu)成的樣本矩陣,x(:,i)代表第 i個訓(xùn)練樣本,x(j,i)就代表(譯者注:第i個訓(xùn)練樣本向量的第j個元素)。同樣,用Matlab/Octave風(fēng)格變量y表示由訓(xùn)練樣本集合的全體類別標(biāo)號所構(gòu)成的行向量,則該向量的第i個元素y(i)就代表上式中的。(注意這里跟公開課程視頻及CS229的符號規(guī)范不同,矩陣x按列而不是按行存放輸入訓(xùn)練樣本,同樣,是行向量而不是列向量。)
以下是梯度運(yùn)算代碼的一種實(shí)現(xiàn),非常恐怖,速度極慢:
嵌套的for循環(huán)語句使這段代碼的運(yùn)行非常緩慢。以下是更典型的實(shí)現(xiàn)方式,它對算法進(jìn)行部分向量化,帶來更優(yōu)的執(zhí)行效率:
但是,或許可以向量化得更徹底些。如果去除for循環(huán),我們就可以顯著地改善代碼執(zhí)行效率。特別的,假定b是一個列向量,A是一個矩陣,我們用以下兩種方式來計(jì)算A*b:
我們看到,代碼2是用了低效的for循環(huán)語句執(zhí)行梯度上升(譯者注:原文是下降)運(yùn)算,將b(i)看成(y(i) - sigmoid(theta'*x(:,i))),A看成x,我們就可以使用以下高效率的代碼:
這里我們假定Matlab/Octave的sigmoid(z)函數(shù)接受一個向量形式的輸入z,依次對輸入向量的每個元素施行sigmoid函數(shù),最后返回運(yùn)算結(jié)果,因此sigmoid(z)的輸出結(jié)果是一個與z有相同維度的向量。
當(dāng)訓(xùn)練數(shù)據(jù)集很大時,最終的實(shí)現(xiàn)(譯者注:代碼3)充分發(fā)揮了Matlab/Octave高度優(yōu)化的數(shù)值線性代數(shù)庫的優(yōu)勢來進(jìn)行矩陣-向量操作,因此,比起之前代碼要高效得多。
想采用向量化實(shí)現(xiàn)并非易事,通常需要周密的思考。但當(dāng)你熟練掌握向量化操作后,你會發(fā)現(xiàn),這里面有固定的設(shè)計(jì)模式(對應(yīng)少量的向量化技巧),可以靈活運(yùn)用到很多不同的代碼片段中。
中英文對照
from: http://ufldl.stanford.edu/wiki/index.php/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92%E7%9A%84%E5%90%91%E9%87%8F%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%A0%B7%E4%BE%8B
總結(jié)
以上是生活随笔為你收集整理的Stanford UFLDL教程 逻辑回归的向量化实现样例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stanford UFLDL教程 矢量化
- 下一篇: Stanford UFLDL教程 神经网