【R语言】机器学习-手撕逻辑回归

news2024/11/27 3:57:42

【R语言】机器学习-手撕逻辑回归

算法原理

逻辑回归是一种常用的分类算法,它在机器学习领域有着广泛的应用。在介绍具体的实现细节之前,我们先来了解一下逻辑回归的算法原理。

sigmoid函数

逻辑回归使用sigmoid函数(也称为逻辑函数)来进行分类。Sigmoid函数是一个S形曲线,它将输入值映射到0和1之间的概率值。它的定义如下:
S ( x ) = 1 1 + e − x S(x) = \frac{1}{1+e^{-x}} S(x)=1+ex1
其函数图像与导函数图像如下:

在这里插入图片描述

广义线性模型

逻辑回归是一种广义线性模型(Generalized Linear Model,简称GLM)。广义线性模型是一类包括逻辑回归在内的统计模型,它通过线性组合输入特征,并通过一个链接函数将线性组合映射到输出概率。

线性模型的矩阵表示
Z = X θ T Z = \bold{X} \theta^T Z=XθT

  • 输入的 X \bold{X} X m × ( n + 1 ) m \times (n+1) m×(n+1)维度的矩阵, m m m是样本数量, n n n是特征数。
  • θ \theta θ ( n + 1 ) (n+1) (n+1)维的权重向量,其转置 θ T \theta^T θT ( n + 1 ) × 1 (n+1) \times 1 (n+1)×1维度的列矩阵

将线性模型代入sigmoid函数,得逻辑回归的矩阵表示
h θ ( X ) = 1 1 + e − X θ T h_{\theta}(\bold{X})= \frac{1}{1+e^{-\bold{X} \theta^T}} hθ(X)=1+eXθT1

  • h θ ( X ) h_{\theta}(\bold{X}) hθ(X)是假设函数(hypothesis function),为 m × 1 m \times 1 m×1维度的矩阵,代表 m m m个样本数据的预测概率值。

极大似然函数

极大似然估计(Maximum Likelihood Estimation,简称MLE)是一种常用的参数估计方法,用于在给定观测数据的情况下,估计出最有可能生成这些观测数据的模型参数值。

对某个多分类问题的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\{(\bold{x}_1,y_1),(\bold{x}_2,y_2),\dots,(\bold{x}_m,y_m)\} D={(x1,y1),(x2,y2),,(xm,ym)} x \bold{x} x为特征向量,其MLE表达式为
L ( x , θ ) = ∏ i = 1 m p ( y i ∣ x i , θ ) = p ( y 1 ∣ x 1 , θ ) p ( y 2 ∣ x 2 , θ ) … p ( y m ∣ x m , θ ) \begin{align} L(\bold{x},\theta) &= \prod_{i=1}^m p(y_i|\bold{x}_i,\theta) \\ &=p(y_1|\bold{x}_1,\theta) p(y_2|\bold{x}_2,\theta) \dots p(y_m|\bold{x}_m,\theta) \end{align} L(x,θ)=i=1mp(yixi,θ)=p(y1x1,θ)p(y2x2,θ)p(ymxm,θ)
在逻辑回归中,我们使用极大似然估计来估计模型的参数。极大似然估计的目标是找到一组参数,使得给定观测数据的条件下,观测到这些数据的概率最大化。对于二分类的逻辑回归,其预测值的概率分别可表示为
p ( y = 1 ∣ x ) = 1 1 + e − x θ T p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e x θ T \begin{align} p(y=1|\bold{x}) &= \frac{1}{1+e^{-\bold{x} \theta^T}} \\ p(y=0|\bold{x}) &= 1-p(y=1|\bold{x}) =\frac{1}{1+e^{\bold{x} \theta^T}} \end{align} p(y=1∣x)p(y=0∣x)=1+exθT1=1p(y=1∣x)=1+exθT1
则逻辑回归的最大似然估计可表示为
L ( x ) = ∏ i = 1 k p ( y i = 1 ∣ x i ) ∏ i = k m p ( y i = 0 ∣ x i ) = ∏ i = 1 k p ( y i = 1 ∣ x i ) ∏ i = k m ( 1 − p ( y i = 1 ∣ x i ) ) \begin{align} L(\bold{x}) &= \prod_{i=1}^k p(y_i=1|\bold{x}_i) \prod_{i=k}^m p(y_i=0|\bold{x}_i) \\ &= \prod_{i=1}^k p(y_i=1|\bold{x}_i) \prod_{i=k}^m \left(1-p(y_i=1|\bold{x}_i)\right) \end{align} L(x)=i=1kp(yi=1∣xi)i=kmp(yi=0∣xi)=i=1kp(yi=1∣xi)i=km(1p(yi=1∣xi))
h ( x ) = p ( y = 1 ∣ x ) h(\bold{x}) = p(y=1|\bold{x}) h(x)=p(y=1∣x)
L ( x ) = ∏ i = 1 k h ( x i ) ∏ i = k m ( 1 − h ( x i ) ) L(\bold{x}) = \prod_{i=1}^k h(\bold{x}_i) \prod_{i=k}^m \left(1-h(\bold{x}_i)\right) L(x)=i=1kh(xi)i=km(1h(xi))
利用 y ∈ { 0 , 1 } y \in \{0,1\} y{0,1}的特征可将上式整理为
L ( x ) = ∏ i = 1 m h ( x i ) y i ( 1 − h ( x i ) ) 1 − y i L(\bold{x}) = \prod_{i=1}^m h(\bold{x}_i)^{y_i} (1-h(\bold{x}_i))^{1-y_i} L(x)=i=1mh(xi)yi(1h(xi))1yi

损失函数

逻辑回归使用对数似然损失函数(log-likelihood loss)作为优化的目标函数。对数似然损失函数可以衡量模型的预测结果与实际观测值之间的差异。
l ( x ) = ln ⁡ L ( x ) = ∑ i = 1 m y i ln ⁡ ( h ( x i ) ) + ( 1 − y i ) ln ⁡ ( 1 − h ( x i ) ) l(\bold{x}) = \ln{L(\bold{x})} = \sum_{i=1}^m y_i\ln{(h(\bold{x}_i))} + (1-y_i)\ln{(1-h(\bold{x}_i))} l(x)=lnL(x)=i=1myiln(h(xi))+(1yi)ln(1h(xi))
为了结合梯度下降法求解最大似然估计的最大值,我们引入如下损失函数(loss function)
J ( θ ) = − 1 m l θ ( x ) = − 1 m ∑ i = 1 m y i ln ⁡ ( h θ ( x i ) ) + ( 1 − y i ) ln ⁡ ( 1 − h θ ( x i ) ) J(\theta) = -\frac{1}{m} l_{\theta}(\bold{x}) = -\frac{1}{m} \sum_{i=1}^m y_i\ln{(h_{\theta}(\bold{x}_i))} + (1-y_i)\ln{(1-h_{\theta}(\bold{x}_i))} J(θ)=m1lθ(x)=m1i=1myiln(hθ(xi))+(1yi)ln(1hθ(xi))

梯度下降法

为了最小化损失函数,我们使用梯度下降算法来更新模型参数。梯度下降算法通过计算损失函数对参数的偏导数,并沿着负梯度方向更新参数值,从而逐步优化模型。
J ( θ ) = − 1 m ∑ i = 1 m y i ln ⁡ ( h θ ( x i ) ) + ( 1 − y i ) ln ⁡ ( 1 − h θ ( x i ) ) = − 1 m ∑ i = 1 m y i ln ⁡ ( h θ ( x i ) 1 − h θ ( x i ) ) + ln ⁡ ( 1 − h θ ( x i ) ) \begin{align} J(\theta) &= -\frac{1}{m} \sum_{i=1}^m y_i\ln{(h_{\theta}(\bold{x}_i))} + (1-y_i)\ln{(1-h_{\theta}(\bold{x}_i))} \\ &= -\frac{1}{m} \sum_{i=1}^m y_i\ln{(\frac{h_{\theta}(\bold{x}_i)}{1-h_{\theta}(\bold{x}_i)})} + \ln{(1-h_{\theta}(\bold{x}_i))} \end{align} J(θ)=m1i=1myiln(hθ(xi))+(1yi)ln(1hθ(xi))=m1i=1myiln(1hθ(xi)hθ(xi))+ln(1hθ(xi))
h θ ( x ) = 1 1 + e − x θ T h_{\theta}(\bold{x})= \frac{1}{1+e^{-\bold{x} \theta^T}} hθ(x)=1+exθT1代入公式得
J ( θ ) = − 1 m ∑ i = 1 m y i x i θ T + ln ⁡ ( 1 1 + e x i θ T ) = − 1 m ∑ i = 1 m y i x i θ T − ln ⁡ ( 1 + e x i θ T ) \begin{align} J(\theta) &= -\frac{1}{m} \sum_{i=1}^m y_i \bold{x}_i \theta^T + \ln{(\frac{1}{1+e^{\bold{x}_i \theta^T}})} \\ &= -\frac{1}{m} \sum_{i=1}^m y_i \bold{x}_i \theta^T - \ln{(1+e^{\bold{x}_i \theta^T})} \end{align} J(θ)=m1i=1myixiθT+ln(1+exiθT1)=m1i=1myixiθTln(1+exiθT)
求解损失函数梯度
∂ J ( θ ) ∂ θ = − 1 m ∑ i = 1 m y i x i − x i e x i θ T 1 + e x i θ T = − 1 m ∑ i = 1 m ( y i − 1 1 + e − x i θ T ) x i = − 1 m ∑ i = 1 m ( y i − h θ ( x i ) ) x i \begin{align} \frac{\partial J(\theta)}{\partial \theta} &= -\frac{1}{m} \sum_{i=1}^m y_i \bold{x}_i - \frac{\bold{x}_i e^{\bold{x}_i \theta^T}}{1+e^{\bold{x}_i \theta^T}} \\ &= -\frac{1}{m} \sum_{i=1}^m \left(y_i - \frac{1}{1+e^{-\bold{x}_i \theta^T}}\right)\bold{x}_i \\ &= -\frac{1}{m} \sum_{i=1}^m \left(y_i - h_{\theta}(\bold{x}_i)\right)\bold{x}_i \end{align} θJ(θ)=m1i=1myixi1+exiθTxiexiθT=m1i=1m(yi1+exiθT1)xi=m1i=1m(yihθ(xi))xi
梯度下降迭代关系式为
θ ( i + 1 ) = θ ( i ) − α ⋅ ∂ J ( θ ) ∂ θ \theta^{(i+1)} = \theta^{(i)} - \alpha \cdot \frac{\partial J(\theta)}{\partial \theta} θ(i+1)=θ(i)αθJ(θ)

  • α \alpha α为学习率(步长)

求解梯度函数也可用矩阵表示为
∂ J ( θ ) ∂ θ = − 1 m X T ( Y − h θ ( X ) ) \frac{\partial J(\theta)}{\partial \theta} = -\frac{1}{m} \bold{X}^T\left(\bold{Y} - h_{\theta}(\bold{X})\right) θJ(θ)=m1XT(Yhθ(X))

  • X \bold{X} X m × ( n + 1 ) m \times (n+1) m×(n+1)维度的矩阵
  • Y \bold{Y} Y m × 1 m \times 1 m×1维度的矩阵

算法实现

模型训练

# 定义逻辑回归函数
logistic_regression <- function(data, epochs, learning_rate) {
  # 初始化权重和偏置
  w <- matrix(0, nrow = ncol(data) - 1, ncol = 1)
  b <- 0
  
  # 迭代更新权重和偏置
  for (epoch in 1:epochs) {
    # 计算线性模型的输出
    z <- as.matrix(data[, -ncol(data)]) %*% w + b
    # 应用逻辑函数
    a <- 1 / (1 + exp(-z))
    
    # 计算损失函数的梯度
    dw <- t(as.matrix(data[, -ncol(data)])) %*% (a - data[, ncol(data)]) / nrow(data)
    db <- sum(a - data[, ncol(data)]) / nrow(data)
    
    # 更新权重和偏置
    w <- w - learning_rate * dw
    b <- b - learning_rate * db
  }
  
  # 返回训练好的权重和偏置
  return(list("weights" = w, "bias" = b))
}

模型预测

# 使用训练好的模型进行预测
predict_logistic_regression <- function(model, new_data) {
  # 提取权重和偏置
  w <- model$weights
  b <- model$bias
  
  # 计算线性模型的输出
  z <- as.matrix(new_data) %*% w + b
  # 应用逻辑函数
  a <- 1 / (1 + exp(-z))
  
  # 将概率转换为分类标签
  predictions <- ifelse(a > 0.5, 1, 0)
  
  # 返回预测结果
  return(predictions)
}

完整代码

# 创建一个示例数据集
data <- data.frame(
  x1 = c(1, 2, 3, 4, 5),
  x2 = c(2, 4, 6, 8, 10),
  y = c(0, 0, 0, 1, 1)
)

# 定义逻辑回归函数
logistic_regression <- function(data, epochs, learning_rate) {
  # 初始化权重和偏置
  w <- matrix(0, nrow = ncol(data) - 1, ncol = 1)
  b <- 0
  
  # 迭代更新权重和偏置
  for (epoch in 1:epochs) {
    # 计算线性模型的输出
    z <- as.matrix(data[, -ncol(data)]) %*% w + b
    # 应用逻辑函数
    a <- 1 / (1 + exp(-z))
    
    # 计算损失函数的梯度
    dw <- t(as.matrix(data[, -ncol(data)])) %*% (a - data[, ncol(data)]) / nrow(data)
    db <- sum(a - data[, ncol(data)]) / nrow(data)
    
    # 更新权重和偏置
    w <- w - learning_rate * dw
    b <- b - learning_rate * db
  }
  
  # 返回训练好的权重和偏置
  return(list("weights" = w, "bias" = b))
}

# 使用逻辑回归函数进行训练
epochs <- 1000
learning_rate <- 0.01
model <- logistic_regression(data, epochs, learning_rate)

# 输出训练得到的权重和偏置
print(model)

# 使用训练好的模型进行预测
predict_logistic_regression <- function(model, new_data) {
  # 提取权重和偏置
  w <- model$weights
  b <- model$bias
  
  # 计算线性模型的输出
  z <- as.matrix(new_data) %*% w + b
  # 应用逻辑函数
  a <- 1 / (1 + exp(-z))
  
  # 将概率转换为分类标签
  predictions <- ifelse(a > 0.5, 1, 0)
  
  # 返回预测结果
  return(predictions)
}

# 创建一个新的数据集用于预测
new_data <- data.frame(
  x1 = c(3, 4),
  x2 = c(5, 6)
)

# 使用训练好的模型进行预测
predictions <- predict_logistic_regression(model, new_data)

# 输出预测结果
print(predictions)

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

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

相关文章

《TCP IP网络编程》第四章

第 4 章 基于 TCP 的服务端/客户端&#xff08;1&#xff09; 根据数据传输方式的不同&#xff0c;基于网络协议的套接字一般分为 TCP 套接字和 UDP 套接字。因为 TCP 套接字是面向连接的&#xff0c;因此又被称为基于流&#xff08;stream&#xff09;的套接字。 TCP …

烧屏现象对OLED屏幕质量的影响:如何保持画面清晰度?

OLED&#xff08;Organic Light Emitting Diode&#xff09;屏幕作为一种高品质、高对比度和鲜艳色彩的显示技术&#xff0c;越来越受到消费者的青睐。然而&#xff0c;一些用户可能会担心OLED屏幕烧屏的问题。本文将探讨OLED屏幕烧屏的原因、如何预防烧屏以及如何进行正确的维…

一个完整的项目是怎么做性能测试?资深8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 突然有一天&#…

解决问题:解除HUE下载10万行的限制

解决问题&#xff1a;解除HUE下载10万行的限制 这个目录下的 vim /opt/cloudera/parcels/CDH/lib/hue/apps/beeswax/src/beeswax/conf.py可以调整数量 也可以更改为-1&#xff08;表示不限制&#xff09;

有测试媛的IT团队,产品质量更高

我们都知道&#xff0c;在绝大部分技术团队中&#xff0c;往往阳盛阴衰。而测试团队&#xff0c;可能情况要好一些&#xff0c;据部分机构调查来看男女比例在3:2左右。 根据过往经验来看&#xff0c;有测试媛的IT团队&#xff0c;往往软件质量能更好的得到保证&#xff08;强调…

【单片机】MSP430F5529单片机的Flash读写控制,MSP430 flash 读写

文章目录 内存模型程序 内存模型 https://qq742971636.blog.csdn.net/article/details/108892807 单片机的Flash里面的区域不是全都能写的&#xff1a;https://blog.csdn.net/u014470361/article/details/79297601 找一下手册看看MSP430F5529单片机哪些地址区域能写&#xf…

nginx常用命令以及安装

目录 前言&#xff1a; 安装&#xff1a; 常用命令&#xff1a; 前言&#xff1a; Nginx的设计理念是高性能、稳定性、开放性和易用性。它的并发能力优秀&#xff0c;可以处理数万个并发连接&#xff0c;并且占用较少的资源。此外&#xff0c;Nginx支持热部署&#xff0c;即…

如何将企业联系方式API接口应用于你的移动端APP?

在现代商业世界中&#xff0c;企业需要提供一种快速&#xff0c;高效的方式来让用户获取联系方式。因此&#xff0c;企业联系方式API接口应运而生&#xff0c;它是一种提供了企业联系方式的开放接口&#xff0c;在用户调用时&#xff0c;可以实现即时获取企业的联系方式信息。本…

python-计算两个矩阵的相似度。

余弦相似度 在pytorch中&#xff0c;有一个专门的函数用于计算相似度&#xff1a;torch.cosine_similarity() https://pytorch.org/docs/stable/nn.functional.html#cosine-similarity import torch import torch.nn.functional as F input1 torch.randn(100, 128) input2 t…

【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类

前情提要&#xff1a; 【2023&#xff0c;学点儿新Java-31】测试&#xff1a;整型和浮点型变量的使用 | 附&#xff1a;计算机存储单位&#xff08;转换关系&#xff09;| 企业真题&#xff1a;为什么0.10.2不等于0.3【2023&#xff0c;学点儿新Java-30】变量的基本使用&#…

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实…

安全不“放假”,VR安全教育等你沉浸式体验

暑期开启&#xff0c;孩子们将迎来一段丰富且快乐的时光&#xff0c;暑假虽快乐&#xff0c;但是安全不能“放假”&#xff0c;许多地方开展形式多样的暑假安全宣传活动&#xff0c;想不想沉浸式体验下VR安全教育宣传呢&#xff1f;通过VR演示&#xff0c;身临其境的了解防溺水…

MySQL-概述-数据模型SQL简介

数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库数据库管理系统&#xff1a;DataBase Management System&#xff08;DBMS&#xff09;&#xff0c;操作和管理数据库的大型软件。SQL&#xff1a;Structured Query Language&#xff0…

「提高你的CSS技能」:15个重要的CSS属性详解

这篇文章介绍了15个重要的CSS属性&#xff0c;旨在提高读者的CSS知识和技能。文章以清晰的方式解释了每个属性的作用和用法&#xff0c;并提供了相应的示例代码。通过这篇文章&#xff0c;读者可以了解到一些有趣且实用的CSS属性。 1:in-range 和:out-of-range 伪类 CSS的:in…

KafKa 3.x(三、Eagle、Kraft、压测调优,源码解析)

6. Kafka-Eagle监控 Kafka-Eagle框架用于监控Kafka集群运行状况。官网https://kafka-eagle.org 6.1 Mysql 前置mysql。 6.2 Kafka环境 关闭集群 kf.sn stop修改vim /bin/kafka-server-start.sh 并同步到其他节点 if [ "x$KAFKA_HEAP_OPTS" "x" ]; t…

vue使用html2canvas实现一键截图并赋值到剪贴板,只截取当前显示器上可视的内容

使用html2canvas 和 clipboard API实现整页截图并填充至剪切板。 访问剪切板的api只支持在https或者本地localhost上使用&#xff0c;如果是http&#xff0c;则无法使用 首先需要从npm安装html2canvas npm install html2canvas然后在代码中导入这个包&#xff1a; import ht…

git安装教程

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从小到大的项目版本管理。下面详细的用图文形式介绍一下git安装过程&#xff08;记录一下git安装过程供参考&#xff09; 一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载&am…

适合宝妈和学生党的副业,在家就可以做的兼职,实现高质量躺平

如果工资不够高&#xff0c;那就会让人过得很拮据。因此&#xff0c;很多人都希望可以通过兼职或副业来增加收入。然而&#xff0c;找到可靠的副业却并不容易&#xff0c;还会面临各种困难。 跟大家介绍七种可行的兼职副业&#xff0c;希望能为那些想增加收入的职场人员提供一…

第四章:DeepLabV2——使用深度卷积神经网络、空洞卷积和全连接条件随机场进行语义图像分割

0.摘要 在这项工作中&#xff0c;我们使用深度学习来解决语义图像分割任务&#xff0c;并做出了三个实验证明具有实际价值的主要贡献。 首先&#xff0c;我们强调通过上采样滤波器进行卷积&#xff0c;或者称为“空洞卷积”&#xff0c;在密集预测任务中是一种强大的工具。空洞…

Langchain-ChatGLM配置文件参数测试

1 已知可能影响对话效果的参数&#xff08;位于configs/model_config.py文件&#xff09;&#xff1a; # 文本分句长度 SENTENCE_SIZE 100# 匹配后单段上下文长度 CHUNK_SIZE 250 # 传入LLM的历史记录长度 LLM_HISTORY_LEN 3 # 知识库检索时返回的匹配内容条数 VECTO…