Andrew Ng 機(jī)器學(xué)習(xí)記錄共三篇。本篇是關(guān)于 Andrew Ng 機(jī)器學(xué)習(xí)網(wǎng)易云公開課前 6 章的總結(jié)。全部課程共 18 章。觀看課程視頻可點擊 Coursera 和網(wǎng)易云課堂。網(wǎng)易云課堂目前僅翻譯到正則化,這篇小結(jié)也只到正則化之前,點擊 B 站獲取完整版。 在進(jìn)行小結(jié)之前,我們先看一下本次小結(jié)內(nèi)容的目錄(目錄中文翻譯源自網(wǎng)易云課堂): · Introduction(緒論:初識機(jī)器學(xué)習(xí)) Introduction
Linear Regression with One Variable
用來分類,它的結(jié)果是一些離散值。 舉個例子:判斷腫瘤的惡性良性就可以視為一種分類,結(jié)果有良性 (0)、腫瘤類型 A (1)、腫瘤類型 B (2) 等。特征是指腫瘤大小、腫瘤厚度等(我們用機(jī)器學(xué)習(xí)算法不止是想處理3-5個特征,而是因為想要處理無窮個特征)。
舉個例子:社交網(wǎng)絡(luò)判斷你們是否認(rèn)識并推薦好友,如果你用 facebook 的話應(yīng)該對這一點感覺很強(qiáng)烈。
通過計算得出用哪種直線最貼合數(shù)據(jù)。 選擇兩個參數(shù) 代價函數(shù)的意義 假設(shè)函數(shù) h(x) 是關(guān)于 x 的函數(shù),代價函數(shù) J 是關(guān)于系數(shù) 一組 機(jī)器學(xué)習(xí)要做的就是通過給出的數(shù)據(jù)用算法自動找到 J 最小值時的這個點,而不需要人為的計算參數(shù)。
初值偏移的方位稍有不同可能會到達(dá)不同的局部最優(yōu)解,達(dá)到局部最優(yōu)解時斜率為0 即偏導(dǎo)為0, 在運用梯度下降法時需注意: · · 將梯度下降法通俗的解釋可以說:我站在山的某一處,要找到最快下山的路,一是我下一步邁向哪個方向;二是這一步邁多大,達(dá)成到達(dá)最低點的目的,這就是梯度下降法做的。 梯地下降法也可用于計算其他函數(shù)的代價函數(shù),而不僅是以上作為例子介紹的回歸函數(shù)。
梯度下降法會陷入局部最優(yōu),而回歸函數(shù)是一個凸函數(shù)(它的圖像形狀是一個碗狀),只有一個全局最優(yōu)解,這時用梯度下降法可以得到一個最小值,即要求的值。 梯度下降法是一種迭代算法,逐步計算更新回歸函數(shù)里的 因此在上圖中,右邊紅色的點每移動一下,左邊的直線會隨斜率的改變而改變,紅色的點到達(dá)最低點時,直線最好的擬合了數(shù)據(jù)。 Linear Algebra Review
在算法學(xué)習(xí)中需要有把數(shù)據(jù)在函數(shù)中的使用拆成矩陣的計算能力,向量也可視為列數(shù)為 1 特殊的矩陣,關(guān)于線性代數(shù)的知識這里不再贅述。 Linear Regression with Multiple Variables
關(guān)于特征范圍的預(yù)處理和學(xué)習(xí)率的選取。 · 從 1 個特征值拓展到多個特征值 · · 多個特征在相近的范圍內(nèi),梯度下降法才可快速收斂 · 采用均值歸一化處理 · 可以用迭代次數(shù)和J( · 學(xué)習(xí)率
關(guān)于用二次函數(shù)、三次函數(shù)等擬合。 此時注意特征縮放,適合數(shù)據(jù)走向的函數(shù)圖形,你可以自己選擇特征,可以自己設(shè)計特征(如房屋面積 = 長 * 寬) ????。
不同于梯度下降法,它不需要重復(fù)多次運算,可以一次性求出 用上圖紅色框中的式子計算 如果有特別多(百萬級)的特征時則用梯度下降法(Ng 以一萬為界考慮)。 當(dāng)出現(xiàn)不可逆的情況時,可能是有多余的特征值或有過多的特征值(樣本數(shù) m < 特征數(shù)=""> 用 Octave 里的 pinv 函數(shù)不會出現(xiàn)這種情況,因為 pinv 函數(shù)求的是偽逆(pesedo-inverse)。 Octave/Matlab Tutorial這里用簡單的語言介紹 Octave 的使用。推薦查看 Octave 文檔學(xué)習(xí)使用。 邏輯運算 1 == 2 %表示注釋,false,輸出 ans = 0,用0來表示假1~= 2 %1不等于2,不等號“~=”xor(1, 0) 異或運算
Octave 變量 >>>format long %輸入format long,讓字符串顯示默認(rèn)位數(shù)>>>>aa = 3.14159265358979>>>>format short %輸入format short,輸出小數(shù)點后少的位數(shù)>>>>aa = 3.1416' title='' data-original-title='復(fù)制'> 賦值 a = 3 會打印a = 3; 有分號不打印 隱藏了>>>>a = pi;>>>>a %按a輸出下面a = 3.1416disp(a) %disp是一個打印命令>>>>disp(a)3.1416>>>>disp(sprintf('2 decimals: %0.2f', a )) %保留 2 位小數(shù)的寫法 %0.2f2 decimals: 3.14>>>>format long %輸入format long,讓字符串顯示默認(rèn)位數(shù)>>>>aa = 3.14159265358979>>>>format short %輸入format short,輸出小數(shù)點后少的位數(shù)>>>>aa = 3.1416 向量和矩陣 >>>>A = [1 2; %矩陣的寫法1> 3 4;> 5 6]A = 1 2 3 4 5 6>>>>A = [1 2; 3 4; 5 6] %矩陣的寫法2A = 1 2 3 4 5 6>>>>v = 1: 0.1: 2 %從 1 開始,步長為 0.1,一直增加到2v = 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000>>>>v = 1:6 %按整數(shù)輸出v = 1 2 3 4 5 6>>>>ones(2,3) %生成矩陣的快速方式ans = 1 1 1 1 1 1>>>>c = 2*ones(2,3)c = 2 2 2 2 2 2>>>>w = zeros(1,3)w = 0 0 0>>>>w = rand(1,3) %隨機(jī)生成一行三列的矩陣,介于0到1之間的隨機(jī)值w = 0.98343 0.79271 0.93922>>>>w = randn(1,3) %服從高斯分布,均值為0標(biāo)準(zhǔn)差或方差為1w = 0.50732 1.51904 -1.28292hist(w) %繪制直方圖??hist(w,50) %有50個豎條的直方圖>>>>eye(4) %生成矩陣的特殊方式,生成單位矩陣ans =Diagonal Matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1>>>>help eye %顯示eye函數(shù)的幫助文檔 Octave的基本操作 >>>>size(A) % size 返回矩陣的大小ans = 3 2>>>>size(A,1) %返回A矩陣第一維度的大小,即A矩陣的行數(shù)ans = 3>>>>size(A,2) %列數(shù)ans = 2>>>>length(A) %返回最大維度的大小,可以對矩陣使用但是也會造成confusingans = 3>>>>length([1;2;3;4;5]) %通常對向量使用ans = 5 從文件中加載和查找數(shù)據(jù) >>>>pwdans = /Users/Ocatave程序安裝路徑,顯示當(dāng)前所在路徑cd 更改路徑,文件名不要包含空格會出錯>>>>who %顯示Octave里現(xiàn)有的變量Variables in the current scope:A a ans c v w>>>>load 文件名 %注意格式,我在這里導(dǎo)入失敗了,視頻里示例的是.dat文件后面輸入不加后綴的文件名,即顯示文件里的內(nèi)容>>>> whos %顯示變量更詳細(xì)的信息Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== A 3x2 48 double a 1x1 8 double ans 1x39 39 char c 2x3 48 double v 1x6 24 double w 1x10000 80000 doubleTotal is 10058 elements using 80167 bytes>>>>clear A %刪除變量>>>>clear %只輸入clear,則刪除所有變量>>>>v = priceY(1:10) %priceY是之前導(dǎo)入的文件,把它的前10個數(shù)據(jù)賦給v>>>>save vector.mat v %將v存在當(dāng)前路徑命名為vector.mat的文件,壓縮形式>>>>save vector.txt v -ascii %儲存為人能看懂的文本形式,-ascii必須要加 索引操作 >>>>A(3,2) %顯示第三行第二列的那個元素ans = 6>>>>A(2,:) %顯示第二行的所有元素ans = 3 4>>>>A(:,2) %顯示第二列的所有元素ans = 2 4 6>>>>A([1 3], :) %顯示第一行第三行的所有列元素ans = 1 2 5 6>>>>A(:,2) = [11,22,33] %索引也可以用來賦值A(chǔ) = 1 11 3 22 5 33>>>>A = [A,[90;80;70]] %給矩陣A新增加一列A = 1 11 90 3 22 80 5 33 70>>>>A(:) %把A中所有的元素按一列輸出ans = 1 3 5 11 22 33 90 80 70>>>>C = [A B] %把A和B兩個矩陣合起來(延伸:把矩陣看作一個數(shù)值元素進(jìn)行操作,[A, B] [A;B])C = 1 2 11 22 3 4 33 44 5 6 55 66 對矩陣中的元素進(jìn)行運算 >>>val = max(a)val = 15>>>>[val, ind] = max(a) %ind是max(a)索引val = 15ind = 2>>>>max(A) %默認(rèn)輸出每一列的最大值ans = 5 6>>>>aa = 1.00000 15.00000 2.00000 0.50000>>>>a < 3="" %對應(yīng)元素比較,返回真假ans="1" 0="" 1="" 1="">>>>find(a < 3)="" %找到符合的值,返回索引,a是向量ans="1" 3="" 4="">>>>[r, c] = find(A >= 7) %A是矩陣,r行c列r = 1 3 2c = 1 2 3>>>>A = magic(3) %幻方,任意行列加起來的值相等(包括對角線),便捷的生成一個3*3的矩陣A = 8 1 6 3 5 7 4 9 2>>>>sum(a) %求和ans = 18.500>>>>prod(a) %求積ans = 15>>>>floor(a) %向下取整ans = 1 15 2 0>>>>ceil(a) %向上取整ans = 1 15 2 1>>>>max(rand(3), rand(3)) %由兩個隨機(jī)矩陣中較大的數(shù)值組成ans = 0.50037 0.85282 0.86935 0.87063 0.82242 0.72379 0.75042 0.38446 0.72941>>>>max(A,[],1) %輸出每一列的最大值,1表示從第一維度取值ans = 8 9 7>>>>max(A, [], 2) %輸出每一行的最大值ans = 8 7 9>>>>max(max(A)) %只是想知道整個矩陣的最大值ans = 9>>>>sum(A,1) %求A每一列的總和,第 1 維度是列;第 2 維度是行 ans = 369 369 369 369 369 369 369 369 369>>>>A .*eye(9) %得到對角線元素的一個方法ans = 47 0 0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 41 0 0 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 0 0 74 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 35>>>>A .*flipud(eye(9)) % flipud 使矩陣垂直翻轉(zhuǎn)ans = 0 0 0 0 0 0 0 0 45 0 0 0 0 0 0 0 44 0 0 0 0 0 0 0 43 0 0 0 0 0 0 0 42 0 0 0 0 0 0 0 41 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 39 0 0 0 0 0 0 0 38 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0>>>>pinv(A) %求偽逆' title='' data-original-title='復(fù)制'> >>>>A * C %矩陣乘法,這里注意A的列數(shù)和B的行數(shù)相等>>>>A .*B %A中的元素和B中對應(yīng)位置的元素相乘,這里也默認(rèn)它們size一樣,這個點通常表示元素的運算,對矩陣和向量都可以用ans = 11 24 39 56 75 96>>>>A .^2 %對A中元素進(jìn)行平方運算ans = 1 4 9 16 25 36>>>>log(v) %對v求對數(shù)ans = 0.00000 0.69315 1.09861>>>>exp(v) %求以e為底v次方的指數(shù)函數(shù)ans = 2.7183 7.3891 20.0855>>>>abs(v) %求v的絕對值ans = 1 2 3>>>>v + ones(length(v), 1) %給向量v的值都加1,v = [1; 2; 3]ans = 2 3 4>>>>v + 1 %也可以ans = 2 3 4>>>>A' %A的轉(zhuǎn)置ans = 1 3 5 2 4 6>>>>val = max(a)val = 15>>>>[val, ind] = max(a) %ind是max(a)索引val = 15ind = 2>>>>max(A) %默認(rèn)輸出每一列的最大值ans = 5 6>>>>aa = 1.00000 15.00000 2.00000 0.50000>>>>a <>3 %對應(yīng)元素比較,返回真假ans = 1 0 1 1>>>>find(a <>3) %找到符合的值,返回索引,a是向量ans = 1 3 4>>>>[r, c] = find(A >= 7) %A是矩陣,r行c列r = 1 3 2c = 1 2 3>>>>A = magic(3) %幻方,任意行列加起來的值相等(包括對角線),便捷的生成一個3*3的矩陣A = 8 1 6 3 5 7 4 9 2>>>>sum(a) %求和ans = 18.500>>>>prod(a) %求積ans = 15>>>>floor(a) %向下取整ans = 1 15 2 0>>>>ceil(a) %向上取整ans = 1 15 2 1>>>>max(rand(3), rand(3)) %由兩個隨機(jī)矩陣中較大的數(shù)值組成ans = 0.50037 0.85282 0.86935 0.87063 0.82242 0.72379 0.75042 0.38446 0.72941>>>>max(A,[],1) %輸出每一列的最大值,1表示從第一維度取值ans = 8 9 7>>>>max(A, [], 2) %輸出每一行的最大值ans = 8 7 9>>>>max(max(A)) %只是想知道整個矩陣的最大值ans = 9>>>>sum(A,1) %求A每一列的總和,第 1 維度是列;第 2 維度是行 ans = 369 369 369 369 369 369 369 369 369>>>>A .*eye(9) %得到對角線元素的一個方法ans = 47 0 0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 41 0 0 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 0 0 74 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 35>>>>A .*flipud(eye(9)) % flipud 使矩陣垂直翻轉(zhuǎn)ans = 0 0 0 0 0 0 0 0 45 0 0 0 0 0 0 0 44 0 0 0 0 0 0 0 43 0 0 0 0 0 0 0 42 0 0 0 0 0 0 0 41 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 39 0 0 0 0 0 0 0 38 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0>>>>pinv(A) %求偽逆 在運行一個學(xué)習(xí)算法后,最有用的是能夠觀察你的數(shù)據(jù),或說使數(shù)據(jù)可視化。 根據(jù)數(shù)據(jù)繪制圖像(plotting and visualizing Data) >>>xlabel('time') %顯示橫縱坐標(biāo)軸代表什么>>>>ylabel('value')>>>>legend('cos') %標(biāo)記函數(shù),在右上角,表示函數(shù)內(nèi)容>>>>title('my plot') %標(biāo)題>>>>print -dpng 'my-plot.png' %儲存圖像,先cd到儲存路徑>>>>close %關(guān)掉圖像>>>>figure(2); plot(t, y2); %figure為圖像標(biāo)號>>>>subplot(1,2,1); %分成兩個小格子,顯示第一個>>>>plot(t, y1);>>>>subplot(1,2,2)>>>>plot(t, y2)>>>>axis([0.5 1 -1 1]) %改變坐標(biāo)軸刻度>>>>clf; %清除圖像>>>>A = magic(5);>>>>imagesc(A) >>>>imagesc(A), colorbar, colormap gray; %用逗號連續(xù)調(diào)用函數(shù)' title='' data-original-title='復(fù)制'> >>>>plot(t, y2) >>>>hold on; %保留原有圖像,在其上面繪制,而不是直接替換掉>>>>plot(t, y1, 'r') %'r'表示顏色>>>>xlabel('time') %顯示橫縱坐標(biāo)軸代表什么>>>>ylabel('value')>>>>legend('cos') %標(biāo)記函數(shù),在右上角,表示函數(shù)內(nèi)容>>>>title('my plot') %標(biāo)題>>>>print -dpng 'my-plot.png' %儲存圖像,先cd到儲存路徑>>>>close %關(guān)掉圖像>>>>figure(2); plot(t, y2); %figure為圖像標(biāo)號>>>>subplot(1,2,1); %分成兩個小格子,顯示第一個>>>>plot(t, y1);>>>>subplot(1,2,2)>>>>plot(t, y2)>>>>axis([0.5 1 -1 1]) %改變坐標(biāo)軸刻度>>>>clf; %清除圖像>>>>A = magic(5);>>>>imagesc(A) >>>>imagesc(A), colorbar, colormap gray; %用逗號連續(xù)調(diào)用函數(shù) 控制語句與函數(shù) >>>>for i = 1:10 %for循環(huán)> v(i) = 2^i;> end;>>>>vv = 2 4 8 16 32 64 128 256 512 1024>>>>indices = 1:10;>>>>indicesindices = 1 2 3 4 5 6 7 8 9 10>>>>for i = indices %另一種方法,用索引> disp(i);> end;12345678910>>>>while i<>5 %while的使用> v(i) = 100;> i = i + 1;> end;>>>>vv = 100 100 100 100 100>>>>exit/quit %退出Octave 在 .m 文件里定義函數(shù),然后在它所在的路徑下可以調(diào)用。 >>>>addpath(' ') %把 .m 文件所在的路徑添加后,即使跑到別的路徑下也可以找到,方便查找 Octave 特有的定義函數(shù)功能,定義一個函數(shù),可返回多個值,如下圖所示: 在 .m 文件里寫好函數(shù),在 Octave 里有數(shù)據(jù),調(diào)用即可。 線性代數(shù)庫 用向量化的方法取代 Logistic RegressionLogistic回歸算法 (Logistic regression) 一種分類算法,Y 值為離散的 0 和 1(二元)(也可以是多元,即多個離散值)。它的優(yōu)點是讓預(yù)測值在 0 到 1 之間(之前的線性回歸會讓值小于0或大于1)。 Logistic 函數(shù)也稱 Sigmoid 函數(shù),它的假設(shè)函數(shù)如上圖,用參數(shù) 決策邊界(Decision boundary) 關(guān)于 h(x) 怎么做出預(yù)測,通俗的來說可理解為大于決策邊界這條線為正,小于這條直線則為負(fù),從而完成了分類。 要注意的是,決策邊界是假設(shè)函數(shù)的一個屬性,由 如上圖用多項式得到更復(fù)雜的決策邊界。 代價函數(shù) 解決如何求 Logistic 回歸的參數(shù) 用線性回歸的代價函數(shù)得到的是非凸函數(shù),會有多個局部最優(yōu)解。 Logistic 回歸代價函數(shù),預(yù)測y=1的概率。 線性回歸和 Logsitic 回歸 h(x) 的定義不同。同時,特征值歸一化處理也可以用在 Loistic 回歸中。 高級優(yōu)化算法 它的優(yōu)點是可自動選擇學(xué)習(xí)率 代碼實現(xiàn): 下圖的方法用在 logstic 回歸中,通過寫代碼計算代價函數(shù)值和梯度值,需注意 Octave 中下標(biāo)從 1 開始。 邏輯回歸:一對多分類 關(guān)于如何用邏輯回歸解決多類別分類問題。 將其分成三個獨立的二元分類問題。三個偽分類器,每一個計算的是 y=i 時的概率。 輸入 x,選擇 h 最大的類別,可信度最高效果最好,得到一個最高的概率值,為我們所要預(yù)測的 y 值。 后記:本篇總結(jié)可能沒有覆蓋全部知識點,僅根據(jù)我在學(xué)習(xí)過程中的理解所記錄。如有疏漏還望指正。文中圖片均來自 Andrew Ng 公開課的 PowerPoint。 |
|