头歌——机器学习(逻辑回归)

news2024/11/5 17:24:22

文章目录

  • 逻辑回归简述
    • 代码
  • sklearn逻辑回归 - 手写数字识别
    • 代码
  • 逻辑回归算法详解
    • 似然与概率的区别
    • 逻辑回归算法的代码实现
    • 代码
  • 逻辑回归案例 - 癌细胞精准识别
    • 代码

逻辑回归简述

什么是逻辑回归
当一看到“回归”这两个字,可能会认为逻辑回归是一种解决回归问题的算法,然而逻辑回归是通过回归的思想来解决二分类问题的算法。

那么问题来了,回归的算法怎样解决分类问题呢?其实很简单,逻辑回归是将样本特征和样本所属类别的概率联系在一起,假设现在已经训练好了一个逻辑回归的模型为 f(x) ,模型的输出是样本 x 的标签是 1 的概率,则该模型可以表示,p =f(x) 。若得到了样本 x 属于标签 1 的概率后,很自然的就能想到当p>0.5 时 x 属于标签 1 ,否则属于标签 0 。所以就有
在这里插入图片描述
在这里插入图片描述
由于概率是 0 到 1 的实数,所以逻辑回归若只需要计算出样本所属标签的概率就是一种回归算法,若需要计算出样本所属标签,则就是一种二分类算法。

在这里插入图片描述
sigmoid 函数
sigmoid函数的公式为:
在这里插入图片描述
函数图像如下图所示:
在这里插入图片描述
从sigmoid函数的图像可以看出当 t 趋近于 −∞ 时函数值趋近于 0 ,当 t 趋近于 +∞ 时函数值趋近于 1 。可见sigmoid函数的值域是 (0,1) ,满足我们要将 (−∞,+∞) 的实数转换成 (0,1) 的概率值的需求。因此逻辑回归在预测时可以看成
在这里插入图片描述

代码

#encoding=utf8
import numpy as np

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

sklearn逻辑回归 - 手写数字识别

数据简介
本关使用的是手写数字数据集,该数据集有 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)

代码

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 ************#
    flat_train_image = train_image.reshape((-1,64))

    train_min = flat_train_image.min()
    train_max = flat_train_image.max()
    flat_train_image = (flat_train_image-train_min)/(train_max-train_min)

    #测试集变形
    flat_test_image = test_image.reshape((-1,64))

    test_min = flat_test_image.min()
    test_max = flat_test_image.max()
    flat_test_image = (flat_test_image - test_min) / (test_max - test_min)

    logreg = LogisticRegression(C=4.0)
    logreg.fit(flat_train_image,train_label)
    result = logreg.predict(flat_test_image)
    return result

    #************* End **************#

逻辑回归算法详解

逻辑回归的基本概念
线性回归模型通常是处理因变量是连续变量的问题,建立的模型描述是因变量的期望与自变量之间的线性关系。而在采用回归模型分析实际问题中,所研究的变量往往不全是区间变量而是顺序变量或属性变量,比如二项分布问题。通过分析年龄、性别、体质指数、平均血压、疾病指数等指标,判断一个人是否换糖尿病,Y=0表示未患病,Y=1表示患病,这里的响应变量是一个两点(0-1)分布变量,它就不能用h函数连续的值来预测因变量Y(只能取0或1)。此时就要用Logistic regression(逻辑回归)模型解决。逻辑回归可以用来回归,也可以用来分类,主要是二分类。

逻辑回归模型的求解即:给出一组m个样本数据,每个样本数据有n个特征,并且带有标记0或者1,代表属于哪一类,为了把输入的参数代入到预测函数后始终是一个0到1之间的数,这样我们可以把0,1看做两个类别。逻辑回归中引入sigmod函数在这里插入图片描述这个函数的函数值始终是在0到1之间。

逻辑回归算法
逻辑回归(Logistic Regression)虽然是名词是回归,但是实际上它是一种分类模型。假设输入值函数如下:
在这里插入图片描述
s(z)函数的定义域范围为( − ∞ , + ∞ ) ,sigmoid函数是一个(0,1)上的函数,从而可以将连续数据进行分类,这可能就是“回归”二字的含义吧。此外,我们也可以将s(z)函数看成概率p,假设p=0.8,此时概率值离1很近,可以将数据类别判别为1;假设p=0.2,概率值离0很近,可以将数据类别判别为0。

因此,假设我们已经训练好了一组权值W ,只要把我们需要预测的数据X代入到方程,输出的y值就是这个标签为0/1的概率,进而判断输入数据是属于哪个类别。下面我们分析使用梯度下降法来分析权值W的求解过程。

在这里插入图片描述

似然与概率的区别

似然 (likehood) 与概率 (probability) 在英语语境中是可以互换的。但是在统计学中,二者有截然不同的用法。

概率描述了已知参数时的随机变量的输出结果;似然则用来描述已知随机变量输出结果时,未知参数的可能取值。

例如,对于“一枚正反对称的硬币上抛十次”这种事件,我们可以问硬币落地时十次都是正面向上的“概率”是多少;而对于“一枚硬币上抛十次”,我们则可以问,这枚硬币正反面对称的“似然”程度是多少。

区别似然和概率的直接方法为,"谁谁谁的概率"中谁谁谁只能是事件,也就是,事件(发生)的概率是多少;而"谁谁谁的似然"中的谁谁谁只能是参数,比如说,参数等于某个值时的似然是多少。

似然概率正好与这个过程相反,我们关注的量不再是事件的发生概率,而是我们希望知道参数取了某个值时,有多接近实际。

逻辑回归算法的代码实现

从上述可知,逻辑回归可用于分类任务,下面我们将使用该算法完成一个基本的逻辑回归问题,我们将使用sklearn实现该算法与应用过程。sklearn是机器学习中一个常用的python第三方模块,函数sklearn.linear_model.LogisticRegression封装了逻辑回归类,可用于逻辑回归任务实现,其过程包括:

库函数导入
数据导入和划分
模型调用
模型训练
数据预测
下面给出关键过程:

from sklearn import datasets
from sklearn.datasets import load_iris 
import numpy as np
import math
from sklearn.model_selection import train_test_split
from collections import Counter
from sklearn.linear_model import LogisticRegression   #导入逻辑回归模型
# 数据导入
iris = datasets.load_iris()
X= iris['data']
y = iris['target']
X = X[y!=2] #  筛选数据,只选择标签为0和1
y=y[y!=2]
# 数据划分,使用默认参数
# 模型调用
logr = LogisticRegression()
# 进行训练
# 行预测
X_test_pred = logr.predict(X_test)
# 准确度计算
acc = logr.score(X_test,y_test)

代码

from sklearn import datasets
from sklearn.datasets import load_iris 
import numpy as np
import math
from sklearn.model_selection import train_test_split
from collections import Counter
from sklearn.linear_model import LogisticRegression   #导入逻辑回归模型

#########Begin########
# 导入数据
iris = datasets.load_iris()
X= iris['data']
y = iris['target']
X = X[y!=2] #  筛选数据,只选择标签为0和1
y=y[y!=2]
# 数据划分
X_train,X_test,y_train,y_test = train_test_split(X,y)

# 模型调用
logr = LogisticRegression()

# 模型训练
logr.fit(X_train,y_train)
# 数据预测
X_test_pred = logr.predict(X_test)
print("准确度:",logr.score(X_test,y_test))
# 结果打印


########End#########

逻辑回归案例 - 癌细胞精准识别

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

构建逻辑回归模型
由数据集可以知道,每一个样本有 30 个特征和 1 个标签,而我们要做的事就是通过这 30 个特征来分析细胞是良性还是恶性(其中标签 y=0 表示是良性, y=1 表示是恶性)。逻辑回归算法正好是一个二分类模型,我们可以构建一个逻辑回归模型,来对癌细胞进行识别。模型如下:
在这里插入图片描述
我们将一个样本输入模型,如果预测值大于等于 0.5 则判定为 1 类别,如果小于 0.5 则判定为 0 类别。

训练逻辑回归模型
我们已经知道如何构建一个逻辑回归模型,但是如何得到一个能正确对癌细胞进行识别的模型呢?通常,我们先将数据输入到模型,从而得到一个预测值,再将预测值与真实值结合,得到一个损失函数,最后用梯度下降的方法来优化损失函数,从而不断的更新模型的参数 θ ,最后得到一个能够正确对良性细胞和癌细胞进行分类的模型。

在这里插入图片描述
使用梯度下降算法首先要知道损失函数对参数的梯度,即损失函数对每个参数的偏导,求解步骤如下:
在这里插入图片描述

代码

# -*- coding: utf-8 -*-

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_iter=0

    while i_iter < n_iters:
        gradient = (sigmoid(x.dot(theta))-y).dot(x)

        theta = theta-eta*gradient
        i_iter = i_iter+1
    return theta
    #********** End **********#

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高等数学】3-2多元函数积分学

1. 二重积分 可以想象你有一块不规则的平面薄板,它在一个平面区域上。二重积分就是用来求这个薄板的质量(假设薄板的面密度函数是)。 把区域划分成许多非常小的小方块(类似于把一块地划分成很多小格子),在每个小方块上,密度近似看成是一个常数,然后把每个小方块的质量加…

需求管理流程与工具:国内外10款综合评测

本文中&#xff0c;分享了10款需求管理工具&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.纷享销客&#xff1b;4.Teambition&#xff1b;5.Jira&#xff1b;6.Trello&#xff1b;7.Figma&#xff1b;8.万维需求管理&#xff1b;9.ClickUp&#xff1b;10.项目管理…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

嵌入式之C语言(基础篇)

首先&#xff0c;我们要知道什么是程序。程序&#xff1a;为了让计算机执行某操作或解决某个问题而编写的一系列有序指令的集合。 一、计算机语言简史 第一代是机器语言&#xff1a;时间实在1946年&#xff0c;第一台计算机ENIAC诞生&#xff0c;用的是穿孔卡片做的&#xff0c…

搜索引擎算法更新对网站优化的影响与应对策略

内容概要 随着互联网的不断发展&#xff0c;搜索引擎算法也在不断地进行更新和优化。了解这些算法更新的背景与意义&#xff0c;对于网站管理者和优化人员而言&#xff0c;具有重要的指导意义。不仅因为算法更新可能影响到网站的排名&#xff0c;还因为这些变化也可能为网站带…

牛客周赛65(C++实现)

比赛链接&#xff1a;牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 文章目录 1.超市1.1 题目描述1.2 思路1.3 代码 2. 雨幕2.1 题目描述2.2 思路2.3 代码 3.闺蜜3.1 题目描述3.2 思路3.3 代码 4. 医生4.1 题目描述4.2 思路4.3 代码 1.超市 1.1 题目描述 …

【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信

前言 故事背景 简单说下背景&#xff0c;项目中需要用 ProtoBuf 协议转换请求参数&#xff0c;并通过 WebSocket 进行双向通信。重点&#xff01;一个是 web端&#xff08;Vue3 TS&#xff09;&#xff0c;一个是微信小程序端&#xff08;原生 JS&#xff09;。 剧情发展 …

练习LabVIEW第三十四题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十四题&#xff1a; 在一个波形表中显示三条随机数组成的曲线&#xff0c;分别用红&#xff0c;绿&#xff0c;蓝三种…

rnn/lstm

tip&#xff1a;本人比较小白&#xff0c;看到july大佬的文章受益匪浅&#xff0c;现在其文章基础上加上自己的归纳、理解&#xff0c;以及gpt的答疑&#xff0c;如果有侵权会删。 july大佬文章来源&#xff1a;如何从RNN起步&#xff0c;一步一步通俗理解LSTM_rnn lstm-CSDN博…

Python | Leetcode Python题解之第528题按权重随机选择

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, w: List[int]):self.pre list(accumulate(w))self.total sum(w)def pickIndex(self) -> int:x random.randint(1, self.total)return bisect_left(self.pre, x)

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域&#xff0c;数据抓取是一项非常实用的技术。通过数据抓取&#xff0c;我们可以从网页上获取所需的信息&#xff0c;并将其转化为结构化数据&#xff0c;以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…

SQL之排名窗口函数RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表&#xff0c;表中包含id、uname、age、score 四个字段&#xff0c;如下所示&#xff1a; 该表的数据如下所示&#xff1a; 一、ROW_NUMBER() 1、概念 ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数&#xff0c;编号从 1 开始。‌ 该函数按照指…

Verilog HDL基础

模块的基本结构 module 模块名(端口列表); // 模块声明// 端口定义input [数据类型] [位宽] 输入端口列表; output [数据类型] [位宽] 输出端口列表; inout [数据类型] [位宽] 双向端口列表; // 数据类型定义wire [位宽] 线网名,线网名&#xff0c;…; …

C语言实验 选择结构

时间&#xff1a;2024.11.2 一、实验 实验一、7-1 计算分段函数[2] #include<stdio.h> #include<math.h> int main(){float x,r;scanf("%f",&x);if(x<0){rpow((x1.0),2)2*x1.0/x;}else rpow(x,0.5);printf("f(%.2f) %.2f",x,r);retu…

六、Go语言快速入门之数组和切片

文章目录 数组和切片数组:one: 数组初始化:two: 数组的遍历:three: 多维数组:four: 将数组传递给函数 切片(Slice):one: 切片的初始化:star: new和make区别 :two: 切片的使用:three: 将切片传递给函数:four: 多维切片:four: Bytes包:four: 切片和垃圾回收 &#x1f4c5; 2024年…

【Sublime Text】格式化Json和XML

无package control解决方案 删除文件中的package control这一行并保存 下载 下载中

vue常用的修饰符有哪些

1、修饰符是什么 在Vue 中&#xff0c;修饰符处理了许多 DOM 事件的细节&#xff0c;让我们不再需要花大量的时间去处理这些烦恼的事情&#xff0c;而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种 汇总修饰符说明表单lazy光标离开标签的时候&#xff0c;才会…

微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)

微服务设计模式 - 发布订阅模式&#xff08;Publisher Subscriber Pattern&#xff09; 定义 发布-订阅模式&#xff08;Publisher-Subscriber Pattern&#xff09;是一种常见的设计模式&#xff0c;被广泛用于云计算和分布式系统中&#xff0c;以实现松散耦合的组件间通信。发…

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN)&#xff1a; 创建一个新文件&#xff0c;用于编写新的代码。 Add New File to Project...&#xff1a; 将新文件添加到当前项目中。 Open... (CtrlO)&#xff1a; 打开现有文件。 Close (CtrlE)&#xff1a; 关闭当前打开的文件。 …

Pytorch猴痘病识别

Pytorch猴痘病识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#xff1a;jupyte…