筆記|李宏毅老師機(jī)器學(xué)習(xí)課程,視頻4回歸示例
《學(xué)習(xí)筆記》專欄·第4篇
文 | MLer
1965字 | 6分鐘閱讀
【數(shù)據(jù)科學(xué)與人工智能】開(kāi)通了機(jī)器學(xué)習(xí)群,大家可以相互學(xué)習(xí)和交流。請(qǐng)掃描下方二維碼,備注:姓名-ML,添加我為好友,誠(chéng)邀你入群,一起進(jìn)步。
感謝李宏毅老師的分享,他的課程幫助我更好地學(xué)習(xí)、理解和應(yīng)用機(jī)器學(xué)習(xí)。李老師的網(wǎng)站:http://speech.ee.ntu.edu.tw/~tlkagk/index.html。這個(gè)學(xué)習(xí)筆記是根據(jù)李老師2017年秋季機(jī)器學(xué)習(xí)課程的視頻和講義做的記錄和總結(jié)。因?yàn)檫@個(gè)視頻是在Youtube上面,有些朋友可能無(wú)法觀看,我把它搬運(yùn)下來(lái)放在云盤(pán)上面,大家點(diǎn)擊閱讀原文,就可以直接在手機(jī)隨時(shí)隨地觀看了。再次,感謝李老師的付出和貢獻(xiàn)。
這門課,共有36個(gè)視頻,每個(gè)視頻播放的時(shí)間不一。我按著視頻播放的順序,觀看,聆聽(tīng)和學(xué)習(xí),并結(jié)合講義,做學(xué)習(xí)筆記。我做學(xué)習(xí)筆記目的有三:
1 幫助自己學(xué)習(xí)和理解機(jī)器學(xué)習(xí)
2 記錄機(jī)器學(xué)習(xí)的重要知識(shí)、方法、原理和思想
3 為傳播機(jī)器學(xué)習(xí)做點(diǎn)事情
視頻4:回歸示例
一、梯度下降法尋找best function
一個(gè)簡(jiǎn)單的一元線性回歸為例,演示梯度下降算法尋找best function的過(guò)程。
程式采用Python3和Jupyter notebook 來(lái)示范。你若是要運(yùn)行這些代碼,請(qǐng)先構(gòu)建好Python和數(shù)據(jù)科學(xué)的工作環(huán)境,推薦安裝Anaconda軟件。
代碼如下:
1 導(dǎo)入所需Python庫(kù)
import numpy as npimport matplotlib.pyplot as plt%matplotlib inline
2 模擬數(shù)據(jù)設(shè)計(jì)和生成
x_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.]y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.]# ydata = b + w * xdata
3 窮舉b和w在一定范圍里面所對(duì)應(yīng)的Loss的值
x = np.arange(-200, -100, 1) # biasy = np.arange(-5, 5, 0.1) # weightZ = np.zeros((len(x), len(y)))for i in range(len(x)):for j in range(len(y)):b = x[i]w = y[j]Z[j][i] = 0for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2Z[j][i] = Z[j][i]/len(x_data)
4 利用梯度下降算法尋找Best function所對(duì)應(yīng)的最佳的參數(shù)w和b
# 利用梯度下降算法# ydata = b + w * xdatab = -120 # initial bw = -4 # initial wlr = 0.0000001 # learning rateiteration = 100000 # 迭代次數(shù)# 記錄初始值,用于可視化b_history = [b]w_history = [w]# Iterationsfor i in range(iteration):b_grad = 0.0w_grad = 0.0for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]# update parametersb = b - lr * b_gradw = w - lr * w_grad# 記錄用來(lái)畫(huà)圖的參數(shù)值b_history.append(b)w_history.append(w)# 繪制可視化plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))plt.plot([-188.4], [2.67], 'x', ms=12, markeredgewidth=3, color='orange')plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')plt.xlim(-200, -100)plt.ylim(-5, 5)plt.xlabel(r'$b$', fontsize=16)plt.ylabel(r'$w$', fontsize=16)plt.show()
結(jié)果1:

橫縱表示bias的取值,縱軸表示weight的取值,不同顏色用于區(qū)分在(b,w)下的Loss值差異,顏色越深,表示Loss值越大。黃色的叉表示最佳的(b,w)。我們當(dāng)前的學(xué)習(xí)速率,經(jīng)過(guò)10萬(wàn)次迭代后,沒(méi)有找到最佳的(b,w),修改學(xué)習(xí)速率的值,放大10倍后,見(jiàn)結(jié)果2:

我們發(fā)現(xiàn)離黃色的叉還是有一定距離,我們繼續(xù)把學(xué)習(xí)速率放大10倍,見(jiàn)結(jié)果3:

此時(shí),已經(jīng)無(wú)法收斂到黃色的叉位置。我們?nèi)绾谓鉀Q這個(gè)問(wèn)題?這個(gè)時(shí)候要采用梯度下降算法的變體,對(duì)b和w采用不同的學(xué)習(xí)速率來(lái)更新參數(shù)的值,代碼如下:
# 利用梯度下降算法# 給b,w 特質(zhì)化的學(xué)習(xí)率# ydata = b + w * xdatab = -120 # initial bw = -4 # initial wlr = 1 # learning rateiteration = 100000 # 迭代次數(shù)# 記錄初始值,用于可視化b_history = [b]w_history = [w]lr_b = 0lr_w = 0# Iterationsfor i in range(iteration):b_grad = 0.0w_grad = 0.0for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]lr_b = lr_b + b_grad ** 2lr_w = lr_w + w_grad ** 2# update parametersb = b - lr/np.sqrt(lr_b) * b_gradw = w - lr/np.sqrt(lr_w) * w_grad# 記錄用來(lái)畫(huà)圖的參數(shù)值b_history.append(b)w_history.append(w)# 繪制可視化plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))plt.plot([-188.4], [2.67], 'x', ms=12, markeredgewidth=3, color='orange')plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')plt.xlim(-200, -100)plt.ylim(-5, 5)plt.xlabel(r'$b$', fontsize=16)plt.ylabel(r'$w$', fontsize=16)plt.show()
結(jié)果4:

這時(shí)候,可以收斂到最佳的(b,w)位置了。
思考題:
1 梯度下降算法的權(quán)重更新,學(xué)習(xí)速率的設(shè)置會(huì)帶來(lái)什么影響?
2 學(xué)習(xí)速率有哪些控制方法?
代碼鏈接:
https://github.com/wangluqing/MachineLearning/blob/master/ML_Course/regression_demo.ipynb
朋友們,在學(xué)習(xí)中有什么問(wèn)題或者想法,請(qǐng)加入機(jī)器學(xué)習(xí)群,大家一起討論,共同進(jìn)步。
每周一書(shū)
5數(shù)據(jù)科學(xué)導(dǎo)論:Python語(yǔ)言實(shí)現(xiàn)
課程視頻點(diǎn)擊
↓↓↓
