1. 程式人生 > >Coursera 斯坦福吳恩達機器學習課程筆記 (1)

Coursera 斯坦福吳恩達機器學習課程筆記 (1)

看了課程一週後發現忘光了,決定做一個筆記用作複習。如果涉及到侵權問題請聯絡我,我會立馬刪除並道歉。

同時,禁止任何形式的轉載,包括全文轉載和部分轉載。如需使用請聯絡本人 [email protected]。如若發現侵權行為,我學過智慧財產權法的,嘿嘿

第一週:基礎概念和介紹

對機器學習的理解

機器學習現在也沒有統一的定義。最淺顯易懂的就是賦予計算機不需要得到清晰完整程式碼就能夠通過“自我學習”來完成任務的能力(Arthur Samuel 1959)。這樣說依然很抽象,還有一個淺顯的例子就是對於一個computer program, 對於給定任務T,這個程式可以通過某些experience E, 使用恰當的measurements P來學習T,並最終達到提高P的效果。

舉個例子:

(1)下棋,觀看使用者下棋就是E,贏得遊戲就是T,贏得遊戲的時間(或其他衡量)就是P。機器要通過E來完成T任務,並且不斷提高P。

(2)spam. 觀看使用者給郵件貼label(尤其是垃圾郵件)是E,分類垃圾郵件是E,成功分類是P

機器學習演算法:

supervised learning

對於output我們有清楚的認知,我們想要什麼樣的結果(對於input我們有足夠的label來標記我們的資料)。比如預測澳大利亞十年後兔子的數量,我們很清楚這會是一個具體的數值。

常見的有迴歸問題、分類問題(注意分類問題可以有不止0,1兩類,例子包括腫瘤預測等)

unsupervised learning

對於input我們是沒有label的,我們並不知道這些資料可以被分為多少類。例如給100篇文章分類,我們並不知道他們可以分成多少類,唯一可以做到的是將關鍵詞等類似的文章分為一類。還有的例子包括基因測序等。

cocktail party problem

party中有兩個話筒,一個用於講話,一個用於收音(BGM)。如何使用電腦將人聲和BGM分離呢?就可用到無監督學習。

others: reinforcement learning, recommender systems

線性迴歸

我們將資料分為兩類:訓練集和驗證集

訓練集用於訓練模型,使用特定的criteria (e.g. cv等)來選定模型。驗證集用於驗證訓練的模型的有效度。

cost function

cost function 是fitted-observed之間差值的距離,優化模型就是通過最小化cost function完成的

m 為訓練集資料個數,平方和是為了消除差之間的互相抵消。

下式寫作J(θ0,θ1),叫做squared error function, 這是最常見的迴歸問題的cost function。 

例子:對於簡單一元線性迴歸 y = θ0+θ1x, J(0)就是y = 0


對於簡單一元線性迴歸,左邊是模型hθ(x), 右邊是cost function J(θ0,θ1)。 我們可以清楚看見J的全域性最小值(即h的全域性最優解)是出現在這個鐘形函式的底部的。通過確定此時的θ0和θ1,我們就能確定最優的hθ(x)。


注意:因為簡單一元線性迴歸的特性,J的全域性最小值就等於其區域性最小值,這是特殊的。通常我們只能求得J的區域性最小值。如下圖,很明顯右邊的點是全域性全域性最小值,但是我們是從左邊的點的上方開始建模的,一般只能求得左邊的區域性最優解。這個問題在神經網路裡尤為突出,因為神經網路的start point是隨機的,所以很可能無法達到全域性最優解。

Gradient descent (不止用於線性迴歸)

gradient descent是尋求最優解的一個常用方法。這裡有一個大前提:在gradient descent找到一個最優解之後,它就會停下,不會馬不停蹄給你找下一個更好的解。誰一天那麼閒沒事天天給你找解啊,程式也是有脾氣的,哼得意。這個演算法相當於一個下坡的過程,如果我一開始站在左邊的山頭上,向著紅色線的方向下坡(一般此過程為求導後從原位置減去求導量和learning rate的乘積(公式見下下圖),這裡的learning rate就可以理解為我一步跨多大),最終達到左邊的全域性最優解(我假設他是最優解);如果我一開始站在右側的山頭,順著紅線下坡,很有可能就會到達右側的區域性最優解;同樣的,如果從左邊的山頭順著藍線下坡,也是有可能會到達右邊的區域性最優解的,全看我走的方向如何。當然,顯而易見這樣需要的成本更大。同理,如果我一開始站在右邊山頭想走到左邊的全域性最優解,成本依然很大。

這幾個宛如狗爬的字是: repeat until convergence

α即上段提到的learning rate,α的值一定要取的適當。如果α太小,我下山的步子太小,就會浪費很多資源來獲取區域性最優解。如果α太大,我下山步子太大(嗯。。。一腳跨過一座山哈哈哈哈),我可能會略過區域性最優解,如果還有區域性最優解那還好,可是對於二次的cost function,我可能就會錯過唯一的最優解然後獲得越來越大的誤差。

注意這裡的:=和=符號的區別,:=是assignment, a:= a+1就是讓a+1; = 是既成事實,a=a+1就是不對的,永遠不可能發生。(這裡應該就類似於程式語言的==和=)

注意:這裡θ0和θ1應該是simultaneously update的,即,要找優化解我們應該同時計算兩者的值,而不是計算其中一個,將這個引數的最優解套入下一個引數的計算得到下一個引數的最優解

【上圖是現抄課件,本人無版權,感謝coursera, 斯坦福和吳恩達爸爸,侵刪】

Batch

“Each step of gradient descent uses all the training examples” ——摘自coursera machine learning Andrew Ng課件,侵刪

第二週 多元線性迴歸

如果要把model寫成hθ(x)=θ^TX的話,x0=1

Feature Scaling

目的是為了(1)讓covariate之間的權重更加平衡,例如一組資料,工資的範圍是2000-10000,年齡的範圍只是20-30,在建模時很容易工資的權重就大大影響了模型,而實際上年齡才是主要的covariate。此外,當我們使用二次甚至更高次模型的時候,feature scaling就變得更重要了(2)讓gradient descent更快找到收斂的位置。如下圖,對於範圍差距很大的資料,形成的cost function很可能是A這種奇形怪狀的,不利於尋找區域性最優解。如果我們將資料處理到等量級或相似量級,cost function就越接近B——一個圓形,就方便找很多了。


那麼什麼是好的feature scaling呢? 這個範圍也不是越小、越精確越好,我們依然需要給feature一定的空間:[-1,1]就是一個合理的範圍,[-0.001,0.001]就有點太過了,同理[-100,100]也有點不合適。當然,這個範圍不需要對稱。

Mean Normalisation

用x-mean替代x,對x0=1無效。


P.S. 吳恩達爸爸好帥啊,聲音好溫柔~~~~花痴一下

確保gradient descent正確執行

(1)可以畫一個J(θ)最小值X迭代次數的圖,J(θ)應該是單調遞減並在某處收斂的。我們可以通過判斷函式來判斷α是大了呢,還是小了呢,是餓了呢,還是渴了呢。通常阿爾法取值在[0.001,1]之間,儘可能多試試,通過圖形來分析哪個α更合適

(2)automatic convergence test: 當J(θ)減少的量小於一個threshold 藝圃C龍(音譯,那個希臘字母,懶得打了)時,停止迭代。但是通常找一個合適的threshold是很難滴,所以恩達更願意看圖

例子:

對於下圖左邊兩種情況,很可能是α太大了,一次跨的幅度太大


Normal Equation (思想應該是同statistical learning的GLS)


Octave: pinv() = inverse     X' == x transfer

對於normal equation, feature scaling是不必要的

但是如果X^TX是不可逆的呢(singular/degenerate)?

(1) 造成不可逆的原因(這同時也是我們檢查原因的順序):

    a. features高度相關,比如x和x^2

    b. features過多,比如features的數量已經多於資料的量了(這種情況我在學習中還沒遇到過,應該是很少見的),

        i. 這裡可以刪掉一些features,

        ii. 或者use regularization(之後會講到)

Gradient Descent vs. Normal Equation

Gradient DescentNormal Equation           
需要選擇α不需要選擇α
需要多次迭代

計算一次到位   

當n很大的時候 also works well [當features太多

(>=10000),吳恩達的選擇]

需要計算(X^TX)^-1                                                                   
當n很大,收斂很慢
適用範圍更廣對linear regression效果很好

——n為features的數量,不是資料的數量(m)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------程式碼部分------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Octave command line

a = 3; %semicolon supressing output 不顯示輸出結果

~= 為不等號

xor(1,0)或門

c = (3>=1);

c =1 (True)

pi = π

a = pi  結果: a = 3.1416

a = pi; 結果:無輸出

Octave 的print 很像C語言:

disp(sprintf('2 decimals: %0.2f', a)) 結果:2 decimals: 3.14

format long/short 顯示不同位數

A[1 2; 3 4; 5 6] 注意用空格而不是逗號

v = 1:0.1:2 生成一個從1-2的差值為0.1的 11*1矩陣(第一二列都是1)

ones(2,3) 生成一個2*3的全為1的矩陣

zeros() 同理

rand(1,3)隨機數(不過我覺得應該不是完全隨機的,還是有seed的)

randn(2,3) 生成正態分佈矩陣

sqrt(10)*randn(1,1000)就相當於R的rnorm(1000,sqrt(10))了

eye(4) 生成一個4*4的元矩陣

help eye 出解釋

size(Matrix) 返回結果是一個[行 列]的 1*2矩陣

length(Matrix/Vector) 返回行數

pwd顯示當前路徑

常見命令與linux同

load featuresX,dat = load('featuresX.dat')

who 顯示當前環境下的變數

whos 給出detail

clear featuresX 清除

save hello.mat v; 將變數v存放入環境hello.mat

save hello.txt v -ascii 將該檔案以ASCII形式儲存

A(2,3)第二行第三列

A(2,:)第二行

A(:,2)第二列

:與R的space同

A .*B     是A矩陣和B矩陣的每個element各自相乘(前提是AB矩陣維度相同)

A .^2     是A矩陣每個element各自平方(看來.?是用於矩陣element的專門的操作)

A' 轉置

pinv(A) 逆矩陣

[val, ind] = max(a) 找出向量a中的最大值並給出其index

max(A) 會給出每一列中的最大值 = max(A,[],1) 每列最大值

max(A,[],2) 每行最大值

這裡類似R用1表示列,2表示行

a = [1 15 2 0.5]

a <3

ans = 1 0 1 1

find(a <3)

ans = 1 3 4

A .* eye(9) 出去從左到右對角線保留,其餘值全部為0

plot(x,y, 'r')——r 為紅色

xlabel('') ylabel('') legend('','') title('')

這裡能分別新增我覺得Octave是將這些變數全部儲存然後保持執行

print -dpng 'myplot.png'儲存

figure(1): plot(t,y1); 賦值,開啟新視窗

clf; 清除所有figure

subplot(1,2,1); 把plot分割成1:2 grid, 獲取第一個element

subplot(1,2,2);

——這兩步合起來相當於 par(mfrow=c(1,2))

for i = 1:10,

    v(i) = 2^i;

end;

while i <=5,

    v(i) =100;

    i = i+1;

end;

while true,

    v(i) =999;

    i = i+1;

    if(i>10|| i ==10),

        beark;

    end;

end; 注意兩個end

addpath('') 新增路徑,這樣不在此路徑下也可以使用function

Vectorization (能使程式碼執行快得多)

將連乘、連加等形式轉化為矩陣的思維

比如


正常我會用for迴圈把它挨個加起來,這裡其實用矩陣能更方便解決這個問題

cost function也可以這樣處理

相關推薦

Coursera 斯坦福機器學習課程筆記 (1)

看了課程一週後發現忘光了,決定做一個筆記用作複習。如果涉及到侵權問題請聯絡我,我會立馬刪除並道歉。同時,禁止任何形式的轉載,包括全文轉載和部分轉載。如需使用請聯絡本人 [email protected]。如若發現侵權行為,我學過智慧財產權法的,嘿嘿第一週:基礎概念和

機器學習課程筆記02——處理房價預測問題(梯度下降演算法詳解)

  建議記住的實用符號 符號 含義 m 樣本數目 x 輸入變數 y 輸出變數/目標變數

機器學習課程筆記章節二單變數線性迴歸

1、模型描述 Univariate(One variable)Linear Regression m=訓練樣本的數目,x's=輸入的變數/特徵,y's=輸出變數/目標變數 2、代價函式 基本定義: 3、代價函式(一) 回顧一下,前面一些定義: 簡化的假設函式,theta0=0,得到假

機器學習課程筆記——第二週

1. 多變數線性迴歸(Linear Regression with Multiple Variables) 也稱為多元線性迴歸,一元就是一個變數,多元就是多個變數,在這裡也可以叫做多個特徵 1.1 多維特徵(Multiple Features) 之前,

機器學習 課程筆記第五週

Costfunction代價函式:在前面的課程總我們瞭解了邏輯迴歸的代價函式:在神經網路中,我們增加了對k個輸出的誤差進行了求和。得到代價函式如下:K為輸出的個數,在正則項中L表示神經網路的層數Backpropagation algorithm反向傳播演算法:當我們進行梯度下

機器學習課程筆記——第一週

1. 單變數線性迴歸(Linear Regression with One Variable) 1.1 模型表示 像上述公式,因為只含有一個特徵/輸入變數,因此這樣的問題叫作單變數線性迴歸問題。 例子如下: 單變數線性方程,就是我們初中就學的

Coursera機器學習課程 總結筆記及作業程式碼——第5周神經網路續

Neural Networks:Learning 上週的課程學習了神經網路正向傳播演算法,這周的課程主要在於神經網路的反向更新過程。 1.1 Cost function 我們先回憶一下邏輯迴歸的價值函式 J(θ)=1m[∑mi=1y(i)log(hθ

Coursera機器學習課程 總結筆記及作業程式碼——第1,2周

Linear’regression 發現這個教程是最入門的一個教程了,老師講的很好,也很通俗,每堂課後面還有程式設計作業,全程用matlab程式設計,只需要填寫核心程式碼,很適合自學。 1.1 Model representation 起始給出了

Coursera機器學習課程 總結筆記及作業程式碼——第6周有關機器學習的小建議

1.1 Deciding what to try next 當你除錯你的學習演算法時,當面對測試集你的演算法效果不佳時,你會怎麼做呢? 獲得更多的訓練樣本? 嘗試更少的特徵? 嘗試獲取附加的特徵? 嘗試增加多項式的特徵? 嘗試增加λ? 嘗試減小λ?

Coursera機器學習課程第一週測驗2(單變數線性迴歸)

Machine Learning Week 1 Quiz 2 (Linear Regression with One Variable) Stanford Coursera Question 1 Consider the problem of predi

Coursera機器學習課程-第五章

五、Octave教程(Octave Tutorial) 5.1 基本操作 參考視訊: 5 - 1 - Basic Operations (14 min).mkv 在這段視訊中,我將教你一種程式語言:Octave語言。你能夠用它來非常迅速地實現這門課中我們已經學過的,或者

Coursera-AndrewNg()機器學習筆記——第三周

訓練 ros 方便 font 就是 梯度下降 全局最優 用法 郵件 一.邏輯回歸問題(分類問題) 生活中存在著許多分類問題,如判斷郵件是否為垃圾郵件;判斷腫瘤是惡性還是良性等。機器學習中邏輯回歸便是解決分類問題的一種方法。二分類:通常表示為y?{0,1},0:“Negat

Coursera機器學習教程筆記(一)

    人工智慧行業如火如荼,想要入門人工智慧,吳恩達老師的機器學習課程絕對是不二之選(當然,這不是我說的,是廣大網友共同認為的)    教程的地址連結:    有的同學可能進不去這個網站,解決辦法參照如下連結:    這個辦法本人親測有效,因為我看的時候也打不開(囧!!) 

機器學習課程第一週

關於線性迴歸的記錄: 使用的損失函式是平方誤差損失函式J(θ),也就是最簡單的假設函式和真實值差的平方和(對於所有樣本求和),然後最小化J(θ),也就是使用梯度下降演算法;平方誤差代價函式是解決迴歸問題最常見的手段; 對於單變數線性迴歸問題: 如果是對

機器學習課程:完全用Python完成,可以的!(附程式碼)

  新智元報道 來源:Reddit、GitHub編輯:肖琴【導讀】完全用Python完成吳恩達的

機器學習筆記--機器學習課程2

梯度下降法 對於梯度下降法而言,當偏導數 的學習效率過大或過小時,收斂的速率會變得很緩慢,α過大時甚至會無法收斂。學習效率α是一個正數。 同樣梯度下降法初始點在區域性最低點時同樣不會再更新,此時偏導數的值為0.

學習筆記——-機器學習課程-1.3 用神經網路進行監督學習

         神經網路有時媒體炒作的很厲害,考慮到它們的使用效果,有些說法還是靠譜的,事實上到目前為止,幾乎所有的神經網路創造的經濟價值都基於其中一種機器學習,我們稱之為“監督學習”,那是什麼意思呢?         我們來看一些例子, 在監督學習中輸入x,習得一個函式

機器學習課程(一)之梯度下降原理

梯度下降法 對於線性迴歸分析,我們將假設函式定義為h(x)=θ0+θ1x1+⋯+θnxn 令x0=1,記x=(x0x1⋯xn),θ=⎛⎝⎜⎜⎜⎜θ0θ1⋮θn⎞⎠⎟⎟⎟⎟ 因為假設函式與引數θ有關,記hθ(x)=h(x)=xθ 對於每一

機器學習課程作業tips(更新中)

ex4, 一開始做的時候,卡在了代價函式這裡,建議大家用for迴圈來練習這道題目,真正理解神經網路演算法和one-vs-all演算法的不同。 這個式子的重點在於計算 one-vs-all,十個分類器,分別做十次logistic迴歸。每一個的結果都要和y求誤差。也就是

學習筆記——-機器學習課程 1.2 什麼是神經網路

1.2 什麼是神經網路         “深度學習”指的是訓練神經網路,有的時候 規模很大,那麼神經網路是什麼呢?我們從一個房價預測的例子開始,假設有一個六間房屋的資料集已知房屋的面積,單位是平房英尺或者平方米,已知房屋價格,想要找到一個函式,根據房屋面積,預測房價的函式,