逻辑回归

目录

第1关:逻辑回归核心思想

相关知识

什么是逻辑回归

编程要求

代码文件

第2关:逻辑回归的损失函数

相关知识

为什么需要损失函数

逻辑回归的损失函数

题目答案

第3关:梯度下降

相关知识

什么是梯度

梯度下降算法原理

编程要求

代码文件

第4关:动手实现逻辑回归 - 癌细胞精准识别

相关知识

数据集介绍

构建逻辑回归模型

训练逻辑回归模型

编程要求

代码文件

第5关:手写数字识别

相关知识

数据简介

LogisticRegression

编程要求

代码文件


第1关:逻辑回归核心思想

相关知识

什么是逻辑回归

逻辑回归是通过回归的思想来解决二分类问题的算法。逻辑回归是将样本特征和样本所属类别的概率联系在一起。

假设现在已经训练好了一个逻辑回归的模型为 f(x) ,模型的输出是样本 x 的标签是 1 的概率,则该模型可以表示, p^​=f(x) 。若得到了样本 x 属于标签 1 的概率后,很自然的就能想到当 p^​>0.5 时 x 属于标签 1 ,否则属于标签 0 。

(其中 y^​ 为样本 x 根据模型预测出的标签结果,标签 0 和标签 1 所代表的含义是根据业务决定的,比如在癌细胞识别中可以使 0 代表良性肿瘤, 1 代表恶性肿瘤)。

由于概率是 0 到 1 的实数,所以逻辑回归若只需要计算出样本所属标签的概率,就是一种回归算法,若需要计算出样本所属标签,则就是一种二分类算法

逻辑回归中样本所属标签的概率计算和线性回归有关系,线性回归无非就是训练出一组参数 WT 和 b 来拟合样本数据,线性回归的输出为 y^​=WTx+b 。不过 y^​ 的值域是 (−∞,+∞) ,如果能够将值域为 (−∞,+∞) 的实数转换成 (0,1) 的概率值的话问题就解决了。要解决这个问题很自然地就能想到将线性回归的输出作为输入,输入到另一个函数中,这个函数能够进行转换工作,假设函数为 σ ,转换后的概率为 p^​ ,逻辑回归在预测时可以看成p^​=σ(WTx+b) 。 σ 其实就是sigmoid函数。

sigmoid函数的公式为:

函数图像如下图所示:

sigmoid函数的图像可以看出当 t 趋近于 −∞ 时函数值趋近于 0 ,当 t 趋近于 +∞ 时函数值趋近于 1 。可见sigmoid函数的值域是 (0,1) ,满足我们要将 (−∞,+∞) 的实数转换成 (0,1) 的概率值的需求。因此逻辑回归在预测时可以看成

编程要求

补充 Python 代码,实现sigmoid函数。底层代码会调用您实现的sigmoid函数来进行测试。(提示: numpy.exp()函数可以实现 e 的幂运算)

代码文件

#encoding=utf8
import numpy as np

def sigmoid(t):
    '''
    完成sigmoid函数计算
    :param t: 负无穷到正无穷的实数
    :return: 转换后的概率值
    :可以考虑使用np.exp()函数
    '''
    #********** Begin **********#
    ans = 1/(1+np.exp(-t))
    return ans
    #********** End **********#

第2关:逻辑回归的损失函数

相关知识

为什么需要损失函数

训练逻辑回归模型的过程其实与线性回归一样,就是去寻找合适的 WT 和 b 使得模型的预测结果与真实结果尽可能一致。所以就需要一个函数能够衡量模型拟合程度的好坏,也就是说当模型拟合误差越大的时候,函数值应该比较大,反之应该比较小,这就是损失函数。

逻辑回归的损失函数

逻辑回归计算出的样本所属类别的概率 p^​=σ(WTx+b) ,样本所属列表的判定条件为

很明显,在预测样本属于哪个类别时取决于算出来的p^​。当然逻辑回归的损失函数不仅仅与 p^​ 有关,它还与真实类别有关

假设有情况A:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.7 (也就是说类别 0 的概率为 0.3 );情况B:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.6 (也就是说类别 0 的概率为 0.4 );很显然,情况A的误差更大!因为情况A中模型认为样本是类别 0 的可能性只有 30% ,而B有 40% 。

假设有情况A:现在有个样本的真实类别是 0 ,但是模型预测出来该样本是类别 1 的概率是 0.7 (也就是说类别 0 的概率为 0.3 );情况B:现在有个样本的真实类别是 1 ,但是模型预测出来该样本是类别 1 的概率是 0.3 (也就是说类别 0 的概率为 0.7 );AB两种情况的误差一样大!

所以逻辑回归的损失函数如下,其中 cost 表示损失函数的值, y 表示样本的真实类别:

当样本的真实类别为 1 时,式子就变成了 cost=−log(p^​)。此时函数图像如下:

从图像能看出当样本的真实类别为1的前提下,p^​ 越大,损失函数值就越小。因为 p^​ 越大就越说明模型越认为该样本的类别为 1 。

当样本的真实类别为 0 时,式子就变成了 cost=−log(1−p^​) 。此时函数图像如下:

从图像能看出当样本的真实类别为 0 的前提下,hatp 越大,损失函数值就越大。因为 p^​ 越大就越说明模型越认为该样本的类别为 1 。

cost=−ylog(p^​)−(1−y)log(1−p^​) 是一个样本的损失计算公式,但是在一般情况下需要计算的是 m 条样本数据的平均损失值,所以损失函数的最终形态如下,其中 m 表示数据集中样本的数量, i 表示数据集中第 i 个样本:

逻辑回归的训练流程就是寻找一组合适的 WT 和 b ,使得损失值最小。找到这组参数后模型就确定下来了。

题目答案

第3关:梯度下降

相关知识

什么是梯度

梯度:梯度的本意是一个向量,由函数对每个参数的偏导组成,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大

梯度下降算法原理

算法思想:梯度下降是一种非常通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代地调整参数从而使损失函数最小化

假设你迷失在山上的迷雾中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量 θ 相关的损失函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为 0 ,达到最小值。

梯度下降公式如下:

对应到每个权重公式为:

其中 η 为学习率,是 0 到 1 之间的值,是个超参数,需要我们自己来确定大小。

算法原理: 在传统机器学习中,损失函数通常为凸函数。

假设此时只有一个参数,则损失函数对参数的梯度即损失函数对参数的导数。如果刚开始参数初始在最优解的左边,

这个时候损失函数对参数的导数是小于 0 的,而学习率是一个 0 到 1 之间的数,此时按照公式更新参数,初始的参数减去一个小于 0 的数是变大,也就是在坐标轴上往右走,即朝着最优解的方向走。同样的,如果参数初始在最优解的右边,

此时按照公式更新,参数将会朝左走,即最优解的方向。所以,不管刚开始参数初始在何位置,按着梯度下降公式不断更新,参数都会朝着最优解的方向走。

梯度下降算法流程:

  1. 随机初始参数;
  2. 确定学习率;
  3. 求出损失函数对参数梯度;
  4. 按照公式更新参数;
  5. 重复 3 、 4 直到满足终止条件(如:损失函数或参数更新变化值小于某个阈值,或者训练次数达到设定阈值)。

编程要求

使用 Python 实现梯度下降算法,并损失函数最小值时对应的参数thetatheta会返回给外部代码,由外部代码来判断theta是否正确。损失函数为:loss=2∗(θ−3) ,最优参数为:3.0 ,答案跟最优参数的误差低于0.0001才能通关。

代码文件

import numpy as np
import warnings
warnings.filterwarnings("ignore")

def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8):
    '''
    梯度下降
    :param initial_theta: 参数初始值,类型为float
    :param eta: 学习率,类型为float
    :param n_iters: 训练轮数,类型为int
    :param epslion: 容忍误差范围,类型为float
    :return: 训练后得到的参数
    '''
    #   请在此添加实现代码   #
    #********** Begin *********#
    theta = initial_theta
    i_iters = 0
    while i_iters < n_iters:
        loss = 2*(theta-3)
        theta0 = theta
        theta = theta - eta*loss #权重
        if(abs(theta-theta0) < epslion):
            break
        i_iters += 1
    return theta
    #********** End **********#

第4关:动手实现逻辑回归 - 癌细胞精准识别

相关知识

数据集介绍

乳腺癌数据集,其实例数量是 569 ,实例中包括诊断类和属性,帮助预测的属性一共 30 个,各属性包括为 radius 半径(从中心到边缘上点的距离的平均值), texture 纹理(灰度值的标准偏差)等等,类包括: WDBC-Malignant 恶性和 WDBC-Benign 良性。用数据集的 80% 作为训练集数据集的 20% 作为测试集,训练集和测试集中都包括特征和类别。其中特征和类别均为数值类型,类别中 0 代表良性, 1 代表恶性。

构建逻辑回归模型

由数据集可以知道,每一个样本有 30 个特征和 1 个标签,而我们要做的事就是通过这 30 个特征来分析细胞是良性还是恶性(其中标签 y=0 表示是良性, y=1 表示是恶性)。逻辑回归算法正好是一个二分类模型,我们可以构建一个逻辑回归模型,来对癌细胞进行识别。模型如下:

其中 xi​表示第 i 个特征,wi​表示第 i 个特征对应的权重,b表示偏置。 为了方便,我们稍微将模型进行变换,其中x0​等于 1 :

将一个样本输入模型,如果预测值大于等于 0.5 则判定为 1 类别,如果小于 0.5 则判定为 0 类别。

训练逻辑回归模型

我们已经知道如何构建一个逻辑回归模型,但是如何得到一个能正确对癌细胞进行识别的模型呢?

先将数据输入到模型,从而得到一个预测值,再将预测值与真实值结合,得到一个损失函数,最后用梯度下降的方法来优化损失函数,从而不断的更新模型的参数 θ ,最后得到一个能够正确对良性细胞和癌细胞进行分类的模型

要使用梯度下降算法首先要知道损失函数对参数的梯度,即损失函数对每个参数的偏导,如下:

其中a为预测值,y为真实值。 在逻辑回归中的梯度下降公式如下:

编程要求

构建一个逻辑回归模型,并对其进行训练,最后将得到的逻辑回归模型对癌细胞进行识别。只需返回预测结果即可,预测正确率高于 95% 视为过关。构建模型时 x0​ 是添加在数据的左边,请根据提示构建模型,且返回theta形状为(n,)n为特征个数。   

代码文件

import numpy as np
import warnings
warnings.filterwarnings("ignore")

def sigmoid(x):
    '''
    sigmoid函数
    :param x: 转换前的输入
    :return: 转换后的概率
    '''
    return 1/(1+np.exp(-x))


def fit(x,y,eta=1e-3,n_iters=10000):
    '''
    训练逻辑回归模型
    :param x: 训练集特征数据,类型为ndarray
    :param y: 训练集标签,类型为ndarray
    :param eta: 学习率,类型为float
    :param n_iters: 训练轮数,类型为int
    :return: 模型参数,类型为ndarray
    '''
    #   请在此添加实现代码   #
    #********** Begin *********#
    theta = np.zeros(x.shape[1])
    i_iters = 0
    while i_iters < n_iters:
        loss = (sigmoid(x.dot(theta))-y).dot(x)
        theta = theta - eta*loss
        i_iters += 1
    return theta
    #********** End **********#

第5关:手写数字识别

相关知识

数据简介

本关使用的是手写数字数据集,该数据集有 1797 个样本,每个样本包括 8*8 像素(实际上是一条样本有 64 个特征,每个像素看成是一个特征,每个特征都是float类型的数值)的图像和一个 [0, 9] 整数的标签。比如下图的标签是 2 :

sklearn为该数据集提供了接口,若想使用该数据集,代码如下:

from sklearn import datasets
import matplotlib.pyplot as plt

#加载数据集
digits = datasets.load_digits()
#X表示图像数据,y表示标签
X = digits.data
y = digits.target

#将第233张手写数字可视化
plt.imshow(digits.images[232])

LogisticRegression

LogisticRegression中默认实现了 OVR ,因此LogisticRegression可以实现多分类LogisticRegression的构造函数中有三个常用的参数可以设置:

  • solver{'newton-cg' , 'lbfgs', 'liblinear', 'sag', 'saga'}, 分别为几种优化算法。默认为liblinear

  • C:正则化系数的倒数,默认为 1.0 ,越小代表正则化越强;

  • max_iter:最大训练轮数,默认为 100 。

sklearn中其他分类器一样,LogisticRegression类中的fit函数用于训练模型,fit函数有两个向量输入:

  • X:大小为 [样本数量,特征数量] 的ndarray,存放训练样本;

  • Y:值为整型,大小为 [样本数量] 的ndarray,存放训练样本的分类标签。

LogisticRegression类中的predict函数用于预测,返回预测标签,predict函数有一个向量输入:

  • X:大小为[样本数量,特征数量]的ndarray,存放预测样本。

LogisticRegression的使用代码如下:

logreg = LogisticRegression(solver='lbfgs',max_iter =10,C=10)
logreg.fit(X_train, Y_train)
result = logreg.predict(X_test)

编程要求

填写digit_predict(train_sample, train_label, test_sample)函数完成手写数字识别任务。

  • train_image:训练集图像,类型为ndarrayshape=[-1, 8, 8]

  • train_label:训练集标签,类型为ndarray

  • test_image:测试集图像,类型为ndarray

只需返回预测结果即可,程序内部会检测您的代码,预测正确率高于 0.97 视为过关。

代码文件

from sklearn.linear_model import LogisticRegression

def digit_predict(train_image, train_label, test_image):
    '''
    实现功能:训练模型并输出预测结果
    :param train_sample: 包含多条训练样本的样本集,类型为ndarray,shape为[-1, 8, 8]
    :param train_label: 包含多条训练样本标签的标签集,类型为ndarray
    :param test_sample: 包含多条测试样本的测试集,类型为ndarry
    :return: test_sample对应的预测标签
    '''

    #************* Begin ************#
    #数据预处理:使用Min-max标准化
    trainimage = train_image.reshape((-1,64))
    train_min = trainimage.min()
    train_max = trainimage.max()
    trainimage = (trainimage-train_min)/(train_max-train_min)
    testimage = test_image.reshape((-1,64))
    test_min = testimage.min()
    test_max = testimage.max()
    testimage = (testimage-test_min)/(test_max-test_min)
    #训练预测
    logreg = LogisticRegression(C=10)
    logreg.fit(trainimage,train_label)
    result = logreg.predict(testimage)
    return result
    #************* End **************#

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

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

相关文章

电线电缆、漆包线工厂开源MES/生产管理系统/云MES

万界星空科技专业的漆包线MES系统功能介绍&#xff1a; 从原材料出入库-拉丝机等设备管理-漆包线称重打印系统自动入库&#xff08;支持多台秤同时称重&#xff09;-建立销售报价、销售订单-生产订单-支持扫码出库及自动拣货出库-应收应付账款-对接各种其他系统及财务系统。 …

(免费领源码)java#springboot#mysql流浪动物救助系统78174-计算机毕业设计项目选题推荐

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

NX二次开发UF_CURVE_add_string_to_ocf_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_add_string_to_ocf_data Defined in: uf_curve.h int UF_CURVE_add_string_to_ocf_data(tag_t string_tag, int offset_direction, int num_offsets, UF_CURVE_ocf_values_…

芯片的测试方法

半导体的生产流程包括晶圆制造和封装测试&#xff0c;在这两个环节中分别需要完成晶圆检测(CP, Circuit Probing)和成品测试(FT, Final Test)。无论哪个环节&#xff0c;要测试芯片的各项功能指标均须完成两个步骤&#xff1a;一是将芯片的引脚与测试机的功能模块连接起来&…

一些好用的前端小插件(转自知乎)

一些好用的前端小插件&#xff08;2&#xff09; 1. cropper.js Cropper.js 2.0 是一系列用于图像裁剪的 Web 组件。 官网地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得、…

点击按钮,按钮的文字变为倒计时,的小技巧(适用于获取验证码)

看效果图&#xff1a; 代码 <a-buttonclick"getSms":disabled"myState.smsSendFlag"v-text"(!myState.smsSendFlag && 获取验证码) || ${myState.time} s" ></a-button>data(){return {myState: {smsSendFlag: false,tim…

【【Linux 常用命令学习 之 一 】】

Linux 常用命令学习 之 一 打开终端之后的 我们会了解 所使用的 字符串含义 其中前面的 zhuxushuai 是 当前的用户名字 接下来的 zhuxushuai-virtual-machine 是 机器名字 最后的符号 $表示 当前是普通用户 输入指令 ls 是打印出当前所在目录中所有文件和文件夹 shell 操…

BUUCTF [WUSTCTF2020]find_me 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台&#xff1a;https://ctfgame.w-ais.cn/ 密文&#xff1a; 下载附件&#xff0c;得到一个.jpg图片。 解题思路&#xff1a; 1、得到一张图…

vue3-组件传参及计算属性

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组件传参及计算属性 目录 vue3中的组件传参 1、父传子 2、子传父 toRef 与 toRefs vue3中…

【LeetCode刷题笔记】DFSBFS(三)

图的基础知识 邻接矩阵是一个二维表,其中横纵坐标交叉的格子值为 1 的表示这两个顶点是连通的,否则是不连通的。

反爬虫机制与反爬虫技术(二)

反爬虫机制与反爬虫技术二 1、动态页面处理与验证码识别概述2、反爬虫案例:页面登录与滑块验证码处理2.1、用例简介2.2、库(模块)简介2.3、网页分析2.4、Selenium准备操作2.5、页面登录2.6、模糊移动滑块测试3、滑块验证码处理:精确移动滑块3.1、精确移动滑块的原理3.2、滑…

NX二次开发UF_CSYS_ask_wcs 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

Matlab三角剖分插值问题分析

目录 前言 一、问题引入 二、一个例子 1.生成散点图 2.对数据进行剖分 3.点法式分析 三、最后结果 前言 上一篇文章感觉对三角剖分问题没有说清楚&#xff0c;这次专门对三角剖分问题再仔细说说。 一、问题引入 实际上这个问题是用来解决二维曲面插值问题的。 二维插值问题&…

python tkinter使用(五)

python tkinter使用(五) 本篇文章讲述tkinter 中treeview的使用 Treeview是一个多列列表框&#xff0c;可以显示层次数据。 #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/11/23 下午8:28 .Email:Describe: treeview 使用 "&quo…

YB4051系列设备是高度集成的 Li-lon 和 Li-Pol 线性充电器,针对便携式应用的小容量电池。

YB4051H 300mA 单电池锂离子电池充电器0.1 mA 终端&#xff0c;45nA 电池漏电流 概述&#xff1a; YB4051系列设备是高度集成的 Li-lon 和 Li-Pol 线性充电器&#xff0c;针对便携式应用的小容量电池。它是一个完整的恒流/恒压线性充电器。不需要外部感应电阻&#xff0c;由于…

〖大前端 - 基础入门三大核心之JS篇㊷〗- DOM事件对象及它的属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

vulnhub6

靶机地址&#xff1a;https://download.vulnhub.com/evilbox/EvilBox---One.ova 准备工作 可以先安装 kali 的字典: sudo apt install seclists ​ 或者直接输入 seclists​&#xff0c;系统会问你是否安装&#xff0c;输入 y 即可自动安装 733 x 3751414 x 723 ​ 默认路…

opencv 常用操作指南

1.通道交换 读取图像&#xff0c;然后将RGB通道替换成BGR通道&#xff0c;需要注意的是&#xff0c;opencv读取的图像默认是BGR。cv2.cvtColor函数可以参考Color Space Conversions img cv2.imread(imori.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) cv2.imwrite(answe…

HarmonyOS(五)—— 认识页面和自定义组件生命周期

前言 在前面我们通过如何创建自定义组件一文知道了如何如何自定义组件以及自定义组件的相关注意事项&#xff0c;接下来我们认识一下页面和自定义组件生命周期。 自定义组件和页面的关系 在开始之前&#xff0c;我们先明确自定义组件和页面的关系 自定义组件&#xff1a;Co…

聚观早报 |一加12正式开启预订;OPPO Reno11系列卖点

【聚观365】11月24日消息 一加12正式开启预订 OPPO Reno11系列卖点 小鹏第三季度营收财报 Claude 2.1 聊天机器人公布 现代汽车将与伦敦大学学院合作 一加12正式开启预订 全新的一加12系列公开亮相已有一段时间&#xff0c;不久前一加官方宣布&#xff0c;该机将于12月4日…