欢迎使用CSDN-markdown编辑器
来源:互联网 发布:知乎 室内环保 编辑:程序博客网 时间:2024/05/21 17:33
逻辑回归的数学推导和python实现
本文是笔者用来记录自己对于机器学习传统方法的学习过程,并且对其加以总结之后得到的结果,希望能够帮自己巩固机器学习的知识,并且能够加深对其的理解话不多说,让我们开始吧
logistcRegression的数学推导
逻辑回归的损失函数
逻辑回归的python实现
逻辑回归的数学推导
逻辑回归是一种特殊的回归方法,虽然是回归,但其实是一种二分类方法。
首先,说道逻辑回归就不得不说一下广义的线性模型,广义的线性模型是如下定义公式的:
这个是线性回归模型中的一般公式,而逻辑回归的时候g() = ln(.)
考虑到二分类的任务,需要把输入和输出分为y = {0,1},最理想的情况是0处的阶跃函数。但是由于阶跃函数不连续,所以使用sigmoid函数来对它进行替代:
sigmoid函数:
从而根据计算公式进行变化,则有
所以使用概率公式对其进行表示得到如下所示的公式:
接下来就是使用概率论中的极大似然估计法进行估计,默认所有的采样点都是独立同分布的,则有:
也就是说每个样本属于真实标记的概率越大越好,为了简化计算,令B=(w;b),则公式可以转化为:
之后就需要使用关于B的凸优化方法,经典的可以使用梯度下降法,牛顿梯度法来进行迭代求解。最后可以得到我们想要的B值。
逻辑回归的损失函数
说完了逻辑回归的推导求解部门,我们需要了解一下它的costfunction。首先,我们要来解释一下,在逻辑回归中,我们使用的是对数似然损失函数,具体的损失函数的经典论述请查看http://blog.csdn.net/bitcarmanlee/article/details/51165444博客,这个博客中已经说得很好了。
逻辑回归的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
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 一分钟了解“matlab用矩阵写法代替for循环”
- nginx服务
- 设计模式-3-原型模式
- python写入文件到mongoDB
- POJ 3107 Godfather 笔记
- 欢迎使用CSDN-markdown编辑器
- Cuda的问题
- 【备战秋招Day 3】经典面试题9-12及在线编程题7-9答案
- J2EE安装问题及汉化
- 输入输出重定向
- 数理逻辑1 -- 命题演算3
- JAVA笔记二:面向对象OOP
- lievent 简单使用
- c++ winpcap开发(6)