Logistic Regression——逻辑回归

1. 为什么需要逻辑回归     

        在前面学习的线性回归中,我们的预测值都是任意的连续值,例如预测房价。除此之外,还有一个常见的问题就是分类问题,而逻辑回归是一个解决分类问题的模型,其预测值是离散的

        分类问题又包括二分类问题与多分类问题,对于二分类问题来说,预测值只可能是\否即1\0,

        对于多分类问题来说,预测值可能是多个分类中的一个,例如我输入的是一些动物的图片,我想让模型辨认这些是什么动物,我可以设定预测值1代表模型认为输入是一只猫,预测值2代表模型认为输入是一只狗,预测值3代表模型认为输入是一只猪。

2. 二分类逻辑回归

2.1 从线性回归到分类

        如果有这样一个场景,输入x为肿瘤的大小,而需要预测是否是恶性的。接下来我们仍然使用线性回归模型,但如果我们这增设这样一个阈值

                

        这样一来,所有预测值都将变成1或者0,实现了分类的目的

2.2 逻辑回归模型

        对于线性回归的模型来说,其输出值是任意的,常常会远远大于1或者远远小于0,仅仅上述的阈值可能并不会起到作用或者效果很差。

        对此,逻辑回归会先将所有预测值通过sigmoid 函数映射到[0,1]区间,函数表达式和图像如下图

                                                        (z为输入)

        ​​​​​​​        ​​​​​​​        

        sigmoid 函数是一个非线性函数,当x大于0时,输出值大于0.5,当x<0时输出值小于0.5

        最终我们得到逻辑回归的模型如下

        ​​​​​​​        

           h_{\theta }(x)作用是,对于给定的输入变量,通过参数\theta计算输出变量为1的可能性是多少

        

        假如对于一个输入x,最终计算出h_{\theta }(x)=0.7,则模型认为有70%的可能其为正向类(=1),相反负向类的可能性就为1-0.7=0.3

        最后在分类时,再入加上之前的阈值

        所以逻辑回归就是线性回归再嵌套一个非线性的sigmoid函数,其本质还是回归

2.4 决策边界(Decision Boundary

        假如分类这样一些数据,‘x’为1,圈为0

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        通过建立逻辑回归模型

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        假设经过训练我们得到了这样一组参数,于是得到嵌套在逻辑回归里的线性回归模型\theta^{\top }X=-3+x_{1}+x_{2},根据逻辑回归的原理当-3+x_{1}+x_{2}>=0时预测1,当-3+x_{1}+x_{2}<0时预测0,于是分隔情况就是-3+x_{1}+x_{2}=0,我们可以画出这个直线

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        这条线便是模型的决策边界

        如果是这样的数据

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        建立逻辑回归模型

        得到参数

        

        同样的原理,得到其决策边界,是一个圆心在原点,半径为1的圆

        

        ​​​​​​​        ​​​​​​​        ​​​​​​​                

2.5 损失函数

2.5.1 为什么不用MSE损失函数

       根据上述的理论可以知道,逻辑回归的和线性回归的本质是一样的。那是不是意味着损失函数也可以用MSE。

        在线性回归中损失函数如下

                                                J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }^{i}-y^{i})^{2}

        我们将​​​​​​​带入可以得到

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(\frac{1}{1+e^{\theta ^{\top }x}}-y)^{2}

        得到的是一个非凸函数(non-convexfunction),这会很大程度上影响梯度下降法寻找全局最小值,很可能停留在在某个局部极小值

2.5.2 对数损失函数

        介于上述问题,对于二分类逻辑回归来说,使用的是对数损失函数。

对于一个样本来说,预测值会有1和0两种情况,对应两个损失值

     

(log一般以e为底)

        ​​​​​​​        ​​​​​​​        

        当实际y=1时,如果预测值h_{\theta }(x)=1,此时预测是完全正确的,代入上式计算误差为0,如果预测值h_{\theta }(x)不为1,代表模型没有100%的把握认为这是正向类的,此时误差会随着h_{\theta }(x)的减小而变大。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        当实际y=0时,如果预测值h_{\theta }(x)=0,此时预测是完全正确的,代入上式计算误差为0,如果预测值h_{\theta }(x)不为0,代表模型没有100%的把握认为这是负向类的,此时误差会随着h_{\theta }(x)的增大而变大。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        将这两种情况合在一起

        再求和取平均得到最终损失函数表达式

        采用矩阵的形式表达

2.6 梯度下降

 

        矩阵表达式为

        使用梯度下降

        矩阵表达式为

        \theta = \theta -\frac{\alpha }{m}X^{\top }(h-y)

3. 多分类逻辑回归

        多分类逻辑回归的实现依赖于二分类

        将其中一个类标记为正向类,然后将其他类都标记为负向类,得到一个模型h_{\theta }^{1}(x),接着选择另外一个类标记为正向类,然后将其他类都标记为负向类,又得到一个模型h_{\theta }^{2}(x),以此类推,我们可以得到一系列模型,假设有k个类

        h_{\theta }^{i}(x)=p(y=i|x;\theta ),i=(1,2,3,4……k)

        训练好这一系列模型后,对于一个输入x,让其在所有的分类器都得到一个输出,最后选择一个maxh_{\theta }(x)作为最终的输出

4. 逻辑回归的实例

        ex2data1数据集包含100行数据前两列是学生的两种考试的成绩,最后一列是他们被是否录取。需要根据学生的两种考试的成绩来预测他们被是否录取。

1.读取数据集

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('ex2data1.txt',names=['exam1','exam2','admitted'])
data.head()

# 根据admitted的值分类
plt.scatter(positive['exam1'],positive['exam2'],marker='o',label='Admitted')
plt.scatter(negative['exam1'],negative['exam2'],marker='x',label='Not Admitted')
plt.xlabel('Exam1 Score')
plt.ylabel('Exam2 Score')
plt.legend()
plt.show()

2.数据预处理

data.insert(0,'ones',1)
X = data.iloc[:,0:-1].values
y = data.iloc[:,-1].values
y = y.reshape(100,1)

3.定义Sigmoid函数

def sigmoid(z):
    return 1/(1+np.exp(-z))

4.定义损失函数

def lossFunction(X,y,theta):
    m = len(X)
    h = sigmoid(X@theta)
    return (1/m)*np.sum(-y.T@np.log(h)-(1-y).T@np.log(1-h))

5.模型训练

def train(X,y,alpha,epochs):
    loss_history = []
    theta = np.random.rand(3,1)
    for i in range(epochs):
        m = len(X)
        h = sigmoid(X@theta)
        theta = theta - (alpha/m)*X.T@(h-y)
        current_loss = lossFunction(X,y,theta)
        loss_history.append(current_loss) 
        if (i+1) % 100 == 0:
            print("epochs={},current_loss={}".format(i+1,current_loss))
     # 绘制损失函数图像
    plt.plot(range(1,epochs+1),loss_history)
    plt.xlabel('epochs')
    plt.ylabel('loss')
    plt.title('Loss Curve')
    plt.show()
    return theta

# 参数
alpha = 0.1
epochs = 1000
theta = train(X,y,alpha,epochs)

admitted = X[y.flatten() == 1]
not_admitted = X[y.flatten() == 0]
plt.scatter(admitted[:, 1], admitted[:, 2], label='Admitted', marker='o')
plt.scatter(not_admitted[:, 1], not_admitted[:, 2], label='Not Admitted', marker='x')
plt.xlabel('Exam 1 score')
plt.ylabel('Exam 2 score')

# 绘制决策边界
plot_x = np.array([min(X[:, 1]) - 2, max(X[:, 1]) + 2])
plot_y = (-1 / theta[2]) * (theta[1] * plot_x + theta[0])
plt.plot(plot_x, plot_y, label='Decision Boundary')
plt.legend()
plt.show()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/249136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Module ‘app‘: platform ‘android-33‘ not found.

目录 一、报错信息 二、解决方法 一、报错信息 Module app: platform android-33 not found. 检查你的应用程序的build.gradle文件中的targetSdkVersion和compileSdkVersion是否正确设置为已安装的Android SDK版本。 确保你的Android Studio已正确安装并配置了所需的Android …

香槟过了保质期还能喝吗?

香槟是起泡酒的高级代表&#xff0c;是浪漫和喜庆的化身&#xff0c;它浑身上下都散发着无穷的魅力。那么&#xff0c;这么精贵的葡萄酒有没有保质期&#xff0c;会不会变质呢&#xff1f;云仓酒庄的品牌雷盛红酒分享当然会。一瓶酒的生命离不开它的保存期限&#xff0c;酒的质…

力扣第一题-两数之和[简单]

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

这种形状的土堆,用DasViewer土方计算时该选择哪种模式?

答&#xff1a;推荐拟合平面&#xff1b;当堆料的整个边界可见并且基面是具有相同高度的坚硬表面、斜坡或平坦时&#xff0c;推荐该选项。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅…

命令执行 [BUUCTF 2018]Online Tool1

打开题目 我们代码审计一下 if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { $_SERVER[REMOTE_ADDR] $_SERVER[HTTP_X_FORWARDED_FOR]; } 如果存在xxf头且不为空&#xff0c;则将xxf头内容&#xff08;真实的客户端ip&#xff09;赋给ROMOTE_ADDR&#xff08;代理服务器传过…

11.jvm第三方工具使用实践

目录 概述GCEasy官网jvm内存占用情况关键性能指标堆内存与元空间优化 MAT安装MAT相关概念说明内存泄漏与内存溢出shallow heap及retained heapoutgoing references与incoming referencesDominator Tree GCViewerArthas下载安装与启动jdk8jdk 11jdk11自定义boot jarjdk17 常用命…

PHPRunner 10.91 Crack

PHPRunner是一款非常好用的网页制作工具&#xff0c;界面简洁美观&#xff0c;支持处理多个数据库连接并添加设计页面&#xff0c;页面中可以显示不同的不相关对象&#xff0c;如网格&#xff0c;单个记录&#xff0c;图表&#xff0c;报告等。PHPRunner支持多个操作系统&#…

OxLint 发布了,Eslint 何去何从?

由于最近的rust在前端领域的崛起&#xff0c;基于rust的前端生态链遭到rust底层重构&#xff0c;最近又爆出OxLint&#xff0c;是一款基于Rust的linter工具Oxlint在国外前端圈引起热烈讨论&#xff0c;很多大佬给出了高度评价&#xff1b;你或许不知道OxLint&#xff0c;相比ES…

【笔试强化】Day 3

一、单选 1. 正确答案&#xff1a;C子类继承父类&#xff0c;但是 name 被 private 修饰&#xff0c;不能访问 2. 正确答案&#xff1a;D父类构造了对象&#xff0c;但是子类没有使用 super调用&#xff0c;会报错 3. 正确答案&#xff1a;B构造方法可以重载 4. 正确答案&a…

【STM32独立看门狗(IWDG) 】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、看门狗是什么&#xff1f;1.简介2. 主要功能3.独立看门狗如何工作4.寄存器写保护5.看门狗 看门时间 二、使用步骤1.开启时钟2.初始化看门狗3.开启看门狗4.喂…

面试官:你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢

一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当前页面来与用户交互&#xff0c;这种方法避免了页面之间切换打断用户体验在单页应用中&#xff0c;所有必要…

mac 反编译apk记录

Mac/Linux 去release页下载&#xff0c;有中国下载地址能下载快些。 //也可以直接下载源码&#xff0c;中国下载慢&#xff0c;不推荐。 //git clone --depth1 https://github.com/tp7309/TTDeDroid.git ~/Documents/TTDeDroid//给脚本执行权限 chmod ax ~/Documents/TTDeDro…

AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)

一、前言 继OpenAI和Google的产品发布会之后&#xff0c;大模型的能力进化速度之快令人惊叹&#xff0c;然而&#xff0c;对于很多个人和企业而言&#xff0c;为了数据安全不得不考虑私有化部署方案&#xff0c;从GPT-4发布以来&#xff0c;国内外的大模型就拉开了很明显的差距…

函数图形渐近线分析

文章目录 曲线的渐近线水平和垂直渐近线斜渐近线斜渐近线公式推导简便方法确定斜渐近线(一次多项式化方法) 例 曲线的渐近线 渐近线综合了极限和函数图形的知识,尤其是斜渐近线 水平和垂直渐近线 若点 M M M沿曲线 y f ( x ) yf(x) yf(x)无限远离原点时,它于某条直线 L L L之…

vue中使用ailwind css

官网地址&#xff1a; 安装 - Tailwind CSS 中文网 推荐一个网站&#xff0c;里面可以查询所有的TailWindCSS的class样式&#xff1a; Tailwind CSS Cheat Sheet npm安装&#xff1a; 注意&#xff1a;1、这里要用npm&#xff0c;不要用cnpm。2、最好用install&#xff0c;不要…

目标检测图片截取目标分类图片

如果要训练一个分类模型却没有特定的分类数据集怎么办呢&#xff1f;可以换一种思路&#xff0c;将带有该目标的图片对所有想要的目标进行画标注框然后进行截图&#xff0c;就能得到特定的分类数据了。这么做的目的是&#xff1a;带有该目标的图片可能不会少&#xff0c;但是带…

Vue前端与后端放在一起的搭建方式

1.首先把后端项目搭建好 去到项目的存放位置 2.然后cmd黑窗口输入命令创建vue项目 3.创建成功后回到后端项目进行合并 3.1在File处选择Project Structure 3.2选择模块 3.3找到自己的vue项目 3.4疯狂next最后create 3.5选择Apply并确定OK&#xff0c;恭喜您创建成功了 二、启动…

Windows bat隐藏运行窗口的几种方案

文章目录 一、背景 二、测试数据 三、隐藏bat运行窗口方案 1. 使用VBScript脚本 2. 使用mshta调用js或vbs脚本 3. 将bat编译为exe程序 4. 使用任务计划程序 一、背景 有些程序在执行批处理脚本时&#xff0c;可能会看到dos窗口&#xff0c;或者看到窗口一闪而过。如果批处理脚本…

Jwt令牌过滤器的下发和拦截(创建在前面)

创建Jwt令牌的方法在前面&#xff1a; JWT令牌的作用和生成https://blog.csdn.net/m0_71149935/article/details/135002840?spm1001.2014.3001.5501令牌的下发&#xff1a; 说明&#xff1a; 只用在浏览器访问服务器的时候校验账户信息是否正确&#xff0c;正确就创建Jwt令…

docker学习(九、分布式存储亿级数据知识)

docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; 一、哈希取余分区二、一致性哈希算法分区三、哈希槽分区&#xff08;重点&#xff09; 内容整体是以Redis做分布式为例的~~~先出理论&#xff0c;后出实践docker操作 一、哈希取余分区 举个例子&#xff1a;目前…