(史上最詳細(xì))批量梯度下降算法、隨機(jī)梯度下降算法葫笼、小批量梯度下降算法python代碼實(shí)現(xiàn)

偽代碼:

批量梯度下降法(Batch Gradient Descent):
Repeat until convergence{\theta _{j}:=\theta _{j}+\alpha \sum_{i=1}^{m}(y_{i}^{}-\theta _{i}^{T}x_{i}^{})x_{j}}

隨機(jī)梯度下降法(Stochastic Batch Gradient Descent):
Loop{
????for i = 1 to m,,{
????????????\theta_{j}:=w_{j}+\alpha(y_{i}^{}-\theta_{i}^{T}x_{i}^{})x_{j}
????????????}
}
小批量梯度下降(Mini Batch Gradient Descent):
Repeat{
????for i = 1, 11, 21, 31, ... , 991 m,拗馒,{
????????????\theta_{j}:=\theta _{j}+\alpha\frac{1}{10}\sum_{i}^{i+9}(y_{i}^{}-\theta_{i}^{T}x_{i}^{})x_{j}
????????????}
}

python代碼:

隨機(jī)梯度下降:

import numpy as np

# 構(gòu)造訓(xùn)練數(shù)據(jù)集
x_train = np.array([[2, 0., 3], [3, 1., 3], [0, 2., 3], [4, 3., 2], [1, 4., 4]])

# 構(gòu)建一個(gè)權(quán)重作為數(shù)據(jù)集的真正的權(quán)重路星,theta1主要是用來構(gòu)建y_train,然后通過模型計(jì)算
# 擬合的theta诱桂,這樣可以比較兩者之間的差異洋丐,驗(yàn)證模型。
theta1 = np.array([[2 ,3, 4]]).T

# 構(gòu)建標(biāo)簽數(shù)據(jù)集,y=t1*x1+t2*x2+t3*x3+b即y=向量x_train乘向量theta+b, 這里b=2
y_train = (x_train.dot(theta1) + np.array([[2],[2],[2],[2],[2]])).ravel() 

# 構(gòu)建一個(gè)5行1列的單位矩陣x0访诱,然它和x_train組合垫挨,形成[x0, x1, x2, x3],x0=1的數(shù)據(jù)形式触菜,
# 這樣可以將y=t1*x1+t2*x2+t3*x3+b寫為y=b*x0+t1*x1+t2*x2+t3*x3即y=向量x_train乘向
# 量theta其中theta應(yīng)該為[b, *, * , *]九榔,則要擬合的theta應(yīng)該是[2,2,3,4],這個(gè)值可以
# 和算出來的theta相比較涡相,看模型的是否達(dá)到預(yù)期
x0 = np.ones((5, 1))
input_data = np.hstack([x0, x_train])
m, n = input_data.shape

# 設(shè)置兩個(gè)終止條件
loop_max = 10000000
epsilon = 1e-6

# 初始化theta(權(quán)重)
np.random.seed(0)
theta = np.random.rand(n).T # 隨機(jī)生成10以內(nèi)的哲泊,n維1列的矩陣

# 初始化步長(zhǎng)/學(xué)習(xí)率
alpha = 0.000001
# 初始化迭代誤差(用于計(jì)算梯度兩次迭代的差)
error = np.zeros(n)

# 初始化偏導(dǎo)數(shù)矩陣
diff = np.zeros(n)

# 初始化循環(huán)次數(shù)
count = 0

while count < loop_max:
    count += 1  # 沒運(yùn)行一次count加1,以此來總共記錄運(yùn)行的次數(shù)
    
    # 計(jì)算梯度
    for i in range(m):
        # 計(jì)算每個(gè)維度theta的梯度催蝗,并運(yùn)用一個(gè)梯度去更新它
        diff = input_data[i].dot(theta)-y_train[i]
        theta = theta - alpha * diff*(input_data[i])
    
    # else中將前一個(gè)theta賦值給error,theta - error便表示前后兩個(gè)梯度的變化切威,當(dāng)梯度
    #變化很小(在接收的范圍內(nèi))時(shí)丙号,便停止迭代先朦。
    if np.linalg.norm(theta - error) < epsilon: # 判斷theta與零向量的距離是否在誤差內(nèi)
        break
    else:
        error = theta  
print(theta)

??真實(shí)的theta為[2, 2, 3, 4],計(jì)算結(jié)果如下圖1
批量梯度下降:

import numpy as np

# 構(gòu)造訓(xùn)練數(shù)據(jù)集
x_train = np.array([[2, 0., 3], [3, 1., 3], [0, 2., 3], [4, 3., 2], [1, 4., 4]])
m = len(x_train)

x0 = np.full((m, 1), 1)

# 構(gòu)造一個(gè)每個(gè)數(shù)據(jù)第一維特征都是1的矩陣
input_data = np.hstack([x0, x_train])
m, n = input_data.shape
theta1 = np.array([[2 ,3, 4]]).T
# 構(gòu)建標(biāo)簽數(shù)據(jù)集犬缨,后面的np.random.randn是將數(shù)據(jù)加一點(diǎn)噪聲喳魏,以便模擬數(shù)據(jù)集。
#y_train = (input_data.dot(np.array([1, 2, 3, 4]).T)).T
y_train = x_train.dot(theta1) + np.array([[2],[2],[2],[2],[2]]) 

# 設(shè)置兩個(gè)終止條件
loop_max = 1000000
epsilon = 1e-5

# 初始theta
np.random.seed(0)  # 設(shè)置隨機(jī)種子
theta = np.random.randn(n,1)   # 隨機(jī)取一個(gè)1維列向量初始化theta

# 初始化步長(zhǎng)/學(xué)習(xí)率
alpha = 0.00001
# 初始化誤差怀薛,每個(gè)維度的theta都應(yīng)該有一個(gè)誤差刺彩,所以誤差是一個(gè)4維。
error = np.zeros((n, 1))  # 列向量

# 初始化偏導(dǎo)數(shù)
diff = np.zeros((input_data.shape[1], 1 ))

# 初始化循環(huán)次數(shù)
count = 0

while count < loop_max:
    count += 1
    sum_m = np.zeros((n, 1))

    for i in range(m):
        for j in range(input_data.shape[1]):
            # 計(jì)算每個(gè)維度的theta
            diff[j] = (input_data[i].dot(theta)-y_train[i])*input_data[i, j]
        # 求每個(gè)維度的梯度的累加和
        sum_m = sum_m + diff
    # 利用這個(gè)累加和更新梯度    
    theta = theta - alpha * sum_m
    # else中將前一個(gè)theta賦值給error,theta - error便表示前后兩個(gè)梯度的變化,當(dāng)梯度
    #變化很写淳蟆(在接收的范圍內(nèi))時(shí)嗡害,便停止迭代。
    if np.linalg.norm(theta - error) < epsilon:
        break
    else:
        error = theta
 
print(theta)

??真實(shí)的theta為[2, 2, 3, 4]畦攘,計(jì)算結(jié)果如下圖2:
小批量梯度下降:

import numpy as np

# 構(gòu)造訓(xùn)練數(shù)據(jù)集
x_train = np.array([[2, 0., 3], [3, 1., 3], [0, 2., 3], [4, 3., 2], [1, 4., 4]])
m = len(x_train)

x0 = np.full((m, 1), 1)

# 構(gòu)造一個(gè)每個(gè)數(shù)據(jù)第一維特征都是1的矩陣
input_data = np.hstack([x0, x_train])
m, n = input_data.shape
theta1 = np.array([[2 ,3, 4]]).T
# 構(gòu)建標(biāo)簽數(shù)據(jù)集霸妹,后面的np.random.randn是將數(shù)據(jù)加一點(diǎn)噪聲,以便模擬數(shù)據(jù)集念搬。
#y_train = (input_data.dot(np.array([1, 2, 3, 4]).T)).T
y_train = x_train.dot(theta1) + np.array([[2],[2],[2],[2],[2]]) 

# 設(shè)置兩個(gè)終止條件
loop_max = 1000000
epsilon = 1e-5

# 初始theta
np.random.seed(0)  # 設(shè)置隨機(jī)種子
theta = np.random.randn(n,1)   # 隨機(jī)取一個(gè)1維列向量初始化theta

# 初始化步長(zhǎng)/學(xué)習(xí)率
alpha = 0.00001
# 初始化誤差抑堡,每個(gè)維度的theta都應(yīng)該有一個(gè)誤差,所以誤差是一個(gè)4維朗徊。
error = np.zeros((n, 1))  # 列向量

# 初始化偏導(dǎo)數(shù)
diff = np.zeros((input_data.shape[1], 1 ))

# 初始化循環(huán)次數(shù)
count = 0

# 設(shè)置小批量的樣本數(shù)
minibatch_size= 2 

while count < loop_max:
    count += 1
    sum_m = np.zeros((n, 1))

    for i in range(1, m, minibatch_size):
        for j in range(i - 1, i + minibatch_size - 1, 1):
            # 計(jì)算每個(gè)維度的theta
            diff[j] = (input_data[i].dot(theta)-y_train[i])*input_data[i, j]
        # 求每個(gè)維度的梯度的累加和
        sum_m = sum_m + diff
    # 利用這個(gè)累加和更新梯度    
    theta = theta - alpha * (1.0 / minibatch_size)* sum_m
    # else中將前一個(gè)theta賦值給error,theta - error便表示前后兩個(gè)梯度的變化首妖,當(dāng)梯度
    #變化很小(在接收的范圍內(nèi))時(shí)爷恳,便停止迭代有缆。
    if np.linalg.norm(theta - error) < epsilon:
        break
    else:
        error = theta
    
print(theta)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市温亲,隨后出現(xiàn)的幾起案子棚壁,更是在濱河造成了極大的恐慌,老刑警劉巖栈虚,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袖外,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡魂务,警方通過查閱死者的電腦和手機(jī)曼验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粘姜,“玉大人鬓照,你說我怎么就攤上這事」陆簦” “怎么了豺裆?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)号显。 經(jīng)常有香客問我臭猜,道長(zhǎng),這世上最難降的妖魔是什么押蚤? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任获讳,我火速辦了婚禮,結(jié)果婚禮上活喊,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好钾菊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布帅矗。 她就那樣靜靜地躺著,像睡著了一般煞烫。 火紅的嫁衣襯著肌膚如雪浑此。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天滞详,我揣著相機(jī)與錄音凛俱,去河邊找鬼。 笑死料饥,一個(gè)胖子當(dāng)著我的面吹牛蒲犬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岸啡,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼原叮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了巡蘸?” 一聲冷哼從身側(cè)響起奋隶,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悦荒,沒想到半個(gè)月后唯欣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搬味,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年境氢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片身腻。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡产还,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀趟,到底是詐尸還是另有隱情脐区,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布她按,位于F島的核電站牛隅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酌泰。R本人自食惡果不足惜媒佣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陵刹。 院中可真熱鬧默伍,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狸剃,卻和暖如春掐隐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞馁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工虑省, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僧凰。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓探颈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親允悦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膝擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡(jiǎn)書 聲明:作者翻譯論文僅為學(xué)習(xí),如有侵權(quán)請(qǐng)...
    SnailTyan閱讀 5,065評(píng)論 0 8
  • 前言 梯度下降算法現(xiàn)在變的越來越流行隙弛,但是對(duì)于使用者來說架馋,它的優(yōu)化過程變的越來越黑盒。本文我們介紹下不通梯度下降算...
    wendaJ閱讀 1,524評(píng)論 0 1
  • 轉(zhuǎn)載-劉建平Pinard-www.cnblogs.com/pinard/p/5970503.html 在求解機(jī)器學(xué)...
    商三郎閱讀 3,498評(píng)論 0 2
  • 1-對(duì)象-變換-移動(dòng)對(duì)象填充的圖案全闷; 2-顏色參考-查找相似可替換的顏色叉寂; 3-漸變網(wǎng)格 網(wǎng)格漸變 4-填充背景色...
    wenchaohe閱讀 212評(píng)論 0 0
  • 今天,2017年6月27日总珠,好好一年級(jí)下學(xué)期期末考試屏鳍! 狀態(tài)很好哦,不管最后結(jié)果如何局服,又經(jīng)歷了自己人生當(dāng)中的一次小...
    1d2f17e8e96a閱讀 267評(píng)論 0 0