Andrew Ng-機器學習基礎筆記-Python實現代碼

目錄

1.引言:

1.1Welcome:

1.2機器學習是什麼?

1.3監督學習

1.4無監督學習:

總結:

2.線性迴歸

單變量的線性迴歸

2.1模型表示

2.2代價函數

2.3代價函數的直觀理解:

2.4 代價函數的直觀理解

2.5 梯度下降(Gradient descent)

2.6 梯度下降的直觀理解

2.7梯度下降的線性迴歸

3、線性代數回顧

3.1 矩陣和向量

3.2 加法和標量陳發

3.3 矩陣向量乘法

3.4 矩陣乘法

3.5 矩陣乘法的性質

3.6 矩陣的逆、轉置

4、多變量線性迴歸

4.1 多維特徵

4.3 梯度下降法時間 1-特徵放縮

實現代碼:

4.4梯度下降法實踐 2-學習率

4.5 特徵多項式迴歸

4.6 正規方程

正規方程的實現代碼:

擬合效果查看代碼:

效果如圖:

4.7 正規方程及不可逆性(選修-暫時不修)

小結與課後作業:

5 熟悉Python工具:

6 邏輯迴歸

6.1 分類算法

6.2 假說表示

邏輯模型:​

實現代碼:

6.3 判定邊界

6.4 代價函數

實現代碼:

6.5 簡化的成本函數和梯度下降

6.6 高級優化

6.7 多類別分類:一對多

小結 &  課後練習:

7 正則化(Regularization)

7.1 過擬合的問題

7.2 代價函數:

7.3 正則化線性迴歸

7.4 正則化的邏輯迴歸模型

代價函數實現代碼:

小結 & 練習:

8 神經網絡:表述((Neural Networks: Representation)

8.2 神經元和大腦

8.3 模型表示

Notes:

8.4 模型表示

與邏輯迴歸的知識結合:

8.5 特徵和直觀理解

單程神經元的and、or

8.6 樣本和直觀理解 II

8.7 多類分類

後續:


1.引言:

1.1Welcome:

學習機器學習的主要問題和算法,瞭解不同算法的不同應用場景

1.2機器學習是什麼?

Tom定義好的學習問題,一個程序被認爲能從經驗E中學習,解決任務T,達到性能度量值P,當且僅當,有了經驗E後,經過P拼判,程序在處理T時的性能有所提醒。

學習算法分爲:監督學習、無監督學習

1.3監督學習

監督學習指的是:我們給學習算法一個數據集。這個數據集由“正確答案”組成。

兩個特別的例子,後面會進行細講,先大致瞭解一下:
 

迴歸問題-房價預測

在房價的例子中,我們給了一系列房子的數據,我們給定數據集每個樣本的正確價格,既它們實際的售價然後運用學習算法,算出新房子的價格,這叫迴歸問題,我們試着推測出連續的結果

分類問題-良性惡性腫瘤分類

簡單的來收,比如0或1代表良性或惡性腫瘤,通過分類算法估算出腫瘤良性或惡性的概率。

現實中,具有多種特徵值,如果需要處理無限多個特徵,解決存儲問題,可以採用支持向量機(後面會補充),裏面有一個巧妙的數學技巧,能,能讓計算機處理無線多個特徵

1.4無監督學習:

不同於監督學習,無監督學習沒有任何的標籤或者只有相同的標籤。如圖:

無監督學習算法可能會把這些數據分成兩個不同的族。所以叫做聚類算法。

典型例子:雞尾酒算法

總結:

垃圾郵件問題---監督學習問題

新聞事件分類問題---無監督學習

細分市場---無監督學習

糖尿病---監督學習

2.線性迴歸

單變量的線性迴歸

2.1模型表示

在監督學習中,我們有一個數據集,這個數據集被稱訓練集

監督學習例子(後面的課後練習也是以房價這個爲例子的)

 

迴歸問題的標記

這就是監督學習算法的工作方式

h如何表達,可以如下表達(一元線性函數)

因爲只有 一個特徵/輸入變量,因此這樣的問題叫做單變量線性迴歸問題

 

2.2代價函數

建模誤差:

目標是選擇可以使得建模誤差的平分和能夠最小的模型參數

代價函數

 

注意:這裏的1/2是爲了後面求導的方便,放大和縮小並不影響結果

 

2.3代價函數的直觀理解:

Notes:下圖採用了簡化版,當第一個參數爲0的時候(過原點的直線)

2.4 代價函數的直觀理解

當我們考慮到兩個參數變量的時候 ,顯然圖像就不容易畫了,這時候我們採用等高線圖來畫,可是等高線圖也麻煩,找最最小也麻煩,如圖:

於是後面,我將介紹能夠自動找出使得代價函數J最小化的參數的值(迭代或者直接計算)

2.5 梯度下降(Gradient descent)

梯度下降是一個用來求函數最小值的算法,我們將使用梯度將下降算法來求出代價函數的最小值

批量梯度下降:

Notes:

每一次都同時讓所有的參數減去學習率乘以代價函數的導數

a是學習率,決定了我們沿着能讓代價函數下降程度最大的方向向下賣出的步子有多大

同時更新(Simultaneous update)是梯度下降的常用方法

Python實現代碼:

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost

2.6 梯度下降的直觀理解

 

求導的目的是爲了取這個紅點的切線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,現在有一個正斜率,我們得到新的參數1減去一個正數乘學習率

回顧一下,在梯度下降法中,當我們接近局部最低點時,梯度下降法會自動採取更小的幅度,這是因爲當我們接近局部最低點時,很顯然在局部最低時導數等於零,所以當我們接 近局部最低時,導數值會自動變得越來越小,所以梯度下降將自動採取較小的幅度,這就是 梯度下降的做法。所以實際上沒有必要再另外減小 a

2.7梯度下降的線性迴歸

梯度下降算法和線性迴歸算法比較圖

批量梯度算法指的是:在梯度下降的每一步中,我們都用到了所有的訓練樣本,在梯度下降中,在計算微分求導項時,我們需要進行求和運算,所以每一個單獨的梯度下降中,我們最終都要計算這樣一個東西,這個想需要對所有m個訓練樣本求和

3、線性代數回顧

3.1 矩陣和向量

3.2 加法和標量陳發

3.3 矩陣向量乘法

3.4 矩陣乘法

3.5 矩陣乘法的性質

3.6 矩陣的逆、轉置

非常基本就不一一回顧了,都是數學二線性代數的內容

4、多變量線性迴歸

4.1 多維特徵

支持多變量的假設:

引入x0=1(這在後面的例子都是這樣定義的),此時模型中的參數是一個n+1緯的向量,任何一個訓練實例也都是n+1緯的向量,矩陣X的緯度是m*(n+1).

因此公示可以簡化爲:其中上標T代表矩陣轉置

4.2 多變量梯度下降

代價函數是所有建模誤差的平方和:

計算此代價函數的python代碼

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))
# 初始化一些附加變量 - 學習速率α和要執行的迭代次數。
alpha = 0.01
iters = 1000

4.3 梯度下降法時間 1-特徵放縮

效果如圖

公式如下

比如課後作業多變量部分加了一個臥室的變量:

實現代碼:

data2 = (data2 - data2.mean()) / data2.std()
data2.head()
數據特徵歸一化之前

        

數據特徵歸一化之後

 

4.4梯度下降法實踐 2-學習率

通常可以考慮嘗試些學習率: α=0.01,0.03,0.1,0.3,1,3,10

4.5 特徵多項式迴歸

線性迴歸並不適用於所有數據,此時我們需要曲線來適應我的數據

比如二次方或者三次方,但是需要注意的是,如果使用二次方,由於二次方會下降所以並不利於我們測試,所以用三次方會好點

根據圖形的性質,因此還可以使:

我們可以注意到。當我們採用此種方法的時候,在運行梯度下降算法前,特徵縮放是非常有必要的

4.6 正規方程

正規方程是通過求解下面的方程來找出使得代價函數最小的參數的:代價函數的偏導數爲0。 假設我們的訓練集特徵矩陣爲 X(包含了x0=1)並且我們的訓練集結果爲向量 y,則利用正規方程解出向量 θ(如下圖公式) 。 上標T代表矩陣轉置,上標-1 代表矩陣的逆。

梯度下降與正規方程的比較:

總的來說,只要特徵變量的數目並不大,正規方程是一個很好的計算參數的替代方法。具體地說,只要特徵變量數量小於1w,通常使用正規方程法,而不是用梯度下降法

正規方程的實現代碼:

def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等價於X.T.dot(X)
    return theta

擬合效果查看代碼:

#現在我們來繪製線性模型以及數據,直觀地看出它的擬合。
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

效果如圖:

圖片數據均來自課後作業,左圖是梯度下降算法的,右圖是正規方程的擬合過程

4.7 正規方程及不可逆性(選修-暫時不修)

小結與課後作業:

迴歸方程的知識過了兩遍,接下來完成課後練習(光說不練,耍流氓)

完成練習後的筆記

https://blog.csdn.net/qq_37457202/article/details/106853058

5 熟悉Python工具:

Python 基礎學習特別推薦 黃廣海老師的資料,

https://github.com/fengdu78/Data-Science-Notes

然後自己在黃博士的基礎上整理了自己的學習筆記

AI 基礎:Python 簡易入門(附上鍊接)

AI 基礎:Numpy 簡易入門(附上鍊接)

AI 基礎:Pandas 簡易入門(2天)(已完成)

AI基礎:數據可視化簡易入門(matplotlib和seaborn)(已完成)

額外:數據獲取---學習了一下爬蟲。可以查看

https://blog.csdn.net/qq_37457202/article/details/106537627

6 邏輯迴歸

6.1 分類算法

你要預測的變量 y 是離散的值,我們將學習一種叫做邏輯迴歸 (Logistic Regression) 的算法,這是目前最流行使用最廣泛的一種學習算法

我們將因變量(dependant variable)可能屬於的兩個類分別稱爲負向類(negative class)和 正向類(positive class),則因變量 y={10,},其中 0 表示負向類,1 表示正向類。

邏輯迴歸算法實際上是一種分類算法,它適用於標籤y取值離散的情況

6.2 假說表示

線性迴歸的方法求出適合數據的一條直線

可是,當我們預測到一個非常大的惡性腫瘤的時候,將他加入我們的訓練集中,將得到新的直線

因爲預測的數值超過了[0,1]且我們顯然可以看見預測的數據不夠準確,因此我們需要引入新的模型

邏輯模型:

函數的圖像:

實現代碼:

import numpy as np
def sigmoid(z):
 return 1 / (1 + np.exp(-z))

h(x)的作用:對於給定的輸入變量,根據選擇的參數計算輸出變量=1的可能性

6.3 判定邊界

現在我們假設一個模型:

我們將參數設置爲(後面會介紹如何擬合,先略過)[-3,1,1]

當z>=0的時候,g(z)>=0.5,也就是,h(x)>=0.5 預測y=1,因此x1+x2>=3是模型的分界線:

針對一些複雜的情況,如:

方法與線性多項式一樣,我們需要用到二次方特徵:

6.4 代價函數

對於線性模型,我們代價函數是所有模型的誤差的平方和。可是如果直接套用會得到一份非凸函數,這超出了這麼課程的學習,因此我們需要做凸優化問題。

我們的代價函數:

 

 

h(x)與Cost(h(x),y)之間的關係如圖:

當實際的 y=1 且 h (x) 也爲 1 時誤差爲 0,當 y=1 但 h (x) 不爲 1 時誤差隨着 h(x)的變小而變大

實現代碼:

Import numpy as np
def cost(theta, X, y):
#邏輯迴歸(Logistic Regression)
 theta = np.matrix(theta)
 X = np.matrix(X)
 y = np.matrix(y)
 first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
 second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
 return np.sum(first - second) / (len(X))

在得到這樣一個代價函數以後,我們便可以用梯度下降算法來求得能是代價函數最小的參數


 

推導過程:(略)

雖然得到的梯度下降算法表面上看上去與線性迴歸的梯度下降算法一樣,但是這裏  h (x)= g( 向量的轉置換*X)  與線性迴歸中不同,所以實際上是不一樣的

6.5 簡化的成本函數和梯度下降

邏輯迴歸代價函數:

 

注意與線性迴歸相區別,雖然梯度下降看上去一樣,但是假設函數是不一樣的:

如果特徵量範圍很大,那麼應用特徵縮放的方法,同樣也可以讓邏輯迴歸中,梯度下降收斂更快

6.6 高級優化

一些高級優化算法和一些高級的優化概念,利用這些方法,我們就 能夠使通過梯度下降,進行邏輯迴歸的速度大大提高,而這也將使算法更加適合解決大型的 機器學習問題,比如,我們有數目龐大的特徵量。會用就可以了,這部分如果後面有實驗,在看看Python的代碼是如何實現的。

這些算法有 共軛梯度法BFGS(變尺度法)和L-BFGS(限制變尺度法)

這種算法有需要許多有點:
1、無需手動選擇學習率,有一個智能內部循環,線性搜索的算法去自動嘗試不同的學習率

2、他們最終的收斂熟讀遠遠快於梯度下降

缺點:
實現起來過於複雜

目標:

會使用這些高級的優化算法,找到相應的可以,能將邏輯迴歸和線性迴歸應用於最大的問題中,這就是高級優化的概念

6.7 多類別分類:一對多

我們之前處理的二元類問題:

如今的多類分類問題:

我們可以通過擬合一個合適的分類器來完成

這裏的三角形是正樣本,而圓形代表負樣本。可以這樣想,設置三角形的值爲 1,圓形 的值爲 0,下面我們來訓練一個標準的邏輯迴歸分類器,這樣我們就得到一個正邊界

現在要做的就是訓練這個邏輯迴歸分類器其中 i 對應每一個可能的 y=i,最後,爲了做出預測,我們給出輸入一個新的 x 值,用這 個做預測,選擇出哪一個分類器是可信度最高效果最好的(max ), 那麼就可認爲得到一個正確的分類

小結 &  課後練習:

 邏輯迴歸練習題:
https://blog.csdn.net/qq_37457202/article/details/106860442

7 正則化(Regularization)

7.1 過擬合的問題

前面講到的學習算法,但出現過擬合問題的時候,會導致他們的效果變得很差

比如迴歸問題:
 

左圖 欠擬合  中間圖 理想    右圖 過擬合

過擬合,雖然非常好地適應我們的訓練集單在新輸入變量進行預測時效果不好。

分類問題:

同理,x的次數越高,擬合的越好,但相應的預測能力變差

正則化(regularization)技術,可以該上或者減少過擬合的問題

處理過擬合的方法有:

1. 丟棄一些不能幫助我們正確預測的特徵。可以是手工選擇保留哪些特徵,或者使用 一些模型選擇的算法來幫忙(例如 PCA) 2. 正則化。 保留所有的特徵,但是減少參數的大小(magnitude)。

7.2 代價函數:

在迴歸問題,如果我們的模型是:
h(x) =\Theta _{0}+ \Theta _{1}{x_{1}}^{}+ \Theta _{2}{x_{2}}^{2}+ \Theta _{3}{x_{3}}^{3}+ \Theta _{4}{x_{4}}^{4}

高次項導致過擬合的產生,我們可以添加懲罰(將尾部參數),修改後的代價函數:

擴展到,實際情況上 有非常多的特徵,我們不知道其中哪些需要這樣做,我們對所有的特徵進行懲罰,並且讓代價函數最優化的軟件來選擇這些懲罰的程度:

其中 \lambda 又稱爲正則化參數(Regularization Parameter)。 注:根據慣例,我們不對  0 進 行懲罰。經過正則化處理的模型與原模型的可能對比如下圖所示:

那爲什麼這一項,可以參數減少:

因爲如果我們令λ的值很大的話,爲了使 Cost Function 儘可能的小,所有的 \Theta (不包括 \Theta 0 )都會在一定程度上減小。

但若λ的值太大了,那麼 \Theta (不包括 \Theta 0 )都會趨近於 0,這樣我們所得到的只能是一條 平行於 x 軸的直線

所以對於正則化,我們要取一個合理的λ的值,這樣才能更好的應用正則化。

回顧一下代價函數,爲了使用正則化,讓我們把這些概念應用到到線性迴歸和邏輯迴歸 中去,那麼我們就可以讓他們避免過度擬合了。

7.3 正則化線性迴歸

正則化線性迴歸的代價函數:

如果採用的是梯度算法,令這個代價函數最小:

每次都在原有算法更新規則的 基礎上令 \Theta 值減少了一個額外的值。 我們同樣也可以利用正規方程來求解正則化線性迴歸模型,方法如下所示:

7.4 正則化的邏輯迴歸模型

在高級優化算法中,需要自己設計代價函數:


增加一個正則化的表達式:

代價函數實現代碼:

Import numpy as np
def costReg(theta, X, y, learningRate):
 theta = np.matrix(theta)
 X = np.matrix(X)
 y = np.matrix(y)
 first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
 second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
 reg = (learningRate / 2 * len(X)) *
np.sum(np.power(theta[:,1:theta.shape[1]], 2))
 return np.sum(first - second) / (len(X)) + reg

要最小化該代價函數,通過求導,得出梯度下降蘇阿帆:

注意:

1.雖然正則化的邏輯迴歸中的梯度下降和正則化的線性迴歸中的表達式看起來一樣,但 由於兩者的 h_{\Theta }(x)不同所以還是有很大差別。

2. \Theta _{0} 不參與其中的任何一個正則化。

小結 & 練習:

結合邏輯迴歸使用正則化,代碼實現見:

https://blog.csdn.net/qq_37457202/article/details/106860442

 

8 神經網絡:表述((Neural Networks: Representation)

8.1 非線性假設

針對生活中圖像處理的特徵過多的情況,普通的邏輯迴歸模型,不能有效地處理這麼多的特徵,這時候我 們需要神經網絡。

8.2 神經元和大腦

通俗的來收,就是模擬大腦的神經元,國外這項技術比價成熟。

8.3 模型表示

一個處理單元/神經核(processing unit/ Nucleus),它含有許多輸入/樹突 (input/Dendrite),並且有一個輸出/軸突(output/Axon)。

在神經網絡中,參數又可 被成爲權重(weight)

我們設計出了類似於神經元的神經網絡,效果如下

 

下圖爲一個 3 層的神經網絡,第一層成爲輸入層(Input Layer),最後一 層稱爲輸出層(Output Layer),中間一層成爲隱藏層(Hidden Layers)。我們爲每一層都增 加一個偏差單位(bias unit)

 

 

對於上圖所示的模型,激活單元和輸出分別表達爲:

Notes:

注意上、下標、注意上、下標、注意上、下標

(我們把這樣從左到右的算法稱爲前向傳播算法( FORWARD PROPAGATION ))

8.4 模型表示

這部分理解得有點卡殼,符號的問題,就直接上圖了

圖片文字整理來源於-黃海廣博士的筆記

與邏輯迴歸的知識結合:

這些更高級的特徵值遠比僅僅將 x 次方厲害,也能更好的預測新數據

這就是神經網絡相比於邏輯迴歸和線性迴歸的優勢。

8.5 特徵和直觀理解

單程神經元的and、or

and:

g(x)的圖像入圖則有:

or:

 

OR 與 AND 整體一樣,區別只在於的取值不同。

8.6 樣本和直觀理解 II

按這種方法我們可以逐漸構造出越來越複雜的函數,也能得到更加厲害的特徵值。 這就是神經網絡的厲害之處。

8.7 多類分類

畫餅!!! 目標分析一波。。。

當我們有不止兩種分類時(也就是 y=1,2,3….),比如以下這種情況,該怎麼辦?如果 我們要訓練一個神經網絡算法來識別路人、汽車、摩托車和卡車,在輸出層我們應該有 4 個 值。例如,第一個值爲 1 或 0 用於預測是否是行人,第二個值用於判斷是否爲汽車。

後續:

接下來進入第九章實踐。

下一部分,將會開啓新的一篇博文進行書寫。

如果喜歡的話 ,麻煩點個贊支持一下咯

未完待續

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章