假设我们有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合的过程就称作回归。逻辑回归的主要思想是根据现有数据对分类边界线建立回归公式,以此分类。这里的“回归”源于最佳拟合,表示要找到最佳拟合参数。逻辑回归是基于条件概率的判别模型。
推导过程:
为了实现逻辑回归分类器,我们可以在每个特征上诚意一个回归系数,然后把所有的结果值相加,将这个总和带入到Sigmoid函数中,进而得到一个范围子【0,1】之间的数值。任意大于0.5的数据分为1类,小于0.5的分入0类。
Sigmoid函数的输入记为Z,则
则Sigmoid函数为
用一个概率表示一下 如果样本为1,h(z)的概率为0.3,则样本为0时,1-h(z)就是0.7
得到代价函数:
对指数函数对数化:
接着对L求偏导:
将三个结果相乘并化简:
梯度上升公式为
最后化简为
我们只需求出w的值,就可以确定回归线,即Z。
代码如下:
def loadDataSet():
dataMat=[] ##创建数据列表
labelMat=[] #创建标签列表
fr=open('testSet.txt') #打开文件
for line in fr.readlines(): #逐行读取
lineArr=line.strip().split() #去回车,按空格分隔
dataMat.append([1,float(lineArr[0]),float(lineArr[1])])#添加数据
labelMat.append(int(lineArr[2]))#添加标签
fr.close()#关闭文件
return dataMat,labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
梯度上升算法
def gradAscent(dataMatIn,classLabels):
dataMatrix=np.mat(dataMatIn)
labelMat=np.mat(classLabels).transpose()
m,n=np.shape(dataMatrix)
alpha=0.001
maxCycles=500
weights=np.ones((n,1))
for k in range (maxCycles):
h=sigmoid(dataMatrix*weights) # Z()=w^T*x 直线
err=(labelMat-h)
weights=weights+alpha*dataMatrix.transpose()*err
return weights
画出决策边界
def plotBestFit(weights):
dataMat,labelMat=loadDataSet()
dataArr = array(dataMat)
n = np.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]);ycord2.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=np.arange(-3.0,3.0,0.1) #(start,end,步长)
y=(-weights[0]-weights[1]*x)/weights[2]
ax.plot(x,y)
plt.xlabel('X1');
plt.ylabel('X2');
plt.show()