logistic regression

logistic regression 用於 二分類問題: y in { 0, 1}

由上一篇文章可知 線性回歸 會擬合出 一條直線, 如果我們想把它用於分類,一種辦法就是 把 該線性函數 加一層映射, 映射到 (0, 1) 空間, 然後設置一個閾值 超過該 值 取 分類1 ,否則取分類 0, 這樣就達到了目的。 (不過我們實際上操作並沒有 完全按照這個思路,具體見下文)

【學習階段】

具體來說:

增加的一層映射函數為(logistic function or the sigmoid function):

擬合函數為:

如何訓練模型的參數 theta ? 可以用極大似然法。

假設1: 擬合函數是 出現x時為分類1 的概率

把兩個函數統一在一起:

假設2: 各個訓練樣本是獨立同分布的(IID)

那麼由極大似然估計:

如何求解 似然函數的最大值? 類似線性回歸中的 梯度下降法,此處我們用 梯度上升法( gradient ascent) :

對於僅有一個訓練樣本點的情況:

上式 第1步到 第2步的推導用到了公式:

所以我們得到到了 隨機梯度上式的遞進規則 ( stochastic gradient ascent rule): 具體推導請看 線性回歸 - 曉雷機器學習筆記 - 知乎專欄 中的相關內容。

【 預測階段】

h(theta) > 0.5 Rightarrow  y =1 nh(theta) <= 0.5 Rightarrow  y = 0

[代碼]

def stocGradAscent1(dataMatrix, classLabels):n m,n = shape(dataMatrix)n alpha = 0.01n weights = ones(n) #initialize to all onesn for i in range(m):n h = sigmoid(sum(dataMatrix[i]*weights))n error = classLabels[i] - hn weights = weights + alpha * error * dataMatrix[i]n return weightsn

def classifyVector(inX, weights):n prob = sigmoid(sum(inX*weights))n if prob > 0.5: return 1.0n else: return 0.0n

def colicTest():n frTrain = open(horseColicTraining.txt); frTest = open(horseColicTest.txt)n trainingSet = []; trainingLabels = []n for line in frTrain.readlines():n currLine = line.strip().split(t)n lineArr =[]n for i in range(21):n lineArr.append(float(currLine[i]))n trainingSet.append(lineArr)n trainingLabels.append(float(currLine[21]))n trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)n errorCount = 0; numTestVec = 0.0n for line in frTest.readlines():n numTestVec += 1.0n currLine = line.strip().split(t)n lineArr =[]n for i in range(21):n lineArr.append(float(currLine[i]))n if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):n errorCount += 1n errorRate = (float(errorCount)/numTestVec)n print "the error rate of this test is: %f" % errorRaten return errorRaten

其中 horseColicTraining.txt horseColicTest.txt 分別是訓練數據和測試數據。 每行21個值,前20個特徵,最後一個是類別(0或1)。


推薦閱讀:

通俗講解維特比演算法
機器學習------令人頭疼的正則化項
27個機器學習圖表,幫你作弊一般飛速成長!
有關anonymized data的競賽
Numpy複習總結(一)

TAG:机器学习 | 分类算法 | 回归分析 |