逻辑回归原理简述及代码实现
Logistic回归
- 1 逻辑回归原理
- 1.1 线性回归
- 1.2 逻辑回归
- 2 具体过程
- 2.1 构造预测函数
- 2.2 构造损失函数J(θ)
- 2.3 采用梯度下降算法minJ(θ)
- 2.4 采用向量化进行优化
- 3 python实现逻辑回归
1 逻辑回归原理
逻辑回归与线性回归本质上来说是类似,相较线性回归来说只是多了一个Logistic函数(或称为Sigmoid函数)。
1.1 线性回归
机器学习最通俗的解释就是让机器学会决策。对于我们人来说,比如去菜市场里挑选芒果,从一堆芒果中拿出一个,根据果皮颜色、大小、软硬等属性或叫做特征,我们就会知道它甜还是不甜。类似的,机器学习就是把这些属性信息量化后输入计算机模型,从而让机器自动判断一个芒果是甜是酸,这实际上就是一个分类问题。
分类和回归是机器学习可以解决两大主要问题,从预测值的类型上看,连续变量预测的定量输出称为回归;离散变量预测的定性输出称为分类。例如:预测明天多少度,是一个回归任务;预测明天阴、晴、雨,就是一个分类任务。
1.2 逻辑回归
Logistic Regression原理与Linear Regression回归类似,其主要流程分为:
(1)构建预测函数。一般来说在构建之前,需要根据数据来确定函数模型,是线性还是非线性。
(2)构建Cost函数(损失函数)。该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
(3)采用梯度下降算法,minJ(θ)。在数据量很大时,梯度下降算法执行起来会较慢。因此出现了随机梯度下降等算法进行优化。
2 具体过程
2.1 构造预测函数
在线性回归中模型中预测函数为:
逻辑回归作为分类问题,结果h = {1 or 0}即可。若逻辑回归采用线性回归预测函数则会产生远大于1或远小于0得值,不便于预测。因此线性回归预测函数需要做一定改进。设想如果有一个函数h(x)能够把预测结果值压缩到0-1这个区间,那么我们就可以设定一个阈值s,若h(x) >= s,则认定为预测结果为1,否之为0。
实际中也存在这样函数:Logistic函数(或称为Sigmoid函数),函数表达式为:
从上图可以看到,g(z)随着z不断增大越来越靠近1但不会超过1,相反随着z不断减少越来越靠近0但不会小于0。此类函数完美满足前面线性函数作为逻辑回归函数模型中得不足。因此集合Sigmoid函数就可以构造预测函数。
接下来需要确定数据划分的边界类型,对于图1和图2中的两种数据分布,显然图1需要一个线性的边界,而图2需要一个非线性的边界。接下来我们只讨论线性边界的情况。
在构建预测函数时,首先通过数据得到大概得决策边界。例图1中的边界为线性边界。本文也只分析线性边界。
经过公式1与公式2整合,得到公式3,即逻辑回归预测函数。hθ(x)函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
2.2 构造损失函数J(θ)
损失函数J(θ)是由极大似然法推导而来,本文暂时不给出公式推导,直接借用吴恩达老师课中给出的损失函数J(θ)。
对上述公式进行整合可以得到如下公式:
上述公式则为逻辑回归的损失函数J(θ),接下则需要通过训练减少J(θ)。
2.3 采用梯度下降算法minJ(θ)
求J(θ)可以通过最小值可以通过梯度下降算法,根据梯度下降算法可以得到θ不断更新的过程。
定义一个f(x),f(x)原型和求导如下。
对θ更新会用到上式公式,读者可以自己推导一下。
求偏导如下:
2.4 采用向量化进行优化
对θ更新时,需要多层循环嵌套取得一些值,对此用向量化来进行优化。
假设有m个样本,每个样本有n+1个特征,θ0 = 1,则就可以构建一个mx(n+1)的样例矩阵。
特征值向量
对A矩阵经过sigmod函数处理,得到预测函数h和误差矩阵。
通过构建此类矩阵,并按照一定的运算规则,会加快梯度下降速度。α为学习步长。
同理对其它θ参数更新时规则如下:
与其像上面逐步分开求θ参数变化,可以将θ整合到一块处理更快速。
以上是向量化全部介绍。通过向量化不仅可以减少出错,还可以提高效率,建议多使用向量化来进行编程,解决实际问题。
3 python实现逻辑回归
import numpy as np
import matplotlib.pyplot as pltclass LogisticReg():def __init__(self):passdef sigmod(self,x):return 1.0/(1+np.exp(-x))def get_data(self,path):self.x = []self.y = []dat = open(path)for line in dat:temp = line.split()self.x.append(temp[:2])self.y.append(temp[2])self.y = list(map(lambda x:float(x),self.y))self.y = np.array(self.y)self.y = self.y.reshape((len(self.y, )))self.x = np.array(self.x)self.x = self.x.reshape((len(self.x), len(self.x[0])))self.x = self.stringTofloat(self.x)# print(self.x,self.y)def init_data(self,path):data = np.loadtxt(path)# print(data)dataMatIn = data[:,0:-1]dataLabel = data[:,-1:]dataMatIn = np.insert(dataMatIn,0,1,axis = 1)return dataMatIn,dataLabeldef stringTofloat(self,number):# number is Two-dimensional array(m,n) = number.shapex = np.zeros((m,n))for i in range(m):for j in range(n):# print(float(number[i,j]))x[i][j] = float(number[i][j])return xdef LogisticRegGradinet(self,theta,learing_rate,dataMatIn,dataLabel):m = dataMatIn.shape[0]dataMatIn = np.mat(dataMatIn)dataLabel = np.mat(dataLabel)h = self.sigmod(dataMatIn*theta)err = h-dataLabelweights = theta.copy()weights = weights - learing_rate*1.0/m*dataMatIn.transpose()*errreturn weightsdef trainLogisticRegression(self,interations,learing_rate,dataMatIn,dataLabel):theta = np.ones((dataMatIn.shape[1],1))for i in range(interations):theta = self.LogisticRegGradinet(theta,learing_rate,dataMatIn,dataLabel)return thetadef plotBestFIt(self,dataMatIn,dataLabel,weights):self.x = dataMatIn.reshape((dataMatIn.shape[0],dataMatIn.shape[1]))self.y = dataLabel.reshape((dataLabel.shape[0],))m = dataMatIn.shape[0]print(weights.shape,weights[0][0],weights[1][0],weights[2][0])xcord1 = []ycord1 = []xcord2 = []ycord2 = []for i in range(m):if self.y[i] == 1:xcord1.append(self.x[i][1])ycord1.append(self.x[i][2])else:xcord2.append(self.x[i][1])ycord2.append(self.x[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, 3, 0.1)y = (-float(weights[0][0]) - (float(weights[1][0]) * x)) / float(weights[2][0]) # matixax.plot(x, y)plt.xlabel('X1')plt.ylabel('X2')plt.show()def run(self):path = "D:\\Data\\LogisticReg\\data.txt"dataMatIn,dataLabel = self.init_data(path)interations = 5000 #最大迭代次数learing_rate = 0.01 #学习步长theta = self.trainLogisticRegression(interations,learing_rate,dataMatIn,dataLabel)self.plotBestFIt(dataMatIn,dataLabel,theta)def test(self):self.init_data("D:\\Data\\LogisticReg\\data.txt")if __name__ == "__main__":f = LogisticReg()f.run()# f.test()
参考文章
机器学习之逻辑回归(纯python实现)
逻辑回归(Logistic Regression, LR)简介
逻辑回归原理简述及代码实现相关推荐
- 逻辑回归原理(python代码实现)
原文: https://blog.csdn.net/csqazwsxedc/article/details/69690655 Logistic Regression Classifier逻辑回归主要思 ...
- python实现逻辑回归的流程_逻辑回归原理及其python实现
September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...
- 【机器学习】Logistic Regression逻辑回归原理与java实现
[机器学习]Logistic Regression逻辑回归原理与java实现 1.基于概率的机器学习算法 2.逻辑回归算法原理 2.1.分离超平面 2.2.阈值函数 2.3.样本概率 2.4.损失函数 ...
- 逻辑回归原理梳理_以python为工具 【Python机器学习系列(九)】
逻辑回归原理梳理_以python为工具 [Python机器学习系列(九)] 文章目录 1.传统线性回归 2.引入sigmoid函数并复合 3. 代价函数 4.似然函数也可以 5. python梯度下降 ...
- 【机器学习】逻辑回归原理介绍
[机器学习]逻辑回归原理介绍 [机器学习]逻辑回归python实现 [机器学习]逻辑回归sklearn实现 Logistic 回归模型是目前广泛使用的学习算法之一,通常用来解决二分类问题,虽然名字中有 ...
- 逻辑回归原理及其推导
转自:https://blog.csdn.net/nageaixiaodenanhai/article/details/81592713 逻辑回归原理 逻辑回归是利用回归类似的方法来解决分类问题.假设 ...
- 逻辑回归原理与sklearn实现
目录 一.逻辑回归介绍 1.应用场景 2.逻辑回归原理 2.1 输入 2.2激活函数 3.损失与优化 3.1 损失(对数似然损失) 3.2 优化 二.逻辑回归API介绍 三.案例实现 四.分类评估方法 ...
- 算法梳理(二)逻辑回归原理及实现
算法梳理(二)逻辑回归原理及实现 逻辑回归原理 一.从线性回归到逻辑回归 二.二分类的逻辑回归 (一)过程推理 (二)正则化 三.scikit-learn中逻辑回归参数详解 逻辑回归原理 logist ...
- 【TensorFlow】逻辑回归原理与实现(超详细)
逻辑回归原理与实现 学习目标 1. 神经网络基础 1.1 Logistic回归 1.2 逻辑回归损失函数 2. 梯度下降算法 3. 导数 3.1 导数 3.2 导数计算图 3.3 链式法则 3.4 逻 ...
最新文章
- C语言程序设计第一节课作业
- 第五百七十二、三天 how can I 坚持
- php 验证码 扩展,使用 Captcha 扩展包 为 Laravel 5 应用生成验证码
- nanodet onnx踩坑记录
- EasyUI Combogrid Bug
- Python 与 SQLServer数据库连接
- 禅道8.2-9.2.1注入GetShell
- 6005.boost多线程与mavlink协议结合实现消息收发
- Yii2.0在GridView中下拉过滤筛选的实现
- Redis教程:数据对象分析(二)
- officescan使用apache跳轉設置
- CLI (命令行接口) 简易开发
- 软工专硕考研_你可能需要了解--2018年北京大学软微软件工程专硕考研 经验分享...
- 关于我的英文名字Byron
- discuz!Q免登陆蓝天采集器api发布模块
- mavoneditor 显示html,mavonEditor
- Linux在虚拟机里大小写键不停闪动是因为虚拟机内外的大小写不同导致,将虚拟机内外的大小写切换一致即可解决
- 工信部数字电视标准符合性检测中心发布的
- 《Android 开发入门与实战(第二版)》——导读
- 【Linux上分之路】第十二篇:Linux三剑客grep、sed、awk