【机器学习Python实战】logistic回归

🚀个人主页:为梦而生~ 关注我一起学习吧!
💡专栏:机器学习python实战 欢迎订阅!后面的内容会越来越有意思~
内容说明:本专栏主要针对机器学习专栏的基础内容进行python的实现,部分基础知识不再讲解,有需要的可以点击专栏自取~
💡往期推荐
【机器学习Python实战】线性回归
💡机器学习基础知识
【机器学习基础】机器学习入门(1)
【机器学习基础】机器学习入门(2)
【机器学习基础】机器学习的基本术语
【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
【机器学习基础】一元线性回归(适合初学者的保姆级文章)
【机器学习基础】多元线性回归(适合初学者的保姆级文章)
【机器学习基础】对数几率回归(logistic回归)
本期内容:针对以上的逻辑回归回归的梯度下降求解方法,进行代码展示


文章目录

  • 基于梯度下降的logistic回归
    • sigmoid函数
    • 假设函数
    • 代价函数
    • 梯度下降
  • 代码实现
  • 效果展示


⭐对于逻辑回归的系列基础知识,【机器学习基础】对数几率回归(logistic回归)这篇文章已经讲过了,还没了解过的建议先看一下原理😀

基于梯度下降的logistic回归

sigmoid函数

由基础知识的文章我们知道,sigmoid函数长这样:
在这里插入图片描述
如何用python代码来实现它呢:

def Sigmoid(z):G_of_Z = float(1.0 / float((1.0 + math.exp(-1.0 * z))))return G_of_Z

假设函数

同样,对于逻辑回归的假设函数,我们也需要用python定义
在这里插入图片描述
对于这样一个复合函数,定义方式如下:

def Hypothesis(theta, x):z = 0for i in range(len(theta)):z += x[i] * theta[i]return Sigmoid(z)

代价函数

对于这样一个cost function,实现起来是有些难度的
在这里插入图片描述

其原理是利用的正规公式:
在这里插入图片描述
实现过程也是相当于这个公式的计算过程

CostHistory=[]
def Cost_Function(X, Y, theta, m):sumOfErrors = 0for i in range(m):xi = X[i]hi = Hypothesis(theta, xi)if Y[i] == 1:error = Y[i] * math.log(hi)elif Y[i] == 0:error = (1 - Y[i]) * math.log(1 - hi)sumOfErrors += errorCostHistory.append(sumOfErrors)const = -1 / mJ = const * sumOfErrors#print('cost is ', J)return CostHistory

梯度下降

【机器学习基础】一元线性回归(适合初学者的保姆级文章)
【机器学习基础】多元线性回归(适合初学者的保姆级文章)
在这两篇文章中已经讲过了梯度下降的一些基本概念,如果不清楚的可以到前面看一下

代码定义梯度下降的方式如下:

def Gradient_Descent(X, Y, theta, m, alpha):new_theta = []constant = alpha / mfor j in range(len(theta)):CFDerivative = Cost_Function_Derivative(X, Y, theta, j, m, alpha)new_theta_value = theta[j] - CFDerivativenew_theta.append(new_theta_value)return new_theta

每次迭代,通过学习率与微分的计算,得到新的 θ \theta θ

在这里插入图片描述

迭代的策略这里使用的是牛顿法逻辑回归的实现,使用梯度下降来更新参数,同时使用二分法来逼近最优解。

def newton(X, Y, alpha, theta, num_iters):m = len(Y)for x in range(num_iters):new_theta = Gradient_Descent(X, Y, theta, m, alpha)theta = new_thetaif x % 100 == 0:Cost_Function(X, Y, theta, m)print('theta ', theta)print('cost is ', Cost_Function(X, Y, theta, m))Declare_Winner(theta)

代码实现

from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from numpy import loadtxt, where
from pylab import scatter, show, legend, xlabel, ylabel
import math
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt# 这是Sigmoid激活函数,用于将任何实数映射到介于0和1之间的值。
def Sigmoid(z):G_of_Z = float(1.0 / float((1.0 + math.exp(-1.0 * z))))return G_of_Z# 这是预测函数,输入参数是参数向量theta和输入向量x,返回预测的概率。
def Hypothesis(theta, x):z = 0for i in range(len(theta)):z += x[i] * theta[i]return Sigmoid(z)# 这是代价函数,输入参数是训练数据集X、标签Y、参数向量theta和样本数m,返回当前参数下的代价函数值和历史误差记录。
CostHistory=[]
def Cost_Function(X, Y, theta, m):sumOfErrors = 0for i in range(m):xi = X[i]hi = Hypothesis(theta, xi)if Y[i] == 1:error = Y[i] * math.log(hi)elif Y[i] == 0:error = (1 - Y[i]) * math.log(1 - hi)sumOfErrors += errorCostHistory.append(sumOfErrors)const = -1 / mJ = const * sumOfErrors#print('cost is ', J)return CostHistory# 这是代价函数对第j个参数的导数,用于计算梯度下降中的梯度。
def Cost_Function_Derivative(X, Y, theta, j, m, alpha):sumErrors = 0for i in range(m):xi = X[i]xij = xi[j]hi = Hypothesis(theta, X[i])error = (hi - Y[i]) * xijsumErrors += errorm = len(Y)constant = float(alpha) / float(m)J = constant * sumErrorsreturn J# 这是梯度下降算法的实现,用于更新参数向量theta。
def Gradient_Descent(X, Y, theta, m, alpha):new_theta = []constant = alpha / mfor j in range(len(theta)):CFDerivative = Cost_Function_Derivative(X, Y, theta, j, m, alpha)new_theta_value = theta[j] - CFDerivativenew_theta.append(new_theta_value)return new_theta# 这是牛顿法逻辑回归的实现,使用梯度下降来更新参数,同时使用二分法来逼近最优解。
def newton(X, Y, alpha, theta, num_iters):m = len(Y)for x in range(num_iters):new_theta = Gradient_Descent(X, Y, theta, m, alpha)theta = new_thetaif x % 100 == 0:Cost_Function(X, Y, theta, m)print('theta ', theta)print('cost is ', Cost_Function(X, Y, theta, m))Declare_Winner(theta)# 该函数主要用于确定训练好的逻辑回归模型(这里命名为clf)对测试集的预测结果,并返回一个赢家(预测准确率更高的模型)。
def Declare_Winner(theta):score = 0winner = ""scikit_score = clf.score(X_test, Y_test)length = len(X_test)for i in range(length):prediction = round(Hypothesis(X_test[i], theta))answer = Y_test[i]if prediction == answer:score += 1my_score = float(score) / float(length)
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1))x_input1, x_input2, Y = np.genfromtxt('dataset3.txt', unpack=True, delimiter=',')
print(x_input1.shape)
print(x_input2.shape)
print(Y.shape)
X = np.column_stack((x_input1, x_input2))X = min_max_scaler.fit_transform(X)X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)clf= LogisticRegression()
clf.fit(X_train, Y_train)
print('Acuraccy is: ', (clf.score(X_test, Y_test) * 100))
pos = where(Y == 1)
neg = where(Y == 0)
scatter(X[pos, 0], X[pos, 1], marker='o', c='b')
scatter(X[neg, 0], X[neg, 1], marker='x', c='g')
xlabel('score 1')
ylabel('score 2')
legend(['0', '1'])initial_theta = [0, 0]
alpha = 0.01
iterations = 100
m = len(Y)
mycost=Cost_Function(X,Y,initial_theta,m)
mycost=np.asarray(mycost)
print(mycost.shape)
plt.figure()
plt.plot(range(iterations),mycost)
newton(X,Y,alpha,initial_theta,iterations)
# print("theta is: ",my_theta)
plt.show()

效果展示

首先是基于数据集做出的散点图,并标记出了正例和负例
请添加图片描述
对于该散点图,可以做出一条分割正负样本的直线
请添加图片描述
下面是程序的一些输出:
请添加图片描述

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

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

相关文章

Go 语言结构体验证详解:validate 标签与自定义规则

介绍 Go 语言中,结构体验证是保障数据完整性和正确性的重要手段之一。本文将深入探讨 validate 标签的使用方式,并介绍如何结合验证库 go-playground/validator 进行自定义验证规则。 安装与导入验证库 首先,请确保已安装验证库&#xff1a…

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE,从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面,搜索PlantUML,安装PlantUML Integration和PlantUML Parser两个插件,并重启IDE 安装和配置Graphviz 进入官网…

《视觉SLAM十四讲》-- 后端 2

文章目录 09 后端 29.1 滑动窗口滤波和优化9.1.1 实际环境下的 BA 结构9.1.2 滑动窗口法 9.2 位姿图9.2.1 位姿图的意义9.2.2 位姿图优化 09 后端 2 9.1 滑动窗口滤波和优化 9.1.1 实际环境下的 BA 结构 由于计算机算力的限制,我们必须控制 BA 的规模&#xff0c…

进程程序替换与exec系统调用

进程程序替换 进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数,例如execl、execv、execle、execve等。它们的共同特点是当当前进程执行到该函数时,就会直接…

Bert浅谈

优点 首先,bert的创新点在于利用了双向transformer,这就跟openai的gpt有区别,gpt是采用单向的transformer,而作者认为双向transformer更能够融合上下文的信息。这里双向和单向的区别在于,单向只跟当前位置之前的tocke…

Nginx安装配置与SSL证书安装部署

一、Nginx Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内容。 nginx官网 这里下载nginx-1.24.0-zip Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内…

测试开发环境下centos7.9下安装docker的minio

按照以下方法进行 1、安装docker,要是生产等还是要安装docker-ce yum install docker 2、启动docker service docker start 3、 查看docker信息 docker info 4、加到启动里 systemctl enable docker.service 5、开始docker pull minio/minio 但报错&#x…

【机器学习7】优化算法

1 有监督学习的损失函数 1.1 分类问题 对二分类问题, Y{1,−1}, 我们希望sign f(xi,θ)yi, 最自然的损失函数是0-1损失, 函数定义特点0-1损失函数非凸、非光滑,很难直接对该函数进行优化Hinge损失函数当fy≥1时&…

汽车以太网IOP测试新利器

IOP测试目的 汽车以太网物理层IOP(Interoperability )测试,即测试被测对象以太网物理层之间的互操作性。用于验证车载以太网PHY能否在有限时间内建立稳定的链路;此外,还用于验证车载以太网PHY可靠性相关的诊断特性&am…

Linux环境下C++ 接入OpenSSL

接上一篇:Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 解决完本地windows环境,想赶紧在外网环境看看是否也正常。毕竟现在只是HelloWorld级别的,等东西多了&am…

linux时间调整

查看当前系统时间 [rootVM-12-12-centos ~]# date Sat Nov 18 16:09:11 CST 2023 Sat:表示星期六Saturday的缩写 Nov:表示十一月November的缩写 18:表示日期18号 16:09:11:时间 CST:China Standard Time中国标准…

认识Modbus通信协议(笔记)

Modbus 莫迪康 1979年 PLC 1969年 什么是modbus? 它是一个Bus,即总线协议。比如串口协议、IIC协议、SPI都是通信协议。 协议,顾名思义是一种规定和约束 Modbus协议是一种引用层的报文传输协议,RTU、ASCLL、TCP,都属于Modbus协…

文件哈希值,win和linux

示例: linux下 sha256sum filename openssl sha256 filename win下 certutil -hashfile filename SHA256。 其中 filename 为待测的文件名。 1、Windows 系统 certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile filename SHA2…

浅谈智能安全配电装置应用在银行配电系统中

【摘要】银行是国家重点安全保护部分,关系到社会资金的稳定,也是消防重点单位。消防安全是银行工作的重要组成部分。在银行配电系统中应用智能安全配电装置,可以提高银行的智能控制水平,有效预防电气火灾。 【关键词】银行&#…

如何快速下载mysql的不同版本并启动mysql服务?

如何快速下载mysql的不同版本并启动mysql服务? 下载mysql的安装版本 首先我们要使用到迅雷去下载,因为迅雷下载是很快的。在迅雷里面搜索下面的Mysql Installer安装窗口,如下图: 连接:https://dev.mysql.com/downlo…

计算矩阵边缘元素之和

Description 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 Input 第一行分别为矩阵的行数m和列数n&#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c;…

fopen/fwrite/fread 对UNICODE字符写入的总结

windows对fopen函数进行了升级&#xff0c;可以支持指定文件的编码格式&#xff08;ccs参数指定&#xff09;。 例如&#xff1a; FILE *fp fopen("newfile.txt", "rt, ccsUTF-8"); 当以 ccs 模式打开文件时&#xff0c;进行读写操作的数据应为 UTF-16…

Trino 与Hive 有差异的函数

日常使用中发现trino和hive中的有一些函数存在差异&#xff0c;所以开此帖记录一下 这里只是记录trino和hive有差异的函数&#xff0c;遇到了就会记录一下&#xff0c;不定期更新 1. 查看集合中元素个数 hive&#xff1a;size() trino&#xff1a;cardinality() 2. map取值 …

迭代器与生成器

章节目录&#xff1a; 一、迭代器1.1 相关概述1.2 基本使用1.3 自定义迭代器 二、生成器2.1 相关概述2.2 基本使用2.3 三种应用场景 三、yield 和 class 定义的迭代器对比四、结束语 一、迭代器 1.1 相关概述 迭代是 Python 最强大的功能之一&#xff0c;是访问集合元素的一种…

Selenium自动化测试框架

一.Selenium概述 1.1 什么是框架? 框架&#xff08;framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。是一个基本概念上的 结构用于去解决或者处理复杂的问题。 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及…