創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)通城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。不懂10行代碼實(shí)現(xiàn)機(jī)器學(xué)習(xí)的案例分析?其實(shí)想解決這個(gè)問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。
開始小強(qiáng)會(huì)去看電影嗎?
如花,小倩,小明和小強(qiáng),他們是好基友,經(jīng)常相約去看電影。但小強(qiáng)不是每次都去,以下是他們前四次相約去看電影的情況:(1 表示去看電影,0 表示沒去看電影)
如花 | 小倩 | 小明 | 小強(qiáng) |
---|---|---|---|
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
假如第五次相約看電影,如花不去,小倩和小明要去,那么小強(qiáng)會(huì)去嗎?
如花 | 小倩 | 小明 | 小強(qiáng) |
---|---|---|---|
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | ? |
我們?nèi)四X對(duì)以上數(shù)據(jù)進(jìn)行分析,很容易看出,小強(qiáng)對(duì)如花有意思,如花去,小強(qiáng)就去,如花不去,小強(qiáng)就不去,所以得出結(jié)論,小強(qiáng)不去。
人腦思考分析的過程,怎么轉(zhuǎn)換成讓計(jì)算機(jī)思考呢?
上代碼from numpy import array, exp, random, dot X = array([[1,0,1],[1,1,0],[0,0,1],[0,1,0]]) y = array([[1,1,0,0]]).T random.seed(1) weights = 2 * random.random((3,1)) - 1 for _ in range(10000): output = 1/(1+exp(-dot(X, weights))) error = y - output delta = error * output * (1-output) weights += dot(X.T, delta) p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0] print("小強(qiáng)去不去:", "不去" if p > 0.5 else "去")
不算用于打印的代碼,剛好10行。如果很少用Python進(jìn)行科學(xué)計(jì)算的同學(xué)可能會(huì)有點(diǎn)蒙蔽,不要著急,下面我對(duì)每行代碼進(jìn)行解釋。
導(dǎo)入類庫from numpy import array, exp, random, dot
numpy 可以說是 Python 科學(xué)計(jì)算的基石,用起來非常方便。 對(duì)于數(shù)學(xué)計(jì)算方便,我們主要導(dǎo)入了 array、exp、random、dot
X = array([ [1,0,1],[1,1,0],[0,0,1],[0,1,0] ]) y = array([[1,1,0,0]]).T
將上表四人相約看電影的數(shù)據(jù)生成代碼,注意第二行有個(gè) .T
是轉(zhuǎn)置的意思,將行向量轉(zhuǎn)成列向量,如下:
[ [ [1,0,1], [1], [1,1,0], [1], [0,0,1], [0], [0,1,0], [0], ] ]生成隨機(jī)權(quán)重
# 設(shè)置隨機(jī)因子,讓每次生成的隨機(jī)數(shù)都一樣,方便代碼調(diào)試。 random.seed(1) # 生成一個(gè)范圍為 -1 ~ 1,3列的行向量。 weights = 2 * random.random((3,1))-1
為什么要設(shè)置權(quán)重?
以第一次看電影為例,[1,0,1] 對(duì)應(yīng) [1],他們之間存在某種關(guān)聯(lián),如下:
1*w1 + 0*w2 + 1*w3 = 1
w1
,w2
,w3
,表示的就是權(quán)重。
如果我們能求出w1
,w2
,w3
,是不是就可以把第五次([0,1,1])的代入,得到小強(qiáng)去不去看電影。
0*w1 + 1*w2 + 1*w3 = 小強(qiáng)去嗎?
怎么求出權(quán)重?
我們把第一條數(shù)據(jù)求出的權(quán)重,很難代入后面三條數(shù)據(jù)。
所以我們隨機(jī)一組權(quán)重,代入每一組數(shù)據(jù),得到誤差,再修改權(quán)重,得到新的誤差,如此反復(fù),直至誤差最小化,我們就把這個(gè)過程叫做機(jī)器學(xué)習(xí)
優(yōu)化權(quán)重for _ in range(10000): # 用 sigmoid函數(shù)將計(jì)算結(jié)果進(jìn)行轉(zhuǎn)換 output = 1/(1+exp(-dot(X, weights))) # 用真實(shí)值減去計(jì)算結(jié)果求出誤差 error = y - output # 計(jì)算增量 delta = error * output*(1-output) # 得到新的權(quán)重 weights += dot(X.T, delta)
循環(huán)往復(fù) 10000 次,讓誤差不斷變小,最終得到最優(yōu)的權(quán)重,將權(quán)重代入第五次的數(shù)據(jù)就可以推算出小強(qiáng)去不去看電影了。
為什么要用 sigmoid 函數(shù)?
由于計(jì)算結(jié)果的范圍是正無窮到負(fù)無窮,用 sigmoid 函數(shù)轉(zhuǎn)換成 0~1,方便進(jìn)行分類,比如大于0.5 去看電影,小于0.5 不去看電影。
怎么計(jì)算增量?
delta = error * output*(1-output)
將上面這句分拆成兩句代碼好理解一些:
# 計(jì)算斜率,也就是對(duì)計(jì)算結(jié)果進(jìn)行求導(dǎo) slope = output*(1-output) # 基于 error 計(jì)算出 delta,用于更新權(quán)重delta = error * slope
斜率是什么?
由于計(jì)算結(jié)果被 sigmoid 函數(shù)轉(zhuǎn)換后為0~1的平滑曲線。 要想 error 越小,計(jì)算結(jié)果就要無線趨近于0或1,越趨近于0或者1斜率越小
為什么要用讓 error 乘以斜率?
在梯度下降法中,越靠近最優(yōu)點(diǎn),斜率越小,所以在斜率最小的地方,我們要減小 delta 的變化,以免錯(cuò)過最優(yōu)點(diǎn)。
預(yù)測結(jié)果p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0] print("小強(qiáng)去不去:", "不去" if p > 0.5 else "去") // => 不去
將經(jīng)過10000次優(yōu)化后的權(quán)重代入[1,0,0],計(jì)算出 p
為 0.9999253713868242
,大于 0.5 且無限接近于1,所以小明會(huì)去看電影。