梯度下降法求解logisitic回歸及其python代碼實現(xiàn)

01 logisitic回歸與梯度下降法
logisitic回歸是因變量是分類的回歸模型或算法,它實際上是一種分類方法础淤,主要用于兩分類問題(即輸出只有兩種,分別代表兩個類別),所以利用了Logistic函數(shù)(或稱為Sigmoid函數(shù))罐盔,函數(shù)形式為:

Paste_Image.png
其中,
z={\theta }_{0}{x }_{0}+{\theta }_{1}{x }_{1}+...+{\theta }_{n}{x }_{n}
z={\theta }_{0}{x }_{0}+{\theta }_{1}{x }_{1}+...+{\theta }_{n}{x }_{n}
透绩,向量表示為:
Z={\Theta}^{T}X
Z={\Theta}^{T}X
翘骂。
梯度下降法則是一種最優(yōu)化算法壁熄,它是用迭代的方法求解目標(biāo)函數(shù)得到最優(yōu)解帚豪,是在最小二乘法cost function(成本函數(shù))的基礎(chǔ)上,利用梯度迭代求出局部最優(yōu)解草丧。在這里關(guān)于梯度下降法不做過多介紹狸臣,相關(guān)資料已經(jīng)很多且后邊還會分析,對其的理解借用一位網(wǎng)友的描述吧:
梯度下降法被比喻成一種方法昌执,一個人蒙著眼睛去找從山坡到溪谷最深處的路烛亦。 他看不到地形圖,所以只能沿著最陡峭的方向一步一步往前走懂拾。每一步的大忻呵荨(也就是梯度)與地勢陡峭的程度成正比。 如果地勢很陡峭岖赋,他就走一大步檬果,因為他相信他仍在高出,還沒有錯過溪谷的最低點唐断。如果地勢比較平坦选脊,他就走一小步。這時如果再走大步脸甘,可能會與最低點失之交臂恳啥。 如果真那樣,他就需要改變方向丹诀,重新朝著溪谷的最低點前進钝的。 他就這樣一步一步的走啊走,直到有一個點走不動了铆遭,因為路是平的了硝桩,于是他卸下眼罩,已經(jīng)到了谷底深處疚脐。
02 用梯度下降法求解logisitic回歸
用梯度下降法求解logisitic回歸的步驟為:
(1)構(gòu)建損失函數(shù)
預(yù)測函數(shù)為:
函數(shù)hθ(x)的值有特殊的含義亿柑,它表示結(jié)果取1的概率,因此對于輸入x分類結(jié)果為類別1和類別0的概率分別為:
(1)式綜合起來可以寫成:
取似然函數(shù)為:
對數(shù)似然函數(shù)為:
最大似然估計就是求使l(θ)取最大值時的θ棍弄,將J(θ)取為下式望薄,即:
因為乘了一個負(fù)的系數(shù)-1/m疟游,所以取J(θ)最小值時的θ為要求的最佳參數(shù)。
注:在這里為什么加了個系數(shù)-1/m痕支,編者翻閱了相關(guān)資料颁虐,因為不加的話,說是不能用梯度下降法(而是梯度上升法)卧须,所以要加負(fù)號另绩,而1/m代表了樣本平均。
最終得到:
(2)梯度下降法求解最小值
采用與線性回歸中一樣的梯度下降法來確定θ的值花嘶,即設(shè)置一個合適的學(xué)習(xí)率α之后笋籽,同步更新所有j=1 to n:

θ更新過程可以寫成:
重復(fù)更新步驟,直到損失函數(shù)的值收斂為止椭员。
03 python代碼的實現(xiàn)
在這里采用了python2.7 版本车海,并分為兩大步驟:構(gòu)建梯度下降法函數(shù)與創(chuàng)建數(shù)據(jù)函數(shù)。而經(jīng)過上面的推導(dǎo)隘击,對我們編程最有用的不是那些過程侍芝,而是得到的結(jié)果,即最后一個公式埋同,因此州叠,將圍繞最后得到的梯度下降法求解公式來構(gòu)建函數(shù)。

-*- coding: UTF-8 -*-
import numpy as np #科學(xué)計算(矩陣)包
import random #生成隨機數(shù)的包

#梯度下降算法函數(shù),x/y是輸入變量凶赁,theta是參數(shù)咧栗,alpha是學(xué)習(xí)率,m是實例哟冬,numIterations梯度下降迭代次數(shù)
def gradientDescent(x, y, theta, alpha, m, numIterations):
    xTrans = x.transpose() #矩陣轉(zhuǎn)置
    #在1-numIterations之間for循環(huán)
    for i in range(0,numIterations):
        hypothesis = np.dot(x,theta) #矩陣相乘
        loss = hypothesis - y #預(yù)測值減去實際值
        # avg cost per example (the 2 in 2*m doesn't really matter here.
        # But to be consistent with the gradient, I include it)
        cost = np.sum(loss **2)/(2 * m)
        #成本函數(shù):loss方差的平均加總楼熄,在這里采用了常用的成本函數(shù),而非logistic特有的
        print("Iteration %d | Cost: %f" % (i, cost))
        # avg gradient per example
        gradient = np.dot(xTrans, loss) / m  #計算梯度
        # update
        theta = theta - alpha * gradient #參數(shù)theta的計算浩峡,即更新法則
    return theta


#創(chuàng)建數(shù)據(jù)可岂,numPoints實例數(shù),bias加一些偏倚或偏差翰灾,variance:方差
def genData(numPoints,bias,variance):
    x = np.zeros(shape=(numPoints,2)) #生成0矩陣缕粹,shape表示矩陣的形狀,參數(shù)1是行纸淮,后邊是列
    y = np.zeros(shape=(numPoints))
    #對x平斩、y的0矩陣填充數(shù)值
    for i in range(0,numPoints):
        x[i][0] = 1 #第i行第1列全部等于1
        x[i][1] = i  # 第i行第2列等于i
        y[i] = (i + bias) + random.uniform(0,1) * variance # 第i行第2列等于i+bias(偏倚),再加,0-1的隨機數(shù)咽块,以及方差
    return x, y

x, y  = genData(100, 25, 10) #傳入?yún)?shù)
print "x:"
print x
print "y:"
print y
m, n = np.shape(x) #檢查x的行列數(shù)绘面,是否一致
numIterations = 100000
alpha = 0.0005  #學(xué)習(xí)率,不能太大也不能太小
theta = np.ones(n) #初始化
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)

可以根據(jù)不同的數(shù)據(jù),利用gradientDescent()函數(shù)來求解揭璃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晚凿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘦馍,更是在濱河造成了極大的恐慌歼秽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情组,死亡現(xiàn)場離奇詭異燥筷,居然都是意外死亡,警方通過查閱死者的電腦和手機院崇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門肆氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵叽,“玉大人纽谒,你說我怎么就攤上這事。” “怎么了濒持?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寺滚。 經(jīng)常有香客問我柑营,道長,這世上最難降的妖魔是什么村视? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任官套,我火速辦了婚禮,結(jié)果婚禮上蚁孔,老公的妹妹穿的比我還像新娘奶赔。我一直安慰自己,他們只是感情好杠氢,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布站刑。 她就那樣靜靜地躺著,像睡著了一般鼻百。 火紅的嫁衣襯著肌膚如雪绞旅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天温艇,我揣著相機與錄音因悲,去河邊找鬼。 笑死勺爱,一個胖子當(dāng)著我的面吹牛晃琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卫旱,長吁一口氣:“原來是場噩夢啊……” “哼视哑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誊涯,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挡毅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暴构,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪呈,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年取逾,在試婚紗的時候發(fā)現(xiàn)自己被綠了耗绿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡砾隅,死狀恐怖误阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晴埂,我是刑警寧澤究反,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站儒洛,受9級特大地震影響精耐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琅锻,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一卦停、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恼蓬,春花似錦惊完、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至郁油,卻和暖如春本股,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桐腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工拄显, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人案站。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓躬审,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子承边,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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