機器學習第7天:深入瞭解邏輯迴歸
阿新 • • 發佈:2018-12-12
一、邏輯迴歸是什麼
簡單來說, 邏輯迴歸(Logistic Regression)是一種用於解決二分類(0 or 1)問題的機器學習方法,用於估計某種事物的可能性。比如某使用者購買某商品的可能性,某病人患有某種疾病的可能性,以及某廣告被使用者點選的可能性等。
邏輯迴歸是為了解決分類問題,根據一些已知的訓練集訓練好模型,再對新的資料進行預測屬於哪個類。
邏輯迴歸(Logistic Regression)與線性迴歸(Linear Regression)都是一種廣義線性模型(generalized linear model)。邏輯迴歸假設因變數 y 服從伯努利分佈,而線性迴歸假設因變數 y 服從高斯分佈。
二、邏輯迴歸的代價函式
1. 公式:
綜合起來為:
其中
2. 公式推導過程:
代價函式的推導分兩步進行:
- 尋找一個合適的預測函式,一般表示為h函式。
- 構造一個cost函式,該函式表示預測的輸出(h)與訓練資料的類別(y)之間的偏差。
2.1. 尋找預測函式
Logistic Regression雖然名字裡帶“迴歸”,但是它實際上是一種分類方法,用於兩分類問題(即輸出只有兩種),顯然,預測函式的輸出必須是兩個值(分別代表兩個類別),所以利用了Logistic函式(或稱為Sigmoid函式)。
sigmoid函式是一個s形的曲線,它的取值在[0, 1]之間,在遠離0的地方函式的值會很快接近0或者1。它的這個特性對於解決二分類問題十分重要。
Sigmoid函式:
接下來需要確定資料劃分的邊界型別,對於圖1和圖2中的兩種資料分佈,顯然圖2需要一個線性的邊界,而圖3需要一個非線性的邊界。接下來我們只討論線性邊界的情況。
圖1 圖2對於線性邊界的情況,邊界形式如下:
構造預測函式為:
hθ(x)函式的值有特殊的含義,它表示結果取1的概率,因此對於輸入x分類結果為類別1和類別0的概率分別為:
2.2. 構造代價函式
上面的n改成m,筆誤。
三、梯度下降法求J(θ)的最小值
θ更新過程可以寫成:
四、程式碼展示
def LogisticRegression():
data = loadtxtAndcsv_data("data2.txt", ",", np.float64)
X = data[:,0:-1]
y = data[:,-1]
plot_data(X,y) # 作圖
X = mapFeature(X[:,0],X[:,1]) #對映為多項式
initial_theta = np.zeros((X.shape[1],1))#初始化theta
initial_lambda = 0.1 #初始化正則化係數,一般取0.01,0.1,1.....
J = costFunction(initial_theta,X,y,initial_lambda) #計算一下給定初始化的theta和lambda求出的代價J
print(J) #輸出一下計算的值,應該為0.693147
#result = optimize.fmin(costFunction, initial_theta, args=(X,y,initial_lambda)) #直接使用最小化的方法,效果不好
'''呼叫scipy中的優化演算法fmin_bfgs(擬牛頓法Broyden-Fletcher-Goldfarb-Shanno)
- costFunction是自己實現的一個求代價的函式,
- initial_theta表示初始化的值,
- fprime指定costFunction的梯度
- args是其餘測引數,以元組的形式傳入,最後會將最小化costFunction的theta返回
'''
result = optimize.fmin_bfgs(costFunction, initial_theta, fprime=gradient, args=(X,y,initial_lambda))
p = predict(X, result) #預測
print(u'在訓練集上的準確度為%f%%'%np.mean(np.float64(p==y)*100)) # 與真實值比較,p==y返回True,轉化為float
X = data[:,0:-1]
y = data[:,-1]
plotDecisionBoundary(result,X,y) #畫決策邊界
感覺有困難可以先放著,後期會進行更加具體的介紹,知道這麼幾個公式就好了。