逻辑回归 使用Numpy实现逻辑回归

使用Numpy实现逻辑回归

sigmoid 函数

g ( z ) = 1 ( 1 + e − z ) g(z)=\frac{1}{(1+e^{−z} )} g(z)=(1+ez)1

# sigmoid 函数
def sigmod(z):
    return 1/(1+np.exp(-z))

线性计算与梯度下降

J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) l o g ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] J(θ)=-\frac{1}{m}[∑_{i=1}^m y^{(i)} log⁡(h_θ(x^{(i)} ))+(1−y^{(i)}) log(1−h_θ (x^{(i)}))] J(θ)=m1[i=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]

对于代价函数,采用梯度下降算法求θ的最小值:
θ j ≔ θ j − α ∂ J ( θ ) ∂ θ j θ_j≔θ_j−α\frac{∂J(θ)}{∂θ_j} θj:=θjαθjJ(θ)
代入梯度:
θ j ≔ θ j − α ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j i θ_j≔θ_j−α∑_{i=1}^m(h_θ (x^{(i)} )−y^{(i)} ) x_j^i θj:=θjαi=1m(hθ(x(i))y(i))xji

# 进行计算
def compute(X,y,weights,bias):
    count=len(X)
    linear=np.dot(X,weights)+bias
    
    predictions = sigmoid(linear)
    
    dw=(1/count)*np.dot(X.T,(predictions-y))
    db=(1/count)*np.sum(predictions-y)
    
    return dw,db

def update(weights,bias,dw,db,rate):
    weights=weights-rate*dw
    bias=bias-rate*db
    
    return weights,bias

实现逻辑回归

逻辑回归公式
h θ ( x ) = 1 ( 1 + e − θ T X ) h_θ (x)=\frac{1}{(1+e^{−θ^T X} )} hθ(x)=(1+eθTX)1


#逻辑回归
def logistic(X,y,rate,iterations):
    count,col=X.shape
    weights,bias=initialize(col)
    
    for _ in range(iterations):
        dw,db=compute(X,y,weights,bias)
        
        weights,bias =update(weights,bias,dw,db,rate)
        
    return weights, bias

测试模型

import numpy as np
import matplotlib.pyplot as plt

# 生成两个特征的单调数据
np.random.seed(42)
X1 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X2 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X = np.column_stack((X1, X2))

# 生成对应的标签,假设以直线 x1 = x2 为界限进行二分类
y = (X[:, 0] > X[:, 1]).astype(int)

# 添加偏置项
X_with_bias = np.c_[np.ones((X.shape[0], 1)), X]

# 训练逻辑回归模型
weights, bias = logistic(X_with_bias, y, rate=0.1, iterations=1000)

# 选择一些数据点进行预测
X_predict = np.array([[2, 2], [3, 4], [4, 3]])
predictions = predict(np.c_[np.ones((X_predict.shape[0], 1)), X_predict], weights, bias)

# 输出预测结果
print("Predictions:", predictions)

# 画出二分类后的图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, marker='o')
plt.scatter(X_predict[:, 0], X_predict[:, 1], marker='x', color='red', label='Predictions')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Binary Classification with Logistic Regression')
plt.legend()
plt.show()

在这里插入图片描述

完整代码

import numpy as np

# sigmoid 函数
def sigmod(z):
    return 1/(1+np.exp(-z))

# 初始化参数
def initialize(num_col):
    weights=np.zeros(num_col)
    bias=0
    return weights,bias

# 进行计算
def compute(X,y,weights,bias):
    count=len(X)
    linear=np.dot(X,weights)+bias
    
    predictions = sigmoid(linear)
    
    dw=(1/count)*np.dot(X.T,(predictions-y))
    db=(1/count)*np.sum(predictions-y)
    
    return dw,db

# 梯度下降
def update(weights,bias,dw,db,rate):
    weights=weights-rate*dw
    bias=bias-rate*db
    
    return weights,bias
    
#逻辑回归
def logistic(X,y,rate,iterations):
    count,col=X.shape
    weights,bias=initialize(col)
    
    for _ in range(iterations):
        dw,db=compute(X,y,weights,bias)
        
        weights,bias =update(weights,bias,dw,db,rate)
        
    return weights, bias

# 预测结果
def predict(X,weights,bias):
    linear = np.dot(X,weights)+bias
    predictions=sigmoid(linear)
    
    return [1 if y_hat>0.5 else 0  for y_hat in predictions]

可视化代码

import numpy as np
import matplotlib.pyplot as plt

# 生成两个特征的单调数据
np.random.seed(42)
X1 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X2 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X = np.column_stack((X1, X2))

# 生成对应的标签,假设以直线 x1 = x2 为界限进行二分类
y = (X[:, 0] > X[:, 1]).astype(int)

# 添加偏置项
X_with_bias = np.c_[np.ones((X.shape[0], 1)), X]

# 训练逻辑回归模型
weights, bias = logistic(X_with_bias, y, rate=0.1, iterations=1000)

# 选择一些数据点进行预测
X_predict = np.array([[2, 2], [3, 4], [4, 3]])
predictions = predict(np.c_[np.ones((X_predict.shape[0], 1)), X_predict], weights, bias)

# 输出预测结果
print("Predictions:", predictions)

# 画出二分类后的图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, marker='o')
plt.scatter(X_predict[:, 0], X_predict[:, 1], marker='x', color='red', label='Predictions')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Binary Classification with Logistic Regression')
plt.legend()
plt.show()

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

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

相关文章

【计算机网络笔记】物理层——物理介质

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

Linux socket编程(10):UDP详解、聊天室实现及进阶知识

首先来回顾以下TCP的知识,TCP是一种面向连接的、可靠的传输协议,具有以下特点: TCP通过三次握手建立连接,确保通信的可靠性和完整性使用流控制和拥塞控制机制,有效地调整数据传输的速率,防止网络拥塞TCP提…

redis的keys命令和scan命令性能对比

项目场景 Redis的keys *命令在生产环境是慎用的,特别是一些并发量很大的项目,原因是Redis是单线程的,keys *会引发Redis锁,占用reids CPU,如果key数量很大而且并发是比较大的情况,效率是很慢的&#xff0c…

vivado实现分析与收敛技巧9-分析使用率统计数据

实现问题的常见原因之一是未考量显式和隐式物理约束。例如 , 管脚分配 (pinout) 在逻辑布局上变为显式物理约束。 slice( 分片 ) 逻辑在大部分器件中都是一致的。但如下专用资源表示的是隐式物理约束 , 因为这些资源仅在某些位置…

C语言碎片知识

sizeof 1.sizeof是C语言中的一个操作符,同时也是关键字!!!! 2.sizeof的操作数可以是类型,变量或表达式 如图,第一个为什么是6?,因为先计算了3的大小,占4个字…

【模电】放大电路的组成原则

放大电路的组成原则 组成原则常用的两种共射放大电路 组成原则 通过对基本共射放大电路的简单分析可以总结出,在组成放大电路时必须遵循以下几个原则:    1. 必须根据所用放大管的类型提供直流电源,以便设置合适的静态工作点,并…

【unity3D】unity中如何查找和获取游戏物体

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity中游戏物体的查找与获取 这里写自定义目录标题 获取当前物体的基本属性查找其它物体- 通过名称查找其它物体- 通过标签查找- 通过类…

互联网Java工程师面试题·Spring Boot篇·第二弹

目录 8、什么是 YAML? 9、如何实现 Spring Boot 应用程序的安全性? 10、如何集成 Spring Boot 和 ActiveMQ? 11、如何使用 Spring Boot 实现分页和排序? 12、什么是 Swagger?你用 Spring Boot 实现了它吗? …

MySQL之时间戳(DateTime和TimeStamp)

MySQL之时间戳(DateTime和TimeStamp) 文章目录: MySQL之时间戳(DateTime和TimeStamp)一、DateTime类型二、TimeStamp类型三、DateTime和TimeStamp的区别 当插入数据时,需要自动记录一个时间时候&#xff0c…

【springboot】整合redis

1.前提条件:docker安装好了redis确定redis可以访问 可选软件: 2.测试代码 (1)redis依赖 org.springframework.boot spring-boot-starter-data-redis (2)配置redis (3) 注入 Resource StringRedisTemplate stringRedisTemplate; 对键进行操作 –o…

SCTransform normalization seurat

完成了前面的基础质控、过滤以及去除细胞周期的影响后,我们可以开始SCTransform normalization。 SCTransform normalization的优势: 1️⃣ 一个SCTransform函数即可替代NormalizeData, ScaleData, FindVariableFeatures三个函数;2️⃣ 对测序深度的校正…

[足式机器人]Part2 Dr. CAN学习笔记-Ch0-1矩阵的导数运算

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch0-1矩阵的导数运算 1. 标量向量方程对向量求导,分母布局,分子布局1.1 标量方程对向量的导数1.2 向量方程对向量的导数 2. 案例分析,线性回归3. 矩阵求导的链…

DCDC电源的选择

https://blog.csdn.net/xiahailong90/article/details/79086490 先说结论: 高开关频率的交换式电源转换器有利也有弊,本文提到的好处包括体积更小、瞬时响应更快以及电压overshoot 和undershoot 值都更小,主要缺点则是效率降低和热量增加。 …

STK Components 二次开发-飞行器

1.创建飞机 参数帮助文档 var poitList GetTracksData(); var waypointPropagator new WaypointPropagator(m_earth, poitList); var locationPoint waypointPropagator.CreatePoint();m_aircraft new Platform {Name "MH730",LocationPoint locationPoint,Or…

独立版求职招聘平台小程序开发

小程序招聘系统开发 我们开发了一款高效、便捷的互联网招聘平台。在这里,可以轻松实现企业入驻、职位发布、在线求职、精准匹配职位和人才,以及参与招聘会等功能。目标是为求职者和企业搭建一个连接彼此的桥梁,帮助您更快地找到满意的工作&…

基于Go语言实现简易Web应用

目录 前言Go语言特点写在使用Go语言实现Web应用前面创建Web服务器声明一个结构体操作加入中间件的使用使用静态文件服务器最后 前言 在编程语言中,近几年问世的几个新语言都是非常不错的,比如Go、Python、 Rust等等。其中,Go语言(Golang)作…

线程池、及Springboot线程池实践

摘要 本文介绍了线程池基本概念、线程及线程池状态、java中线程池提交task后执行流程、Executors线程池工具类、最后介绍在springboot框架下使用线程池和定时线程池,以及task取消 线程池基本 背景 线程池 线程池是一种多线程处理形式,处理过程中将任务…

探索人工智能领域——每日20个名词详解【day8】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

使用UART和USART在STM32上进行双向通信

在本文中,我们将深入了解如何在STM32上使用UART(通用异步收发传输器)和USART(通用同步异步收发传输器)实现双向通信。UART和USART是常见的串口通信协议,通常用于与其他设备进行数据传输。我们将重点介绍如何…

01_W5500简介

目录 W5500简介: 芯片特点: 全硬件TCPIP协议栈: 引脚分布: W5500简介: W5500是一款高性价比的以太网芯片,其全球独一无二的全硬件TCPIP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用&#xff…