雖然帶着迴歸兩字,可是它解決的是分類問題,而不是預測一段連續的值。python
根據線性迴歸模型咱們只能預測連續的值,然而對於分類問題,拿二分類舉例,咱們須要輸出0或1,咱們能夠預測:算法
當時,預測
;當
時,預測
。函數
雖然上述描述看起來能夠解決問題,可是這種模型當y>1時,模型也會所以改變,這時以0.5做爲閾值就不合適了,說明線性模型並不適合解決這樣的問題。學習
這時,咱們引入一個新的模型,該模型的輸出變量範圍始終在0和1之間。 其中:
表明特徵向量
表明邏輯函數(logistic function)或稱爲S形函數(Sigmoid function),公式爲:
。優化
python代碼實現:spa
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
複製代碼
該函數的圖像爲:.net
的做用是,對於給定的輸入變量,根據選擇的參數計算輸出變量=1的可能性(estimated probablity),即3d
例如,若是對於給定的,經過已經肯定的參數計算得出
,則表示有70%的概率
爲正向類,相應地
爲負向類的概率爲1-0.7=0.3。code
咱們有了假設h(θ),以下圖cdn
對於線性迴歸模型,咱們定義的代價函數是全部模型偏差的平方和。理論上來講,咱們也能夠對邏輯迴歸模型沿用這個定義,可是問題在於,當咱們將帶入到這樣定義了的代價函數中時,咱們獲得的代價函數將是一個非凸函數(non-convexfunction)。
這意味着咱們的代價函數有許多局部最小值,這將影響梯度降低算法尋找全局最小值。
線性迴歸的代價函數爲: ;而後咱們從新定義邏輯迴歸的代價函數爲:
,其中
與
之間的關係以下圖所示:
這樣構建的函數的特色是:
將構建的 簡化以下:
帶入代價函數
後獲得:
提負號:
Python代碼實現:
import numpy as np
def cost(theta, X, y):
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))
複製代碼
在獲得這樣一個代價函數之後,咱們即可以用梯度降低算法來求得能使代價函數最小的參數了。算法爲:
Repeat {
(simultaneously update all )
}
求導後獲得:
Repeat {
(simultaneously update all )
}
因此,若是你有 個特徵,也就是說:
推導過程:
考慮:
則:
因此:
注:雖然獲得的梯度降低算法表面上看上去與線性迴歸的梯度降低算法同樣,可是這裏的與線性迴歸中不一樣,因此其實是不同的。另外,在運行梯度降低算法以前,進行特徵縮放依舊是很是必要的。
一些梯度降低算法以外的選擇: 除了梯度降低算法之外,還有一些常被用來令代價函數最小的算法,這些算法更加複雜和優越,並且一般不須要人工選擇學習率,一般比梯度降低算法要更加快速。這些算法有:共軛梯度(Conjugate Gradient),局部優化法(Broyden fletcher goldfarb shann,BFGS)和有限內存局部優化法(LBFGS)
第一個模型是一個線性模型,欠擬合,不能很好地適應咱們的訓練集;第三個模型是一個四次方的模型,過於強調擬合原始數據,而丟失了算法的本質:預測新數據。咱們能夠看出,若給出一個新的值使之預測,它將表現的不好,是過擬合,雖然能很是好地適應咱們的訓練集但在新輸入變量進行預測時可能會效果很差;而中間的模型彷佛最合適。
就以多項式理解, 的次數越高,擬合的越好,但相應的預測的能力就可能變差。
問題是,若是咱們發現了過擬合問題,應該如何處理?
丟棄一些不能幫助咱們正確預測的特徵。能夠是手工選擇保留哪些特徵,或者使用一些模型選擇的算法來幫忙(例如PCA)
正則化。 保留全部的特徵,可是減小參數的大小(magnitude)。
上面的迴歸問題中若是咱們的模型是: 咱們能夠從以前的事例中看出,正是那些高次項致使了過擬合的產生,因此若是咱們能讓這些高次項的係數接近於0的話,咱們就能很好的擬合了。因此咱們要作的就是在必定程度上減少這些參數
的值,這就是正則化的基本方法。
咱們有一個較爲簡單的防止過擬合的假設:
其中又稱爲正則化參數(Regularization Parameter)。像下圖中Regulated就是正則化以後的曲線,相對擬合的更好一些。
但若是選擇的正則化參數 過大,則會把全部的參數都最小化了,致使模型變成
,也就是上圖中紅色直線所示的狀況,形成欠擬合。
那爲何增長的一項 可使
的值減少呢? 由於若是咱們令
的值很大的話,爲了使Cost Function 儘量的小,全部的
的值(不包括
)都會在必定程度上減少。 但若
的值太大了,那麼
(不包括
)都會趨近於0,這樣咱們所獲得的只能是一條平行於
軸的直線。 因此對於正則化,咱們要取一個合理的
的值,這樣才能更好的應用正則化。 回顧一下代價函數,爲了使用正則化,讓咱們把這些概念應用到到線性迴歸和邏輯迴歸中去,那麼咱們就可讓他們避免過分擬合了。
正則化線性迴歸的代價函數爲:
若是咱們要使用梯度降低法令這個代價函數最小化,由於咱們未對進行正則化,因此梯度降低算法將分兩種情形:
{
}
對上面的算法中 時的更新式子進行調整可得:
能夠看出,正則化線性迴歸的梯度降低算法的變化在於,每次都在原有算法更新規則的基礎上令
值減小了一個額外的值。
咱們一樣也能夠利用正規方程來求解正則化線性迴歸模型,方法以下所示:
圖中的矩陣尺寸爲 。
本身計算導數一樣對於邏輯迴歸,咱們也給代價函數增長一個正則化的表達式,獲得代價函數:
Python代碼:
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
複製代碼
要最小化該代價函數,經過求導,得出梯度降低算法爲:
{
}
雖然看起來同樣的😂,可是,因此是不一樣的。