基于Logistic回归实现二分类

news2025/1/12 17:57:00

目录

Logistic回归公式推导:

Sigmoid函数:

Logistic回归如何实现分类:

优化的方法:

代码:

1.创建一个随机数据集,分类直线为y=2x:

为什么用np.hstack()增加一列1?

为什么返回值设成三个?

为什么预先设置分类直线? 因为全随机的点数太难以确定: 

2.梯度上升算法实现:

为什么使用train_y=np.array(boolean_int(y)).reshape(100,1)?

X[y==0,0],X[y==0,1]是什么东西?

 疑问:


Logistic回归公式推导:

(系列四) 线性分类5-逻辑回归(Logistic Regression)_哔哩哔哩_bilibili

回归:

存在一系列数据点,使用一条直线对这些点进行拟合,拟合的过程即为回归。

线性回归:

线性回归方程如下:我们输入数据点特征,取合适的w和b,使得预测值y^最接近y。但是我们不能通过方程预测非线性的函数,比如说e^{x}

y=wx+b

线性模型的衍生:

y=g(F(x))=g(wx+b)

通过这种方式,我们可以拟合非线性函数:   当g(x)取e^{x},得:y=e^{wx+b},\ln y = wx+b

怎么把回归和分类结合起来?

回归方程得到的y的范围是负无穷到正无穷,如何实现分类。以二分类为例,类别分别为0和1,我们需要使用函数将在负无穷到正无穷的数映射到0或1上。我们需要使用Sigmoid函数。

Sigmoid函数:

如图可以发现Sigmoid函数将输入z映射到(0,1)区间,我们可以设置阈值,大于阈值为类别1,小于阈值为类别0.

\sigma (z)=\frac{1}{1+e^{-z}}

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1/(1+np.exp(-x))
# np.linspace(start,end,num) 100个数,数在-10,10等距分布
x=np.linspace(-10,10,100)
y=sigmoid(x)
plt.plot(x,y)
plt.title("sigmoid")
plt.xlabel('x')
plt.ylabel('y=sigmoid(x)')
#添加网格
plt.grid(True)
plt.show()

Logistic回归如何实现分类:

输入数据点的特征,对每个特征乘以回归系数w,然后相加求和得到z,将z作为Sigmoid函数的输入,Sigmoid函数可以将输入映射在0-1区间内,我们将大于0.5部分设置为1类,小于0.5部分设置为0类实现二分类。为了实现更好的分类结果,我们需要对w进行优化。

z=wx+b=w_{1}x1+w_{2}x2+b

也可以把W和X看成向量,写成如下形式:

z=w^{\Gamma }x+b

优化w的方法:

梯度上升方法:a表示学习率,\bigtriangledown _{w}f(w)表示梯度。

 W = W+a*\bigtriangledown _{w}f(w)

损失函数:预测y和标签y的差

代码:

1.创建一个随机数据集,分类直线为y=2x:

为什么用np.hstack()增加一列1?

根据:z=wx+b=w_{1}x1+w_{2}x2+b

在设计权重时,w1,w2,b都需要通过梯度上升优化,希望可以统一进行梯度计算,但是b不与x相乘,想到:z=wx+b=w_{1}x1+w_{2}x2+b=w_{1}x1+w_{2}x2+w_{0}x0,

w_{0}=b,x_{0}=1

所以在train_x训练集添加一列1,作为x0.

为什么返回值设成三个?

train_X (100x3)包括方便计算的x0,X(100x2)可以用来绘制散点图,train_y表示标签。

​
def createtraindataset():

    np.random.seed(0)
    n_samples=100
    X=np.random.randn(n_samples,2)
    #featur2>2*feature1时 y为true,否则y为false
    y=(X[:,1]>2*X[:,0].astype(int))
    print("y",y)
    new_=np.ones((100,1))
    train_X=np.hstack((new_,X))
    train_y=y
    print("y",train_y)
    return train_X,train_y,X

​

其散点图如图所示 :

其打印出来的y是布尔值,结果如下:

 

为什么预先设置分类直线? 因为全随机的点数太难以确定: 

    n_samples=100
    X=np.random.randn(n_samples,2)
    y=np.random.randint(2,size=100)

 散点图:根本没办法进行划分。

2.梯度上升算法实现:

为什么使用train_y=np.array(boolean_int(y)).reshape(100,1)?

def boolean_int(y):
    return [1 if cell else 0 for cell in  y]

如上boolean_int 把布尔y转化为int型y,并reshape到(100,1)避免出现维度不匹配问题。

 y.shape为(100,)->train_y.shape(100,1)

X[y==0,0],X[y==0,1]是什么东西?

y是布尔值,numpy可以使用布尔值进行索引:

numpy 布尔索引的用法-CSDN博客

def test():
    y=[1,0,1,1]
    np.random.seed(0)
    n_samples=5
    x=np.random.randn(n_samples,2)
    y=np.random.randint(2,size=5)
    print("x=",x)
    print("y=",y)
    print("X[y==0,0]",x[y==0,0],"y==0时对应y数组索引为i,x得到第i行,第0列值")
test()

def grad(train_X,train_y):
    # 100*3
    m,n = len(train_X[:,0]),len(train_X[0])
    #3x1 
    weight=np.ones((n,1))
    #迭代系数
    epoch=500
    for i in range(epoch):
        # mxn nx1 ->m*1
        y_=sigmoid(np.dot(train_X,weight))
        # m*1
        loss = train_y -y_
        a = 0.01
        # 3*1 
        weight = weight - np.dot(a*train_X.transpose(),loss)
    return weight

def plot():
    train_X,y,X=createtraindataset()
    train_y=np.array(boolean_int(y)).reshape(100,1)

    weights=grad(train_X,train_y)
    # weights=weights.getA()
    #100 2*100
    x=np.linspace(-2.5,2.5,5)
    y_=(-weights[0]-weights[1]*x)/weights[2]

    plt.plot(x,y_)    
    plt.scatter(X[y==0,0],X[y==0,1],c='r',marker='x',label='Class 0')
    plt.scatter(X[y==1,0],X[y==1,1],c='b',marker='o',label='Class 1')

    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.legend()
    plt.title("Classification Dataset")
    plt.show()

全部代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
def sigmoid(x):
    return 1.0/(1+np.exp(-x))
# # np.linspace(start,end,num) 100个数,数在-10,10等距分布
# x=np.linspace(-10,10,100)
# y=sigmoid(x)
# plt.plot(x,y)
# plt.title("sigmoid")
# plt.xlabel('x')
# plt.ylabel('y=sigmoid(x)')
# #添加网格
# plt.grid(True)
# plt.show()
def boolean_int(y):
    return [1 if cell else 0 for cell in  y]
def createtraindataset():

    np.random.seed(0)
    n_samples=100
    X=np.random.randn(n_samples,2)
    #featur2>2*feature1时 y为1,否则y为0
    y=(X[:,1]>2*X[:,0].astype(int))
    print("y",y)
    new_=np.ones((100,1))
    train_X=np.hstack((new_,X))
    train_y=y
    print("y",train_y)
    return train_X,train_y,X

def grad(train_X,train_y):
    # 100*3
    m,n = len(train_X[:,0]),len(train_X[0])
    #3x1 
    weight=np.ones((n,1))
    #迭代系数
    epoch=500
    for i in range(epoch):
        # mxn nx1 ->m*1
        y_=sigmoid(np.dot(train_X,weight))
        # m*1
        loss = train_y -y_
        a = 0.01
        # 3*1 
        weight = weight - np.dot(a*train_X.transpose(),loss)
    return weight

def plot():
    train_X,y,X=createtraindataset()
    train_y=np.array(boolean_int(y)).reshape(100,1)

    weights=grad(train_X,train_y)
    # weights=weights.getA()
    #100 2*100
    x=np.linspace(-2.5,2.5,5)
    y_=(-weights[0]-weights[1]*x)/weights[2]

    plt.plot(x,y_)    
    plt.scatter(X[y==0,0],X[y==0,1],c='r',marker='x',label='Class 0')
    plt.scatter(X[y==1,0],X[y==1,1],c='b',marker='o',label='Class 1')

    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.legend()
    plt.title("Classification Dataset")
    plt.show()
plot()
# x=np.arange(-2,2,0.1)
# print(len(x))



 疑问:

1.为什么在Logistic回归实现二分类里使用sigmoid作为激活函数:

Logistic 回归(对数几率回归)直观理解 - 知乎 (zhihu.com)

假设正类概率为y,负类概率为1-y ,对第i个样本若为正则\frac{y}{1-y}>1y> 0.5,反之\frac{y}{1-y}\leq 1

因此只要对\frac{y}{1-y}进行建模,比较数值,就能对每个样本的类别进行判断。

在二维平面内对散点进行分类,可以用直线划分,直线上的点满足wx+b=0

为什么直线上点满足wx+b=0

w^T x+ b 的几何意义_y=wtx+b的法向量几何意义-CSDN博客

二维平面上公式:ax+by+c=0 点坐标为(x,y)

二分类散点图上点坐标为(x1,x2)表示不同特征

w和x是矩阵 wx+b=w1x1+w2x2+b。所以直线上点满足w1x1+w2x2+b=0

机器学习中的超平面wx+b=0?_平面方程wx+b=0-CSDN博客

具体建模如下:

y=\frac{1}{1+e^{-(wx+b)}}

\frac{1}{y}=1+e^{-(wx+b)}

\frac{1-y}{y}=e^{-(wx+b)}

ln(\frac{y}{1-y})=wx+b

2.为什么要用梯度上升算法?(待续)

3.x=np.linspace(-2.5,2.5,5)

y_=(-weights[0]-weights[1]*x)/weights[2]表示什么?

z=w^{\Gamma }x+b

ln(\frac{y}{1-y})=wx+b=w_{1}x1+w_{2}x2+b

w1,b,w2分别为权重为weights[0],weights[1],weights[2]。(x1,x2)表示特征点。x=np.linspace(-2.5,2.5,5)表示获得x1,y_是获得x2。

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

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

相关文章

协同过滤算法:个性化推荐的艺术与科学

目录 引言: 一、协同过滤算法的基本原理 二、协同过滤算法的应用领域 三、协同过滤算法的优缺点 四、协同过滤算法的未来发展方向 五、结论 引言: 在当今数字化时代,信息过载成为了一个普遍的问题。为了帮助人们更好地发现符合个性化需…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP (1)编译驱动程序 (2)编译测试APP 2.运行测试 一、Linux下…

分享81个节日PPT,总有一款适合您

分享81个节日PPT,总有一款适合您 81个节日PPT下载链接:https://pan.baidu.com/s/1V0feg5pZ8C1Szycy40CrUw?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局,给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

【编码魔法师系列_构建型1.3 】抽象工厂模式(Abstract Factory)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

pygame时序模块time

文章目录 简介时钟对象平抛运动 pygame系列:初步💎加载图像💎图像变换💎直线绘制 简介 之前在更新图形的时候,为了调控死循环的响应时间,用到了time.sleep。而实际上,我们并不需要额外导入其他…

最强Node js 后端框架学习看这一篇文章就够

距离上次认真花时间写作,似乎已经过了许久许久,前端讲了一个新框架 ,叫 Nest.js 下方是课件,有过一定开发经验可跟随视频学习 B站 地址 : https://www.bilibili.com/video/BV1Lg4y197u1/?vd_sourcead427ffaf8a5c8344…

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

【1】基于多设计模式下的同步异步日志系统-项目介绍

1. 项目介绍 本项⽬主要实现⼀个日志系统, 其主要支持以下功能: • 支持多级别日志消息 • 支持同步日志和异步日志 • 支持可靠写⼊日志到控制台、文件以及滚动文件中 • 支持多线程程序并发写日志 • 支持扩展不同的日志落地⽬标地 2. 开发环境 • CentOS 7 • vs…

Node版本管理nvm工具安装及使用问题

安装和配置 下载地址 nvm官方下载window环境直接下nvm-setup.zip解压安装即可。 安装效验以及镜像配置 在cmd中,输入nvm -v 会反馈相应的安装版本,即表示安装成功。配置镜像源: nvm node_mirror https://npm.taobao.org/mirrors/node/ nvm npm_mir…

GitHub上1.5K标星的QA和软件测试学习路线图

​最近在GitHub上发现一个项目,项目描述了作为QA工程师,进行软件测试技能提升时的,建议的软件测试学习顺序图​。 虽然2021年起就不再更新了,但是居然有1.5K的​星。 整个项目有两个部分​: ​1.QA和软件测试学习顺序…

线程池大小设置多少,比较合适?

设置线程数的核心点 压测!压测!再压测!实际对性能要求比较高的场景,压测是最佳的方式! 并发编程适用于什么场景? CPU 密集型 对于 CPU 密集型任务,希望最大限度地提高 CPU 利用率&#xff0c…

使用String.valueOf()的坑

说明:记录一次使用String.valueOf()的坑,以下是一段有问题的代码: String count String.valueOf(listData.get(0).get(0).get("count");if (StringUtils.isBlank(count) || "0".equals(count)) {result.setResult(page)…

LLM推理部署(五):AirLLM使用4G显存即可在70B大模型上进行推理

众所周知,大模型的训练和推理需要大量的GPU资源,70B参数的大模型需要130G的GPU显存来存储,需要两个A100(显存为100G)。 ​ 在推理过程中,整个输入序列也需要加载到内存中进行复杂的“注意力”计算&am…

【WinForm.NET开发】演示:创建一个图片查看器 Windows 窗体应用

本文演示将创建一个 Windows 窗体应用程序,用于加载和显示图片。 Visual Studio 集成设计环境 (IDE) 提供了创建应用所需的工具。 1、先决条件 若要完成本教程,必须具有 Visual Studio。 请访问Visual Studio 下载页获取免费版本。 2、创建 Windows …

C语言扫雷游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、扫雷游戏的分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析1.3文件结构设计 二、扫雷游戏的代码实现总结 前言 详细介绍扫雷游戏的思路和实现过程。 一…

基于Java SSM框架实现美好生活九宫格日志网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现美好生活九宫格日志网站系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人…

风险评估有什么用

风险评估就是量化测评某一事件或事物带来的影响或损失的可能程度。 为什么要做风险评估? 1.更准确地认识风险-系统地评估资产风险事件发生的概率大小和概率分布,及发生后损失的严重程度。帮助区分主要风险和次要风险。 2.保证规划的合理性和可行性-正确反映各风…

【开源】基于Vue.js的智慧社区业务综合平台

文末获取源码,项目编号: S 077 。 \color{red}{文末获取源码,项目编号:S077。} 文末获取源码,项目编号:S077。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预…