【机器学习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.hqwc.cn/news/191591.html

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

相关文章

算法-二叉树-简单-二叉树的遍历

记录一下算法题的学习6 首先我们要回忆一下怎么样遍历一个树: 三种遍历概念 先序遍历:先访问根节点,再访问左子树,最后访问右子树。 后序遍历:先左子树,再右子树,最后根节点。 中序遍历&…

DEEP-FRI: Sampling Outside the Box Improves Soundness论文学习笔记

1. 引言 前序博客有: DEEP FRI协议A summary on the FRI low degree test前2页导读RISC Zero的手撕STARKReed-Solomon Codes——RS纠错码Reed-Solomon Codes及其与RISC Zero zkVM的关系 Eli Ben-Sasson等人2019年论文《DEEP-FRI: Sampling Outside the Box Impro…

从键盘输入5个学生的信息(姓名、学号、成绩), 存入一个结构体数组中,计算平均分,并按成绩 高低排序并输出.

代码如下 #include<stdio.h> #include<string.h> #include<stdlib.h> /* 1.练习结构体数组排序   从键盘输入5个学生的信息&#xff08;姓名、学号、成绩&#xff09;,存入一个结构体数组中&#xff0c;计算平均分&#xff0c;并按成绩高低排序并输出. */…

harmonyOS鸿蒙开发工具下载安装以及使用流程

注册账号 进入鸿蒙官方网站&#xff1a;https://www.harmonyos.com/ 推荐使用手机号注册 进行实名认证 下载开发环境 华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发 下载开发工具 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装 无脑下一…

车载开发岗位如何?Android程序员是否转行

这几年的大环境让大家都过的不安逸&#xff1b;社会动荡与就业问题一直困扰了不少人。在大家都认为的高薪工作程序员行业中&#xff0c;现在也是费力不讨好裁员风潮大部分指向互联网。 我们Android开发基本上已经感受很久了&#xff0c;就这就业问题很难存活。对此我们的目光都…

【MySQL学习笔记-001】- 创建表、插入数据、查看数据库结构

创建employees表 当创建一个表时&#xff0c;需要指定表的名称和每个列的名称和数据类型。以下是一个示例SQL语句&#xff0c;用于创建一个名为"employees"的表&#xff0c;其中包含员工ID、姓名、职位和工资等列&#xff1a; CREATE TABLE employees (employee_id…

AI Navigation导航系统_unity基础开发教程

AI Navigation导航系统 安装插件烘焙导航系统障碍物创建人物的AI导航动态障碍物 在unity编辑器中&#xff0c;有一个灰常好用的插件&#xff1a;Navigation。有了它1&#xff0c;你就可以实现人物自动走到你鼠标点击的位置&#xff0c;而且还会自动避开障碍物&#xff0c;下面就…

java源码-工程讲解

1、 工程目录 源码工程目录讲解部分&#xff0c;讲解过程会让大家对后端源码工程有一个大致的了解&#xff0c;能让大家在此改造&#xff0c;就可以衍生出一些新的功能&#xff0c;需要对java技术深入了解&#xff0c;需要看后续java技术讲解部分 整个架构是一个spring-boot…

Canal+Kafka实现MySQL与Redis数据同步(一)

CanalKafka实现MySQL与Redis数据同步&#xff08;一&#xff09; 前言 在很多业务情况下&#xff0c;我们都会在系统中加入redis缓存做查询优化。 如果数据库数据发生更新&#xff0c;这时候就需要在业务代码中写一段同步更新redis的代码。 这种数据同步的代码跟业务代码糅合…

QUIC协议详解

前言协议特点QUIC协议与HTTP/2协议区别QUIC协议的多路复用技术优势QUIC协议在Java中的应用存在的问题 前言 QUIC&#xff08;Quick UDP Internet Connections&#xff09;是一种基于 UDP 的传输层协议&#xff0c;由 Google 提出。从协议栈可以看出&#xff0c;QUIC HTTP/2 …

最常用的结构体初始化方式

结构体最常用的初始化方式就是用memset把这块区域清0 注意不能这么写 STU stu[5]; stu (STU*)malloc(sizeof(stu)); 数组名不允许被赋值&#xff0c;它只是个表达式

如何使用fiddler实现手机抓包,Filters过滤器!

一、Fiddler与其他抓包工具的区别 1、Firebug虽然可以抓包&#xff0c;但是对于分析http请求的详细信息&#xff0c;不够强大。模拟http请求的功能也不够&#xff0c;且firebug常常是需要“无刷新修改”&#xff0c;如果刷新了页面&#xff0c;所有的修改都不会保存&#xff1b…