溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

10行代碼實現(xiàn)機器學(xué)習(xí)的案例分析

發(fā)布時間:2020-06-24 09:48:57 來源:億速云 閱讀:212 作者:清晨 欄目:編程語言

不懂10行代碼實現(xiàn)機器學(xué)習(xí)的案例分析?其實想解決這個問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

開始

小強會去看電影嗎?

如花,小倩,小明和小強,他們是好基友,經(jīng)常相約去看電影。但小強不是每次都去,以下是他們前四次相約去看電影的情況:(1 表示去看電影,0 表示沒去看電影)

如花小倩小明小強
1011
1101
0010
0100

假如第五次相約看電影,如花不去,小倩和小明要去,那么小強會去嗎?

如花小倩小明小強
1011
1101
0010
0100
011?

我們?nèi)四X對以上數(shù)據(jù)進(jìn)行分析,很容易看出,小強對如花有意思,如花去,小強就去,如花不去,小強就不去,所以得出結(jié)論,小強不去。

人腦思考分析的過程,怎么轉(zhuǎn)換成讓計算機思考呢?

上代碼

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("小強去不去:", "不去" if  p > 0.5 else "去")

不算用于打印的代碼,剛好10行。如果很少用Python進(jìn)行科學(xué)計算的同學(xué)可能會有點蒙蔽,不要著急,下面我對每行代碼進(jìn)行解釋。

導(dǎo)入類庫

from numpy import array, exp, random, dot

numpy 可以說是 Python 科學(xué)計算的基石,用起來非常方便。 對于數(shù)學(xué)計算方便,我們主要導(dǎo)入了 array、exp、random、dot

  • array: 創(chuàng)建矩陣
  • exp:以自然常數(shù)e為底的指數(shù)函數(shù)
  • random: 生產(chǎn)0~1的隨機數(shù)
  • dot: 矩陣相乘

生成數(shù)據(jù)

X = array([
[1,0,1],[1,1,0],[0,0,1],[0,1,0]
])
y = array([[1,1,0,0]]).T

將上表四人相約看電影的數(shù)據(jù)生成代碼,注意第二行有個 .T 是轉(zhuǎn)置的意思,將行向量轉(zhuǎn)成列向量,如下:

[           [
  [1,0,1],    [1],
  [1,1,0],    [1],
  [0,0,1],    [0],
  [0,1,0],    [0],    
]           ]

生成隨機權(quán)重

# 設(shè)置隨機因子,讓每次生成的隨機數(shù)都一樣,方便代碼調(diào)試。
random.seed(1)
# 生成一個范圍為 -1 ~ 1,3列的行向量。
weights = 2 * random.random((3,1))-1

為什么要設(shè)置權(quán)重?

以第一次看電影為例,[1,0,1] 對應(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])的代入,得到小強去不去看電影。

0*w1 + 1*w2 + 1*w3 = 小強去嗎?

怎么求出權(quán)重?

我們把第一條數(shù)據(jù)求出的權(quán)重,很難代入后面三條數(shù)據(jù)。

所以我們隨機一組權(quán)重,代入每一組數(shù)據(jù),得到誤差,再修改權(quán)重,得到新的誤差,如此反復(fù),直至誤差最小化,我們就把這個過程叫做機器學(xué)習(xí)

優(yōu)化權(quán)重

for _ in range(10000):
    # 用 sigmoid函數(shù)將計算結(jié)果進(jìn)行轉(zhuǎn)換
    output = 1/(1+exp(-dot(X, weights)))
    # 用真實值減去計算結(jié)果求出誤差
    error = y - output
    # 計算增量
    delta = error * output*(1-output)    
    # 得到新的權(quán)重
    weights += dot(X.T, delta)

循環(huán)往復(fù) 10000 次,讓誤差不斷變小,最終得到最優(yōu)的權(quán)重,將權(quán)重代入第五次的數(shù)據(jù)就可以推算出小強去不去看電影了。

為什么要用 sigmoid 函數(shù)?

由于計算結(jié)果的范圍是正無窮到負(fù)無窮,用 sigmoid 函數(shù)轉(zhuǎn)換成 0~1,方便進(jìn)行分類,比如大于0.5 去看電影,小于0.5 不去看電影。

怎么計算增量?

delta = error * output*(1-output)

將上面這句分拆成兩句代碼好理解一些:

# 計算斜率,也就是對計算結(jié)果進(jìn)行求導(dǎo)
slope = output*(1-output)
# 基于 error 計算出 delta,用于更新權(quán)重delta = error * slope

斜率是什么?

由于計算結(jié)果被 sigmoid 函數(shù)轉(zhuǎn)換后為0~1的平滑曲線。 要想 error 越小,計算結(jié)果就要無線趨近于0或1,越趨近于0或者1斜率越小

為什么要用讓 error 乘以斜率?

在梯度下降法中,越靠近最優(yōu)點,斜率越小,所以在斜率最小的地方,我們要減小 delta 的變化,以免錯過最優(yōu)點。

預(yù)測結(jié)果

p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0]
print("小強去不去:", "不去" if  p > 0.5 else "去")
// => 不去

將經(jīng)過10000次優(yōu)化后的權(quán)重代入[1,0,0],計算出 p0.9999253713868242,大于 0.5 且無限接近于1,所以小明會去看電影。



感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享10行代碼實現(xiàn)機器學(xué)習(xí)的案例分析內(nèi)容對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI