基于Logistic回归实现二分类

目录

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 pltdef 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=100X=np.random.randn(n_samples,2)#featur2>2*feature1时 y为true,否则y为falsey=(X[:,1]>2*X[:,0].astype(int))print("y",y)new_=np.ones((100,1))train_X=np.hstack((new_,X))train_y=yprint("y",train_y)return train_X,train_y,X​

其散点图如图所示 :

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

 

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

    n_samples=100X=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=5x=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*3m,n = len(train_X[:,0]),len(train_X[0])#3x1 weight=np.ones((n,1))#迭代系数epoch=500for i in range(epoch):# mxn nx1 ->m*1y_=sigmoid(np.dot(train_X,weight))# m*1loss = train_y -y_a = 0.01# 3*1 weight = weight - np.dot(a*train_X.transpose(),loss)return weightdef 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*100x=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=100X=np.random.randn(n_samples,2)#featur2>2*feature1时 y为1,否则y为0y=(X[:,1]>2*X[:,0].astype(int))print("y",y)new_=np.ones((100,1))train_X=np.hstack((new_,X))train_y=yprint("y",train_y)return train_X,train_y,Xdef grad(train_X,train_y):# 100*3m,n = len(train_X[:,0]),len(train_X[0])#3x1 weight=np.ones((n,1))#迭代系数epoch=500for i in range(epoch):# mxn nx1 ->m*1y_=sigmoid(np.dot(train_X,weight))# m*1loss = train_y -y_a = 0.01# 3*1 weight = weight - np.dot(a*train_X.transpose(),loss)return weightdef 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*100x=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.mzph.cn/news/191881.shtml

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

相关文章

Spring | Spring的基本应用

目录: 1.什么是Spring?2.Spring框架的优点3.Spring的体系结构 (重点★★★) :3.1 Core Container (核心容器) ★★★Beans模块 (★★★) : BeanFactoryCore核心模块 (★★★) : IOCContext上下文模块 (★★★) : ApplicationContextContext-support模块 (★★★)SpE…

【Erlang进阶学习】4、进程与消息传递

在Erlang系统中,进程都是轻量级的,意味着创建进程只需要花费微不足道的时间和极少的内存。 1、进程间不共享内存,而是通过消息传递来通信。 2、消息从发送进程的栈上复制到接收进程的堆上。 3、由于多个进程并发地在独立的内存空间执行&#…

RocketMQ- 深入理解RocketMQ的消息模型

1、RocketMQ客户端基本流程 ​ RocketMQ基于Maven提供了客户端的核心依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.5</version> </dependency&…

PyQt6 QCheckBox复选框按钮控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计33条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

idea通过remote远程调试云服务器

引用了第三方的包&#xff0c;调试是看不到运行流程&#xff0c;于是想到了idea的remote方法 -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 写一个.sh文件并启动 nohup java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 ./demo.j…

思维模型 韦伯-费希纳定律

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。感觉与刺激成对数关系。 1 韦伯-费希纳定律的应用 1.1 韦伯-费希纳定律在工业设计中的应用 1 苹果公司的 iPhone 设计 苹果公司的 iPhone 设计是韦伯-费希纳定律在工业设计中的经典应用之…

剑指 Offer(第2版)面试题 15:二进制中1的个数

剑指 Offer&#xff08;第2版&#xff09;面试题 15&#xff1a;二进制中1的个数 剑指 Offer&#xff08;第2版&#xff09;面试题 15&#xff1a;二进制中1的个数解法1&#xff1a;位运算解法2&#xff1a;n & (n - 1)相关题目 剑指 Offer&#xff08;第2版&#xff09;面…

详解SpringAop开发过程中的坑

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

1-算法基础-编程基础

1.基本数据类型 char ch A; char s[] "hello";2.const定义常量 const int N 1e5 9;//const定义常量&#xff0c;后续不可被修改 int a[N];3.万能头文件 C11等可用 #include<bits/stdc.h> using namespace std;4.typedef typedef long long kk; kk a[20…

手敲MyLinkedList,简单了解其运行逻辑

1.LinkedList的介绍和结构 LinkedList的底层是双向链表结构&#xff0c;相对于之前的单向无头非循环链表来说&#xff0c;LinkedList最大的区别就是该链表可以增加了一条链接逻辑&#xff0c;可以从最后一个节点通过地址访问来到整个链表的头结点。 通过以下集合框架&#xff0…

计算机毕业设计 基于Web的铁路订票管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Fiddler抓包工具之高级工具栏中的重定向AutoResponder的用法

重定向AutoResponder的用法 关于Fiddler的AutoResponder重定向功能&#xff0c;主要是时进行会话的拦截&#xff0c;然后替换原始资源的功能。 它与手动修该reponse是一样的&#xff0c;只是更加方便了&#xff0c;可以创建相应的rules&#xff0c;适合批处理的重定向功能。 …

tar文件覆盖漏洞 CVE-2007-4559

文章目录 前言原理例题 [NSSRound#7 Team]新的博客方法一 手搓文件名方法二 python脚本 前言 做到[NSSRound#6 Team]check(Revenge)时发现是tar文件覆盖&#xff0c;但是对概念和执行过程理解不够深就光光记住脚本&#xff0c;所以在做本题[NSSRound#7 Team]新的博客时打算重新…

数据链路层之VLAN基本概念和基本原理

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)

刚学习&#xff0c;做个记录。 基于CH579M模块通过网线直连电脑进行数据收发(无需网络) 目录 一、工具1、CH579模块2、 网线3、电脑以及网络调试工具 二、操作步骤1、TCP/UDP等程序下载以及设置以太网IP2、网络断开3、检查以太网是否正常显示并稳定4、打开网络调试助手进行测试…

揭秘原型链:探索 JavaScript 面向对象编程的核心(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Android】Android Framework系列--Launcher3桌面图标加载流程

Launcher3桌面加载流程 Android Launcher3(简称Launcher&#xff09;启动后会加载桌面。基于Android12代码&#xff0c;分析一下桌面加载的流程。 一些相关的概念&#xff1a; WorkSpace&#xff1a;桌面。在桌面上可以添加快捷方式、Hoseat或Dock&#xff08;就是手机或者车…

项目中遇到的半导体公司

作为一个技术人&#xff0c;我并不是亲美&#xff0c;从技术的实事求是角度讲&#xff0c;不得不感叹欧美的半导体技术。他们的datasheet能学到的东西太多太多&#xff1b;我甚至佩服他们缜密的逻辑。从他们的文章中领悟我们技术到底有多low&#xff0c;没办法一个一个了解所有…

【重点】【双指针】11. 盛最多水的容器

题目 注意&#xff1a;二维接雨水&#xff0c;有墙的&#xff0c;有线的&#xff0c;着这个属于线的。 class Solution {public int maxArea(int[] height) {if (height.length < 2) {return 0;}int left 0, right height.length - 1, res 0;while (left < right) {…

avue-crud中时间范围选择默认应该是0点却变成了12点

文章目录 一、问题二、解决三、最后 一、问题 在avue-crud中时间范围选择&#xff0c;正常默认应该是0点&#xff0c;但是不知道怎么的了&#xff0c;选完之后就是一直是12点。具体问题如下动图所示&#xff1a; <template><avue-crud :option"option" /&g…