Python机器学习Logistic回归

一,Logistic回归基本原理

Logistic Regression和Linear Regression的原理是相似的。原理可如下描述:

(1)找一个合适的预测函数(Andrew Ng的公开课中称为hypothesis),一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。

二,具体过程
1,构造预测函数

Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。根据第二章中的步骤,需要先找到一个预测函数(h),显然,该函数的输出必须是两个值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:
在这里插入图片描述
对应的函数图像是一个取值在0和1之间的S型曲线(图1)。
在这里插入图片描述
接下来需要确定数据划分的边界类型,对于图2和图3中的两种数据分布,显然图2需要一个线性的边界,而图3需要一个非线性的边界。接下来我们只讨论线性边界的情况。
图二
图三
对于线性边界的情况,边界形式如下:
在这里插入图片描述
构造预测函数为:
在这里插入图片描述
hθ(x)函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
在这里插入图片描述

2,构造Cost函数

课程中直接给出了Cost函数及J(θ)函数如式(5)和(6),但是并没有给出具体的解释,只是说明了这个函数来衡量h函数预测的好坏是合理的。
在这里插入图片描述
在这里插入图片描述
实际上这里的Cost函数和J(θ)函数是基于最大似然估计推导得到的(回顾数理统计中最大似然估计)。下面详细说明推导的过程。(4)式综合起来可以写成:
在这里插入图片描述
取似然函数:
在这里插入图片描述
对数似然函数为:
在这里插入图片描述
最大似然估计就是要求得使l(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数。将J(θ)取为(6)式,即:
在这里插入图片描述
因为乘了一个负的系数-1/m,所以J(θ)取最小值时的θ为要求的最佳参数。

3,梯度下降法求J(θ)的最小值

求J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:
在这里插入图片描述
式中为α学习步长,下面来求偏导:

在这里插入图片描述
上式求解过程中用到如下的公式:
在这里插入图片描述
因此,(11)式的更新过程可以写成:
在这里插入图片描述
因为式中α本来为一常量,所以1/m一般将省略,所以最终的θ更新过程为:
在这里插入图片描述
另外,补充一下,3.2节中提到求得l(θ)取最大值时的θ也是一样的,用梯度上升法求(9)式的最大值,可得:
在这里插入图片描述
观察上式发现跟(14)是一样的,所以,采用梯度上升发和梯度下降法是完全一样的,这也是《机器学习实战》中采用梯度上升法的原因。

三,Python算法实现

梯度上升法求最佳回归系数
首先,数据取自《机器学习实战》中的数据,部分数据如下:

-0.017612   14.053064   0
-1.395634   4.662541    1
-0.752157   6.538620    0
-1.322371   7.152853    0
0.423363    11.054677   0
0.406704    7.067335    1

先定义函数来获取数去,然后定义分类函数Sigmoid函数,最后利用梯度上升法求解回归系数θ。建立一个logRegres.py文件,输入如下代码:

from numpy import *
#构造函数来获取数据
def loadDataSet():
	dataMat=[];labelMat=[]
	fr=open('machinelearninginaction/Ch05/testSet.txt')
	for line in fr.readlines():
    	lineArr=line.strip().split()
    	dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])#特征数据集,添加1是构造常数项x0
    	labelMat.append(int(lineArr[-1]))#分类数据集
	return dataMat,labelMat

def sigmoid(inX):
	return 1/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):
	dataMatrix=mat(dataMatIn) #(m,n)
	labelMat=mat(classLabels).transpose() #转置后(m,1)
	m,n=shape(dataMatrix)
	weights=ones((n,1)) #初始化回归系数,(n,1)
	alpha=0.001 #定义步长
	maxCycles=500 #定义最大循环次数
	for i in range(maxCycles):
    	h=sigmoid(dataMatrix * weights) #sigmoid 函数
    	error=labelMat - h #即y-h,(m,1)
    	weights=weights + alpha * dataMatrix.transpose() * error #梯度上升法
	return weights

于是得到了回归系数。接下来根据回归系数画出决策边界,定义作图函数:

def plotBestFit(weights):
import matplotlib.pyplot as plt
dataMat,labelMat=loadDataSet()
n=shape(dataMat)[0]
xcord1=[];ycord1=[]
xcord2=[];ycord2=[]
for i in range(n):
    if labelMat[i]==1:
        xcord1.append(dataMat[i][1])
        ycord1.append(dataMat[i][2])
    else:
        xcord2.append(dataMat[i][1])
        ycord2.append(dataMat[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,3,0.1)
y=(-weights[0,0]-weights[1,0]*x)/weights[2,0] #matix
ax.plot(x,y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值