一、概率
在引入問題前,我們先復習下數學里面關於概率的基本概念
概率:對一件事發生的可能性衡量
范圍:0<=P<=1
計算方法:根據個人置信區間;根據歷史數據;根據模擬數據。
條件概率:B發生的條件下,A發生的概率
二、Logistic Regression(邏輯回歸)
1、問題引入
處理二值數據時,如果一直8個測試數據集為如下所示,我們利用線性回歸方程,建立回歸方程曲線,圖形顯示,並不能很好的模擬回歸問題,也就是我們所說的欠回歸。
如果繼續引入第9個測試點,我們發現欠回歸情況更加嚴重,因此我們需要引入一個新的回歸模型,來解決該類模型欠回歸問題。
2、簡單推導過程
假設測試數據為X(x0,x1,x2···xn)
要學習的參數為:Θ(θ0,θ1,θ2,···θn)
向量表示:
觀察Logistic函數曲線,我們發現在0到負無窮時,函數值趨向於0,0到正無窮時函數曲線趨向於1,且當z等於0時,函數值為0.5,於是我們可以引入該函數,對預測方程進行再次轉換,由數值上的計算轉換為0,1概率上的計算,即:
不同於線性回歸模型:,定義一個新的預測函數為:
於是問題從對Z函數求最優theta參數值,變為對h函數求最優theta參數值。對二值問題,可轉換為如下表述:
根據一般方法,首先定義新的cost函數,然后根據cost函數來反向更新參數theta值,如下為新的cost函數:
為了計算方便,我們對其轉化為:
兩個式子可以進行合並,最終化簡為最終的cost函數:
該式為非線性方程,通過求導來計算極值很復雜,我們引入之前的梯度下降算法,來不斷的估計新的參數值
最終更新法則為:
3、實際編程應用
如下為一個通用的非線性回歸方程,在利用梯度下降算法反向更新theta參數值時,沒有使用如下更新法則,而是使用通用方法,如下是具體代碼:
import numpy as np import random # 梯度下降算法來更新參數值 # x,y:測試數據集及標簽值,theta:學習的參數值,alpha:學習率,m:測試數據集個數,numIterations:重復更新次數 def gradientDescent(x,y,theta,alpha,m,numIterations): xTrans = np.transpose(x) for i in range(0,numIterations): hypothesis = np.dot(x,theta) loss = hypothesis - y # 定義一個通用的更新法則7 cost = np.sum(loss**2)/(2*m)
if i % 10000 == 0: print("Iteration %d | Cost:%f"%(i,cost)) gradient = np.dot(xTrans,loss)/m theta = theta - alpha*gradientreturn theta # 生成測試數據 # numPoints:測試數據集行數,bias:偏向,variance:方差 def genData(numPoints,bias,variance): x = np.zeros(shape=(numPoints,2)) y = np.zeros(shape=numPoints) for i in range(0,numPoints): x[i][0] = 1 x[i][1] = i # uniform隨機產生一些數字 y[i] = (i + bias) + random.uniform(0,1) + variance return x,y x,y = genData(100,25,10) m,n = np.shape(x) print(x,y) theta = np.ones(n) alpha = 0.0005 theta = gradientDescent(x,y,theta,alpha,m,100000) print(theta)
最終的結果如下,結果顯示,隨着訓練次數的增加,目標函數也在不斷的減小: