欢迎使用CSDN-markdown编辑器

来源:互联网 发布:知乎 室内环保 编辑:程序博客网 时间:2024/05/21 17:33

逻辑回归的数学推导和python实现

本文是笔者用来记录自己对于机器学习传统方法的学习过程,并且对其加以总结之后得到的结果,希望能够帮自己巩固机器学习的知识,并且能够加深对其的理解话不多说,让我们开始吧

  • logistcRegression的数学推导

  • 逻辑回归的损失函数

  • 逻辑回归的python实现


逻辑回归的数学推导

逻辑回归是一种特殊的回归方法,虽然是回归,但其实是一种二分类方法。
首先,说道逻辑回归就不得不说一下广义的线性模型,广义的线性模型是如下定义公式的:
y=g1(wTx+b)
这个是线性回归模型中的一般公式,而逻辑回归的时候g() = ln(.)
考虑到二分类的任务,需要把输入和输出分为y = {0,1},最理想的情况是0处的阶跃函数。但是由于阶跃函数不连续,所以使用sigmoid函数来对它进行替代:
sigmoid函数:

y=11+ezz=wTx+b

从而根据计算公式进行变化,则有
lny1y=wTx+b

所以使用概率公式对其进行表示得到如下所示的公式:
lnp(y=1|x)p(y=0|x)=wTx+b

接下来就是使用概率论中的极大似然估计法进行估计,默认所有的采样点都是独立同分布的,则有:
l(w,b)=n=1Nlnp(yi|xi;w,b)

也就是说每个样本属于真实标记的概率越大越好,为了简化计算,令B=(w;b),则公式可以转化为:
p(yi|xi;w,b)=yip1(xi;B)+(1yi)po(xi;B)

之后就需要使用关于B的凸优化方法,经典的可以使用梯度下降法,牛顿梯度法来进行迭代求解。最后可以得到我们想要的B值。

逻辑回归的损失函数

说完了逻辑回归的推导求解部门,我们需要了解一下它的costfunction。首先,我们要来解释一下,在逻辑回归中,我们使用的是对数似然损失函数,具体的损失函数的经典论述请查看http://blog.csdn.net/bitcarmanlee/article/details/51165444博客,这个博客中已经说得很好了。

cost(hθ(xi),yi)=yilog(hθ(x))(1yi)log(1hθ(x))

逻辑回归的python实现

说完理论部分,让我们来实际使用python来进行编写相应程序,首先需要构建sigmoid以及相应的假设函数:

def sigmoid(inX):return 1.0/(1+exp(-inX))def Hypothesis(theta, x):    z = 0    for i in range(len(theta)):        z += x[i]*theta[i]    return sigmoid(z)

自行调整输入的数据,可以使用python中的噪音随机也可以,接下来进入lr的迭代环节:

def gradAscent(dataMatIn, classLabels):    dataMatrix = mat(dataMatIn)  # convert to NumPy matrix    labelMat = mat(classLabels).transpose()  # convert to NumPy matrix    m, n = shape(dataMatrix)    alpha = 0.001    maxCycles = 500    weights = ones((n, 1))    for k in range(maxCycles):  # heavy on matrix operations        h = sigmoid(dataMatrix * weights)  # matrix mult        error = (labelMat - h)  # vector subtraction        weights = weights + alpha * dataMatrix.transpose() * error  return weights

如果标签出错的话,就进行一次梯度下降的迭代,学习率是0.001,最大迭代次数为500

def Cost_Function_one(X,Y,theta):    sumOfErrors = 0    for i in range(len(X)):        itemp = i % len(X)        xi = X[itemp]        hi = Hypothesis(theta,xi)        if Y[itemp] == 1:            error = Y[itemp] * math.log(hi)        elif Y[itemp] == 0:            error = (1-Y[itemp]) * math.log(1-hi)            sumOfErrors += error    cons = - 1/len(X)    Ji = cons * sumOfErrors    return Ji

损失函数如上所定义的,可以考虑是否在训练的过程中进行迭代输出,从而取得不错的效果
最后使用定义的方法来对相应的结果进行检测:

def testLogRegres(weights, test_x, test_y):    numSamples, numFeatures = shape(test_x)    matchCount = 0    for i in range(numSamples):        x = test_x[i][0]*weights[0][0] +  test_x[i][1]*weights[1][0] +  test_x[i][2]*weights[2][0] + test_x[i][3]*weights[3][0] + test_x[i][4]*weights[4][0]        predict = sigmoid(x)> 0.5        if predict == True:            predict1 = 1        else:            predict1 = 0        if predict1 == test_y[i]:            matchCount += 1    accuracy = float(matchCount) / numSamples    return accuracy

最后,大家如果想要完整代码的话,欢迎去我的github上下载https://github.com/renhui19931001/algorithm/blob/master/kpi_score.py