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