logistic regression
logistic regression 用於 二分類問題:
由上一篇文章可知 線性回歸 會擬合出 一條直線, 如果我們想把它用於分類,一種辦法就是 把 該線性函數 加一層映射, 映射到 空間, 然後設置一個閾值 超過該 值 取 分類1 ,否則取分類 0, 這樣就達到了目的。 (不過我們實際上操作並沒有 完全按照這個思路,具體見下文)
【學習階段】
具體來說:
增加的一層映射函數為(logistic function or the sigmoid function):
擬合函數為:
如何訓練模型的參數 ? 可以用極大似然法。
假設1: 擬合函數是 出現x時為分類1 的概率
把兩個函數統一在一起:假設2: 各個訓練樣本是獨立同分布的(IID)
那麼由極大似然估計:
如何求解 似然函數的最大值? 類似線性回歸中的 梯度下降法,此處我們用 梯度上升法( gradient ascent) :對於僅有一個訓練樣本點的情況:
上式 第1步到 第2步的推導用到了公式:所以我們得到到了 隨機梯度上式的遞進規則 ( stochastic gradient ascent rule): 具體推導請看 線性回歸 - 曉雷機器學習筆記 - 知乎專欄 中的相關內容。
【 預測階段】
[代碼]
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複習總結(一)