逻辑回归(logistic regression)及其Python实现
来源:互联网 发布:stc的16位单片机 编辑:程序博客网 时间:2024/06/06 06:45
逻辑回归(logistic regression)
逻辑回归(LogisticRegression)是机器学习中的一种分类模型,由于算法的简单和高效,在实际中应用非常广泛。它虽然它名字里面有“回归”两个字,却不是一个回归算法,而是一个分类模型,它是被用来做分类的。之所以称之为回归,是因为它的学习的是模型模型的参数以最佳拟合已有的数据。(比如,根据已有的一些点,回归出它的直线参数的拟合过程,就称之为回归。)逻辑回归其实仅为在线性回归的基础上,套用了一个逻辑函数。
一.逻辑回归模型的优缺点:
1. 优点:训练快、易理解、易实现、可用于概率预测,也可用于分类、各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算的;
2. 缺点:模型不够强大、拟合能力有限,欠拟合,对于复杂的任务效果不够好、仅能用于线性问题;
二.介绍一下逻辑回归所用到的Sigmoid函数:
由图可知,sigmoid的函数输出是介于(0,1)之间的,中间值是0.5。当x>0时,输出值大于0.5,归于A类;当x<0时,输出值小于0.5,归于B类;当x=0时可自己规定属于哪一类。
三.构造预测函数
对于样本容为m的数据,每个样本有n个特征(feature)X和一个输出y,即 。
给定权重向量,则
由此,预测函数有,其中
预测函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
四.运用极大似然估计法构造成本函数(cost function)
由上述两个概率公式得
因为各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算,所以它们的联合分布可以表示为各个样本非让你不的乘积,取似然函数为:
取对数似然函数:
最大似然估计就是求使对数似然函数取得最大值时,得到的参数就是最佳参数。
所以我们构造cost函数为:
我们求对数似然函数取得最大值就是求cost函数的最小值。此时可以用梯度下降法求。
五.梯度下降法求最小值
1.批量梯度下降法BGD
因为函数g(z)的特性,所以
设置步长为α,则θ的更新公式为:
θ更新公式的矩阵形式是:
2.随机梯度下降算法(Stochastic GradientDescent, SGD)
我们之前用的梯度下降法要遍历训练数据中所有的样本进行计算,我们称这种算法叫做批梯度下降(Batch Gradient Descent)。但是当样本特别大时,计算量就很大。这时,我们可以用随机梯度下降法,即每次更新权值θ,只选一个样本进行计算。更新公式为:
3.小批量梯度下降法(Mini-batch Gradient Descent, MBGD)
对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。这时我们选择一个折中的方法小批量梯度下降法。
对于大小为m的样本,我们每次迭代更新权值θ时,选择x(1<k<m)个样本进行计算。更新公式为:
4.批量梯度下降法BGD、随机梯度下降算法SGD、小批量梯度下降法MBGD的比较
(1) 随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将θ迭代到最优解了,而批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较 BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
(2) 随机梯度下降中,虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
(3) 梯度法对步长不敏感,随机梯度对步长选择敏感;梯度法对初始点(参数)选择敏感。
(4) 多数情况下,MBGD会比SGD收敛要速度快。在训练样本多的情况下,SGD比BGD的收敛速度快,一个原因是BDG要通过所有样本计算梯度,而SGD通过一个样本计算一个近似的梯度,本身计算量就会小的多。
六.python代码实现
from numpy import *def loadDataSetTrain(filename): #载入训练数据 dataMat=[] labelMat=[] fr=open(filename); for line in fr.readlines(): #读取文件 lineArr=line.strip().split('\t') #去除每一行中的空格 dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])]) labelMat.append(int(lineArr[2])) return mat(dataMat),mat(labelMat)def loadDataSetTest(filename): #载入测试数据 dataMat=[] fr=open(filename); for line in fr.readlines(): #读取文件 lineArr=line.strip().split('\t') #去除每一行中的空格 dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])]) return dataMatdef sigmoid(inX): return 1.0/(1+exp(-inX)) #使用sigmoid函数def logisticRegression(dataMat,labelMat,m,n,k): #更新权值,k是循环次数 X=dataMat.T Y=labelMat theta=mat(ones(n)) #初始化权重矩阵 for i in range(k): theta=theta-0.2/m*(sigmoid(theta*X)-Y)*X.T #更新公式 return thetadef classifyVector(testData,theta): prob=sigmoid(theta*testData) return probdataMat,labelMat=loadDataSetTrain('E:\\python\\machine_learning\\train.txt')m,n=shape(dataMat) #样本数据有m个,加上偏置相有特征值n个testData=loadDataSetTest('E:\\python\\machine_learning\\test.txt')testData=mat(testData).T #测试数据theta=logisticRegression(dataMat,labelMat,m,n,1000)x=classifyVector(testData,theta)xx=x.tolist()print(xx)
- 逻辑回归(logistic regression)及其Python实现
- Python实现Logistic Regression(逻辑回归)
- Python实现逻辑回归(Logistic Regression in Python)
- Python实现逻辑回归(Logistic Regression in Python)
- 逻辑回归(logistic regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- Logistic Regression(逻辑回归)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- Logistic Regression 逻辑回归算法例子,python代码实现
- 《统计学习方法》 逻辑斯谛回归(logistic regression) Python实现
- Python实践之(七)逻辑回归(Logistic Regression)
- Leetcode38
- linux下的定时任务管理器 crontab
- matlab入门(1)
- 虚拟机下CentOS 6.x安装MySQL 5.6.x
- 1.求int类型数据在内存中表示的1的个数
- 逻辑回归(logistic regression)及其Python实现
- 深拷贝与浅拷贝
- Android 中的Dalvik和ART是什么,有啥区别?
- aspx 按钮传值
- broken keyboard
- 【Spring】使用@Service注解写的一个小例子
- 关于cms和crm
- Scala函数式程序设计原理 week4 Types and Pattern Matching
- ffmpeg 使用滤镜