機器學習實戰札記 Logistic回歸

2021-08-18 16:52:56 字數 2297 閱讀 1271

這段時間裡,我一直在嘗試將open_nsfw加入到手機,給手機瀏覽器增加色情檢測功能,這個分階段進行,在前面的幾篇文章中,都談到了這方面的嘗試:

我的第乙個caffe c++程式

我的第乙個caffe android程式

利用人工智慧檢測色情

然而,當我將open_nsfw移植到手機上執行時(原始碼已上傳碼雲 - ),現實無情的擊碎了我的夢想,不是因為識別效果差,而是速度太慢。我在nexus 4手機上進行了測試,檢測一張大約需要3秒鐘時間。雖然nexus 4的硬體配置現在看來有些落伍,但是3秒鐘的時間還是遠遠超過了我的預期。要知道,載入乙個網頁,可能有十幾張。網上雖然有人對caffe做了一些優化,但並非出自官方,效能和相容性難以保證。所以這件事情先暫時擱置,正在考慮換tensorflow,因為tensorflow是google出品,按理應該會對自家的android移動平台做優化。

還是回到機器學習上來,最新學習的章節是logistic回歸。

線性回歸

假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作回歸。使用更加嚴謹的數學定義為:給定由d個屬性描述的示例x=(x1;x2;…;xd),其中xi是x在第i個屬性上的取值,線性模型試圖學得乙個通過屬性的線性組合來進行**的函式,即

f(x) = w1x1 + w2x2 + ... + wdxd + b
吳恩達的machine learning課程介紹的第乙個機器學習演算法就是線性回歸,課程非常淺顯易懂,免費且有中文字母,值得學一學。

基於logistic回歸和sigmod函式的分類

在machine learning課程中,對於線性回歸是以房價**為例子進行說明的,但若要做的是分類任務該怎麼辦?答案在廣義線性模型中:只需找乙個單調可微函式將分類任務的真實標記y與線性回歸模型的**值聯絡起來。

利用logistic回歸進行分類的主要思想是:根據現有資料對分類邊界線建立回歸公式,以此進行分類。

考慮二分類任務,其輸出標記y = ,而線性回歸模型產生的**值z是實值,於是,我們需將實值z轉換為0/1值。最理想的是「單位階躍函式」(又稱為海維塞德階躍函式):

然而,海維塞德階躍函式的問題在於:該函式在跳躍點上從0瞬間跳躍到1,這個瞬間跳躍過程有時很難處理。

幸好,另乙個函式也有類似的性質,且數學上更易處理,這就是sigmoid函式,計算公式如下:

當x為0時,sigmoid函式值為0.5,隨著x的增大,對應的sigmoid值將逼近於1,而隨著x的減小,sigmoid值將逼近於0。單位階躍函式與sigmoid函式如下圖所示,可以看出sigmoid函式看起來很像乙個階躍函式。

梯度上公升法

其中的乙個最優化演算法叫做梯度上公升法。梯度上公升法基於的思想是:要找到某函式的最大值,最好的方法是沿著該函式的梯度方向探尋。這段有點不太容易理解,通俗一些理解就是先給出一組w值,然後通過迭代更新這組w值,直至達到某個停止條件為止,比如迭代次數達到某個指定值或演算法達到某個可以允許的誤差範圍。梯度上公升演算法的迭代公式公式如下:

注:梯度下降演算法與梯度上公升演算法是一樣的,只是公式中的加法需要變成減法。梯度上公升演算法用來就函式的最大值,而梯度下降演算法用來求函式的最小值。

實現《機器學習實戰》一書中給出了梯度上公升演算法的具體實現,關於最佳引數的迭代,**為:

h = sigmoid(datamatrix * weights)

error = (labelmat - h)

weights = weights + alpha * datamatrix.transpose() * error

書中並沒有給出公式的推導,通常情況下,我們也不需要知道。如果需要進一步了解,可以參考machine learning課程。

梯度上公升演算法在每次更新回歸係數時都需要遍歷整個資料集,該方法在處理1000個左右的資料集尚可,但如果有數十億樣本和成千上萬的特徵,那麼該方法的計算複雜度太高。一種改進方法是一次僅用乙個樣本來更新回歸係數,該方法成為隨機梯度上公升演算法。

機器學習實戰

花了一段時間,總算把 機器學習實戰 粗讀了一遍,重點就在這個粗讀上。這本書的確不錯,機器學習的幾個經典演算法都涉及了,每個演算法都有1 2個實際例子進行說明,都有實實在在的 讓我想起了linus的 talk is cheap,show me the code 那句名言。但多年來養成的習慣,從來都是喜...

機器學習機器學習實戰 kmeans

簡介 聚類演算法是一種無監督學習,它將相似的物件歸類到同一簇中。聚類的方法可以應用所有的物件,簇內的物件越相似,聚類效果也就越好。聚類和分類的最大不同之處在於,分類的目標是已知的,聚類是完全無監督學習,類別沒有像分類那樣被預先定義出來,所以叫做無監督學習。kmeans演算法是實際中最常用的聚類演算法...

機器學習實戰 apriori

前面主要學習了機器學習的兩大塊 分類,回歸,接下來的兩節進入到頻繁項集和關聯規則的分析。關聯分析中最著名的例子當屬啤酒和尿布了。為了定義上述的頻繁和關聯我們引入兩個定義 1 支援度 資料集中包含該集項的記錄所佔的比例 2 置信度 對於關聯規則p m,該規則的置信度為 support p u m su...