邏輯回歸和sigmoid函數分類:容易欠擬合,分類精度不高,計算代價小,易於理解和實現
sigmoid函數與階躍函數的區別在於:階躍函數從0到1的跳躍在sigmoid函數中是一個逐漸的變化,而不是突變。
logistic 回歸分類器:在每個特征上乘以一個回歸系數,然后將所有的結果值相加,將這個總和代入到sigmoid函數中,得到一個在0-1之間的數值,大於0.5分為1類,小於0.5分為0類。所以,邏輯回歸也可以被看作是一種概率估計。
關鍵在於求最佳回歸系數。
1、基於最優化方法的最佳回歸系數確定
1)梯度上升算法:沿着該函數的梯度方向搜尋,該算法在到達每個點后都會重新估計移動的方向,循環迭代直到滿足停止條件。
梯度下降算法:求解函數最小值。
#邏輯回歸梯度上升優化算法 def loadDataSet(): dataMat = [];labelMat = [] fr = open('testset.txt') for line in fr.readlines(): lineArr = line.strip().split() dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])]) labelMat.append(int(lineArr[2])) return dataMat,labelMat def sigmoid(inX): return 1.0/(1+exp(-inX)) def gradAscent(dataMatIn,classLabels): dataMatrix = mat(dataMatIn) labelMat = mat(classLabels).transpose() m,n = shape(dataMatrix) alpha = 0.001 maxCycles = 500 weights =ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) error = (labelMat -h) weights = weights +alpha * dataMatrix.transpose() *error return weights
alpha是向目標移動的步長,maxCycles是迭代次數。
2、分析數據:畫出決策邊界
def plotBestFit(weights): import matplotlib.pyplot as plt dataMat,labelMat = loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = [];ycord1 = [] xcord2 = [];ycord2 = [] for i in range(n): if int(labelMat[i])==1: xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]);ycord1.append(dataArr[i,2]) fig =plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1,ycord1,s=30,c='red',marker='s') ax.scatter(xcord2,ycord2,s=30,c='green') x = arange(-3.0,3.0,0.1) y = arange(-weights[0] -weights[1]*x)/weights[2] ax.plot(x,y) plt.xlabel('X1'); plt.ylabel('X2'); plt.show