線性回歸及梯度下降

我們第一個(gè)學(xué)習(xí)的算法是線性回歸状您,通過本篇可以看到這個(gè)算法的概況例驹,更重要的是將會(huì)了解監(jiān)督學(xué)習(xí)的完整流程撩幽。

模型函數(shù)

我們先從一個(gè)例子開始库继,假如我們拿到了這樣一張表格,上面包含了紐約若干程序員的年薪:


那么如果你的工作經(jīng)驗(yàn)是3.5年窜醉,年薪應(yīng)該是多少呢宪萄?

顯而易見,只有工作經(jīng)驗(yàn)和年薪是不同榨惰,那我們就把這兩項(xiàng)抽取出來拜英,首先通過可視化簡(jiǎn)單的看看一下這兩個(gè)的關(guān)系。

我們將要用來描述這個(gè)回歸問題的標(biāo)記如下:

  • ?? 代表訓(xùn)練集中實(shí)例的數(shù)量
  • ?? 代表特征/輸入變量
  • ?? 代表目標(biāo)變量/輸出變量
  • (??,??) 代表訓(xùn)練集中的實(shí)例
  • (??^{(i)},??^{(??)}) 代表第 ?? 個(gè)觀察實(shí)例
    h 代表學(xué)習(xí)算法的解決方案或函數(shù)也稱為假設(shè)(hypothesis)

這是一個(gè)監(jiān)督學(xué)習(xí)算法读串,我們把數(shù)據(jù)集喂給我們的學(xué)習(xí)算法聊记,學(xué)習(xí)算法會(huì)輸出一個(gè)函數(shù)撒妈,通常表示為小寫 h 表示。h 代表 hypothesis(假設(shè))排监,表示 h 根據(jù)輸入的 ?? 值來得出 ?? 值狰右,?? 值對(duì)應(yīng)年薪。 因此舆床,h 是一個(gè)從 ?? 到 ?? 的函數(shù)映射棋蚌。

因而,要解決年薪預(yù)測(cè)問題挨队,我們實(shí)際上是要將已知的數(shù)據(jù)喂給我們的學(xué)習(xí)算法谷暮,進(jìn)而學(xué)習(xí)得到一個(gè)假設(shè) h,那么盛垦, 對(duì)于我們的房?jī)r(jià)預(yù)測(cè)問題湿弦,我們?cè)撊绾伪磉_(dá) h?

要回答這個(gè)問題之前,我們先來看一下數(shù)據(jù)集的大概樣子腾夯,是否可以看出什么颊埃?

x = range(11)
y = [103100, 104900, 106800, 108700, 110400, 
     112300, 114200, 116100, 117800, 119700, 121600]

fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.scatter(x, y)
plt.show()


從上面簡(jiǎn)單的可視化,很明顯工作經(jīng)驗(yàn)(x)越長(zhǎng)蝶俱,年薪(y)越高班利,并且看起來是符合一個(gè)線性關(guān)系。一種可能的表達(dá)方式(模型函數(shù))是:
因?yàn)橹缓幸粋€(gè)輸入變量(特征)榨呆,因此這樣的問題叫作單變量線性回歸問題罗标。

代價(jià)函數(shù)(Cost Fuction)

既然已經(jīng)有了模型函數(shù),我們現(xiàn)在要做的便是為我們的模型選擇合適的參數(shù) θ_0 和 θ_1,我們選擇的參數(shù)決定了我們得到的直線相對(duì)于我們的訓(xùn)練集的準(zhǔn)確程度积蜻,模型所預(yù)測(cè)的值與訓(xùn)練集中實(shí)際值之間的差距(下圖中藍(lán)線所指)就是建模誤差(modeling error)闯割,誤差線就是下圖中的藍(lán)線


為了方便我們把建模誤差的平方和定義如下, 也就是我們說的代價(jià)函數(shù)
image

我們的目標(biāo)便是選擇出可以使得建模誤差的平方和能夠最小的模型參數(shù)。 也就是使得代價(jià)函數(shù)最小

梯度下降

梯度下降是一個(gè)用來求函數(shù)最小值的算法浅侨,我們將使用梯度下降算法來求出代價(jià)函數(shù) ??(??0, ??1) 的最小值纽谒。

梯度下降的思想是:開始時(shí)我們隨機(jī)選擇一個(gè)參數(shù)的組合(??0, ??1, . . . . . . , ????),計(jì)算代價(jià)函數(shù)如输,然后我們尋找下一個(gè)能讓代價(jià)函數(shù)值下降最多的參數(shù)組合。我們持續(xù)這么做直到一個(gè)局部最小值(local minimum)央勒,因?yàn)槲覀儾]有嘗試完所有的參數(shù)組合不见,所以不能確 定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數(shù)組合崔步,可能會(huì)找到不同的局部最小值稳吮。


批量梯度下降(batch gradient descent)算法的公式為:

其中 α 是學(xué)習(xí)率(learning rate),它決定了我們沿著能讓代價(jià)函數(shù)下降程度最大的方向向下邁出的步子有多大井濒,在批量梯度下降中灶似,我們每一次都同時(shí)讓所有的參數(shù)減去學(xué)習(xí)速率乘以代價(jià)函數(shù)的導(dǎo)數(shù)列林。
接下來我們就用梯度下降的方法來擬合例子中的數(shù)據(jù)。

x = np.array([[0,106000],
              [1,107200],
              [2,108400],
              [3,109600],
              [4,110800],
              [5,112000],
              [6,113200],
              [7,114400],
              [8,115600],
              [9, 116800],
              [10, 118000]]
            )
 
m, n = np.shape(x)
x_data = np.ones((m,n))
x_data[:,:-1] = x[:,:-1]
y_data = x[:,-1]
 
m, n = np.shape(x_data)
theta = np.ones(n)

 
cost_arr = []

def batchGradientDescent(maxiter,x,y,theta,alpha):
    xTrains = x.transpose()
    for i in range(0,maxiter):
        hypothesis = np.dot(x,theta)
        loss = (hypothesis-y)
        gradient = np.dot(xTrains,loss)/m
        theta = theta - alpha * gradient
        cost = 1.0/2*m*np.sum(np.square(np.dot(x,np.transpose(theta))-y))
        cost_arr.append(cost)
        if cost < 0.0001:
            break
        
    return theta
 
result = batchGradientDescent(10000,x_data,y_data,theta,0.01)

print ("final: ",result)

newy = np.dot(x_data,result)
fig = plt.figure(figsize=(16, 8))
ax1 = fig.add_subplot(121)
ax1.plot(range(len(cost_arr)), cost_arr, 'ko')
ax2 = fig.add_subplot(122)
ax2.plot(x[:,0],newy, 'k--')
ax2.plot(x[:,0],x[:,1], 'ro')

plt.show()

final = [ 1200.00034431 105999.99760913]
這里的兩個(gè)值就是我們模型函數(shù)中的??0, ??1

梯度下降的曲線和最后擬合的直線如下圖:



此次我們使用超參 α = 0.01酪惭,一共進(jìn)行了6500多次的嘗試最終收斂到0希痴,為了讓收斂的速度加快,我們可以調(diào)整超參春感,比如 α = 0.03砌创,就只進(jìn)行了2000多次就收斂到0。


α = 0.03

多變量線性回歸

之前我們研究的都是單變量的回歸模型鲫懒,當(dāng)我們?cè)黾痈嗟奶卣髂凼担缒挲g、職位等就構(gòu)成了一個(gè)含有多個(gè)變量的模型窥岩,模型中的特征為



增加更多特征后甲献,我們引入一些新的注釋:
?? 代表特征的數(shù)量
??(??)代表第 ?? 個(gè)訓(xùn)練實(shí)例,是特征矩陣中的第??行颂翼,是一個(gè)向量(vector)晃洒。
比方說,上圖的

x^{(i)}_j
代表特征矩陣中第 ?? 行的第 ?? 個(gè)特征疚鲤,也就是第 ?? 個(gè)訓(xùn)練實(shí)例的第 ?? 個(gè)特征锥累。
如上圖的
??^{(2)}_3 = 3
,
??^{(2)}_2 = 30

支持多變量的假設(shè) h 表示為:

這個(gè)公式中有 ?? + 1個(gè)參數(shù)和 ?? 個(gè)變量,為了使得公式能夠簡(jiǎn)化一些集歇,引入 ??0 = 1桶略,則公式轉(zhuǎn)化為:

此時(shí)模型中的參數(shù)是一個(gè)?? + 1維的向量,任何一個(gè)訓(xùn)練實(shí)例也都是?? + 1維的向量诲宇,特征矩陣 ?? 的維度是 ?? ? (?? + 1)际歼。 因此公式可以簡(jiǎn)化為:

其中上標(biāo) ?? 代表矩陣轉(zhuǎn)置。

正規(guī)方程

最小二乘法可以將誤差方程轉(zhuǎn)化為有確定解的代數(shù)方程組(其方程式數(shù)目正好等于未知數(shù)的個(gè)數(shù))姑蓝,從而可求解出這些未知參數(shù)鹅心。這個(gè)有確定解的代數(shù)方程組稱為最小二乘法估計(jì)的正規(guī)方程。

前面我們講過纺荧,Cost Fuction 是:



其中:



將向量表達(dá)形式轉(zhuǎn)為矩陣表達(dá)形式旭愧,則有:

其中??為??行??列的矩陣(??為樣本個(gè)數(shù),??為特征個(gè)數(shù))宙暇,??為??行1列的矩陣输枯,??為??行1列的矩陣,對(duì)??(??)進(jìn)行如下變換:



接下來對(duì)??(??)偏導(dǎo)占贫,需要用到以下幾個(gè)矩陣的求導(dǎo)法則:


所以有:


則有:



Python中對(duì)于矩陣的各種操作可以通過 Numpy 庫的一些方法來實(shí)現(xiàn)桃熄,非常方便。但在這個(gè)代碼實(shí)現(xiàn)中需要注意:X矩陣不能為奇異矩陣型奥,否則是無法求解矩陣的逆的瞳收。下面是最小二乘法的代碼實(shí)現(xiàn)部分碉京。
def standRegres(xArr,yArr):
    """
    函數(shù)說明:計(jì)算回歸系數(shù)theta
    Parameters:
        xArr - x數(shù)據(jù)集
        yArr - y數(shù)據(jù)集
    Returns:
        theta - 回歸系數(shù)
    """
    xMat = np.mat(xArr); yMat = np.mat(yArr).T
    #根據(jù)文中推導(dǎo)的公示計(jì)算回歸系數(shù)
    xTx = xMat.T * xMat 
    if np.linalg.det(xTx) == 0.0:
        print("矩陣為奇異矩陣,不能求逆")
        return
    theta = xTx.I * (xMat.T*yMat)
    return theta

最小二乘法 vs 梯度下降法

二者都對(duì)損失函數(shù)的回歸系數(shù)進(jìn)行了求偏導(dǎo),并且所得到的推導(dǎo)結(jié)果是相同的螟深,那么究竟哪里不同呢谐宙?

最小二乘法通過使推導(dǎo)結(jié)果等于0,從而直接求得極值血崭,而梯度下降則是將推導(dǎo)結(jié)果帶入迭代公式中卧惜,一步一步地得到最終結(jié)果。簡(jiǎn)單地說夹纫,最小二乘法是一步到位的咽瓷,而梯度下降是一步步進(jìn)行的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰讹,一起剝皮案震驚了整個(gè)濱河市茅姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月匣,老刑警劉巖钻洒,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锄开,居然都是意外死亡素标,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門萍悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头遭,“玉大人,你說我怎么就攤上這事癣诱〖莆” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵撕予,是天一觀的道長(zhǎng)鲫惶。 經(jīng)常有香客問我,道長(zhǎng)实抡,這世上最難降的妖魔是什么欠母? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吆寨,結(jié)果婚禮上艺蝴,老公的妹妹穿的比我還像新娘。我一直安慰自己鸟废,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布姑荷。 她就那樣靜靜地躺著盒延,像睡著了一般缩擂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上添寺,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天胯盯,我揣著相機(jī)與錄音,去河邊找鬼计露。 笑死博脑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的票罐。 我是一名探鬼主播叉趣,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼该押!你這毒婦竟也來了疗杉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蚕礼,失蹤者是張志新(化名)和其女友劉穎烟具,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠蹬,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朝聋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囤躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀痕。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖割以,靈堂內(nèi)的尸體忽然破棺而出金度,到底是詐尸還是另有隱情,我是刑警寧澤严沥,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布猜极,位于F島的核電站,受9級(jí)特大地震影響消玄,放射性物質(zhì)發(fā)生泄漏跟伏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一翩瓜、第九天 我趴在偏房一處隱蔽的房頂上張望受扳。 院中可真熱鬧,春花似錦兔跌、人聲如沸勘高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽华望。三九已至蕊蝗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赖舟,已是汗流浹背蓬戚。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾抓,地道東北人子漩。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像石洗,于是被迫代替她去往敵國(guó)和親幢泼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 線性回歸及梯度下降 參考資料:網(wǎng)址 本文會(huì)講到: (1) 線性回歸的定義 (2) 單變量線性回歸 (3) cost...
    raincoffee閱讀 561評(píng)論 0 1
  • (第一部分 機(jī)器學(xué)習(xí)基礎(chǔ))第01章 機(jī)器學(xué)習(xí)概覽第02章 一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(上)第02章 一個(gè)完整的機(jī)器學(xué)習(xí)...
    SeanCheney閱讀 7,605評(píng)論 2 14
  • 背景 學(xué)習(xí)深度學(xué)習(xí)已經(jīng)一段時(shí)間了劲腿,但是學(xué)習(xí)過程中總覺得缺了點(diǎn)什么旭绒,無從動(dòng)手編程。因此焦人,我還是希望使用寫文章的方式來...
    yjy239閱讀 2,218評(píng)論 0 7
  • AI人工智能時(shí)代挥吵,機(jī)器學(xué)習(xí)红符,深度學(xué)習(xí)作為其核心扁瓢,本文主要介紹機(jī)器學(xué)習(xí)的基礎(chǔ)算法,以詳細(xì)線介紹 線性回歸算法 及其 ...
    erixhao閱讀 13,854評(píng)論 0 36
  • 從回來之后方淤,就一直在忙找工作的事情矿辽,從全職轉(zhuǎn)到實(shí)習(xí)丹允,從有選擇的投簡(jiǎn)歷轉(zhuǎn)到海投。不知道發(fā)了多少封郵件袋倔,寫了多少次求職...
    glacier2016閱讀 662評(píng)論 0 1