逻辑回归和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