1-简单回归问题

一.梯度下降(gradient descent)
1.预测函数
这里有一组样本点,横纵坐标分别代表一组有因果关系的变量

在这里插入图片描述

我们的任务是设计一个算法,让机器能够拟合这些数据,帮助我们算出参数w

在这里插入图片描述

我们可以先随机选一条过原点的直线,然后计算所有点到该直线的偏离程度(即误差)

在这里插入图片描述

再根据误差大小调整直线的斜率w,这里的y=wx就是预测函数

2.损失函数(loss function)/代价函数(cost function)
对于一个点(x1,y1),误差e1=y1-wx1

在这里插入图片描述

这里使用最小平方误差(Ordinary Least Squares, OLS),即将误差平方

在这里插入图片描述

将所有点的误差平方再展开,其中x1,y1,n均为已知数

在这里插入图片描述

将其相加求平均,再合并同类项
其中a>0

在这里插入图片描述

即可表示为

在这里插入图片描述

即代价函数cost/损失函数loss

在这里插入图片描述

在这里插入图片描述

这样就完成了预测函数到代价函数的映射过程,随着左图w的增大,右图的点向右移动

在这里插入图片描述

3.梯度计算
我们的目的是实现损失最小,即抛物线取得最小值时参数w的值
假设起始点在曲线上任意一处,寻找最低点的过程就是梯度下降
选择的下降方向是切线方向/梯度的反方向/陡峭程度最大的方向

梯度(gradient)是代价函数的导数
在这里插入图片描述

4.学习率(learning rate)
每一次更新参数利用多少误差, 就需要通过一个参数来控制, 这个参数就是学习率,也称为步长。
选择最优学习率是很重要的,因为它决定了我们是否可以迅速收敛到全局最小值。
小的学习率需要多次更新才能达到最低点,并且需要花费很多时间,且很容易仅收敛到局部极小值
学习率过大会导致剧烈的更新,可能总是在全局最小值附近,但是从未收敛到全局最小值
最佳学习率迅速达到最低点

在这里插入图片描述

每次新的w=旧的w-斜率*学习率
其中斜率=f导=梯度

在这里插入图片描述
循环迭代过程:定义代价函数→选择起始点→计算梯度→按学习率前进→计算梯度→按学习率前进→…到达最低点

二.线性回归(Linear Regression)
线性回归是一种统计学和机器学习中常用的预测方法,用于建立一个自变量(或称为特征)与因变量之间的线性关系模型。它假设自变量和因变量之间存在一个线性关系,并尝试通过拟合一条最佳拟合直线(或超平面)来进行预测。线性回归的目标是通过最小化预测值与实际观测值之间的差异(误差或残差)来找到最佳拟合直线或超平面。

在简单线性回归中,只有一个自变量和一个因变量之间的关系。这可以表示为一条直线的方程:y=wx+b
通过该预测函数我们可以得到误差 e=(wx+b-y)²
误差求和得到损失函数loss
在这里插入图片描述
目的是找到最小loss(error)时w和b的值

在这里插入图片描述

对于一个二元一次方程组,我们通常使用两式相减的方式求出参数b和w的值。这种可以精确求解的我们叫做闭合解(Closed-form Solution,也称封闭解)
在这里插入图片描述
但实际数据是有误差的,我们只能求得近似解
即实际的y=wx+b+ε,这里的ε叫做高斯噪声,由于高斯噪声的存在使得数据有误差
通过x和y的多组数据可以使结果更接近Closed-form Solution
在这里插入图片描述

下面使用代码实现二元一次方程组的求解

数据下载:提取码:zn73
数据点集合的每一行表示一个数据点,第一列是自变量 xi,第二列是因变量 yi

在这里插入图片描述

1.计算线性回归模型的误差函数
代码通过迭代遍历每个数据点,计算该数据点在回归模型下的预测值与实际观测值之间的误差。然后将每个误差的平方累加到总误差 totalError 中。最后,通过将总误差除以数据点的数量,计算出平均误差并返回。

在这里插入图片描述

通过索引操作 points[i,0],我们可以获取第 i 个数据点的自变量 x 的值,因为它位于每行的第一列(索引为 0)
类似地,通过 points[i,1],我们可以获取第 i 个数据点的因变量 y 的值,因为它位于每行的第二列(索引为 1)
b: 回归模型的截距。
w: 回归模型的斜率。
points: 数据点的集合,其中每个数据点由自变量 x 和因变量 y 组成。

def compute_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=(y-(w*x+b))**2
    return totalError/float(len(points))

2.梯度下降中的参数更新
首先初始化截距梯度 b_gradient 和斜率梯度 w_gradient 为 0。然后,通过迭代遍历每个数据点,计算每个数据点对应的梯度值,以便在下一步更新中使用。对于每个数据点,根据当前的截距和斜率计算出预测值,然后根据预测值与实际观测值之间的误差来计算梯度。最后,将所有数据点的梯度累加到总梯度中,并除以数据点的数量 N,以获得平均梯度。接下来使用梯度下降的更新规则来更新截距和斜率。根据当前的截距和斜率值,分别减去学习率乘以对应的梯度,得到新的截距 new_b 和斜率 new_w。最后,将更新后的截距和斜率作为列表返回。

在这里插入图片描述
b_current: 当前的截距值。
w_current: 当前的斜率值。
points: 数据点的集合,其中每个数据点由自变量 x 和因变量 y 组成。
learningRate: 学习率,用于控制每次更新的步长。

def step_gradient(b_current,w_current,points,learningRate):
    b_gradient=0
    w_gradient=0
    N=float(len(points))
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient+=(2*(w_current*x+b_current-y))/N  # 对b偏导
        w_gradient+=(2*(w_current*x+b_current-y)*x)/N  # 对w偏导
    new_b=b_current-learningRate*b_gradient
    new_w=w_current-learningRate*w_gradient
    return [new_b,new_w]

3.梯度下降算法的主要循环部分
points: 数据点的集合,其中每个数据点由自变量 x 和因变量 y 组成。
starting_b: 初始的截距值。
starting_w: 初始的斜率值。
learning_rate: 学习率,用于控制每次更新的步长。
num_iterations: 迭代次数,表示要运行梯度下降的步骤数。

import numpy as np
def gradient_decent_runner(points,starting_b,starting_w,learing_rate,num_iterations):
    b=starting_b
    w=starting_w
    for i in range(num_iterations):
        b,w=step_gradient(b,w,np.array(points),learing_rate)
    return [b,w]  # 返回最后一次迭代结果,即最终数据

4.运行

def run():
    points=np.genfromtxt("data.csv",delimiter=",")  # data.csv更换为文件的存放地址
    learning_rate=0.0001
    initial_b=0
    initial_w=0
    num_iterations=1000
    print("Starting gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))
    [b,w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)
    print("After {0} interations b={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))

这里的np.genfromtxt 是 NumPy 库中的一个函数,用于从文本文件加载数据并生成一个 NumPy 数组。该函数可以处理各种格式的文本数据,包括逗号分隔值(CSV)文件和具有不同分隔符的文件。
例如:存在一个名为 ‘data.csv’ 的 CSV 文件,其中的数据使用逗号作为分隔符。np.genfromtxt 函数将加载该文件的数据并生成一个 NumPy 数组,存储在变量 data 中,使用 print(data) 即可打印加载的数据。

import numpy as np
# 从名为 'data.csv' 的 CSV 文件中加载数据
data = np.genfromtxt('data.csv', delimiter=',')
# 打印加载的数据
print(data)

完整代码

import numpy as np
def compute_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError+=(y-(w*x+b))**2
    return totalError/float(len(points))
def step_gradient(b_current,w_current,points,learningRate):
    b_gradient=0
    w_gradient=0
    N=float(len(points))
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient+=(2*(w_current*x+b_current-y))/N
        w_gradient+=(2*(w_current*x+b_current-y)*x)/N
    new_b=b_current-learningRate*b_gradient
    new_w=w_current-learningRate*w_gradient
    return [new_b,new_w]
def gradient_descent_runner(points,starting_b,starting_w,learing_rate,num_iterations):
    b=starting_b
    w=starting_w
    for i in range(num_iterations):
        b,w=step_gradient(b,w,np.array(points),learing_rate)
    return [b,w]
def run():
    points=np.genfromtxt("D:/Deep-Learning-with-PyTorch-Tutorials/lesson04-简单回归案例实战/data.csv",delimiter=",")
    learning_rate=0.0001
    initial_b=0
    initial_w=0
    num_iterations=1000
    print("Starting gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))
    [b,w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)
    print("After {0} interations b={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))
run()

运行结果

在这里插入图片描述

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

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

相关文章

无人机电池能不能上高铁以及什么型号的电池可以上高铁

无人机电池能不能上高铁以及什么型号的电池可以上高铁 高铁关于电池的限制电池参数介绍可上高铁的无人机锂电池6S电池3S电池 高铁关于电池的限制 2022年7月1日起施行的《铁路旅客禁止、限制携带和托运物品目录》规定,充电宝、锂电池单块额定能量不超过100Wh 电池参数介绍 明…

HarmonyOS学习路之开发篇—Java UI框架(DependentLayout)

DependentLayout DependentLayout是Java UI框架里的一种常见布局。与DirectionalLayout相比,拥有更多的排布方式,每个组件可以指定相对于其他同级元素的位置,或者指定相对于父组件的位置。 支持的XML属性DependentLayout的共有XML属性继承自…

SpringBoot不在使用@Validated 做参数校验但是不想在Controller层怎么办?

目录 场景再现: 怎么做? 遇到了什么问题? 怎么实现? 场景再现: 某API接口接受加密的json字符串,接受字符串之后先进行解密处理,解密完成之后还要进行参数校验处理,如果参数不合规…

使用 TensorFlow.js 将机器学习引入您的 Web 应用程序

如何使用 TensorFlow.js 在您的 Web 应用程序中实施机器学习 原文作者: Abhay Singh Rathore 机器学习 (ML) 不再是一个崇高、遥不可及的概念。借助 TensorFlow.js 等库,开发人员现在可以将 ML 整合到他们的 Web 应用程序中。例如,您可以创建一个系统&am…

Springcloud之Feign、Hystrix、Ribbon如何设置超时时间

一,概述 我们在微服务调用服务的时候,会使用hystrix、feign和ribbon,比如有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然会失败。 所以,为了构建更为健壮的应…

美味度配方

8 种配料每种配料可以放 1 到 5 克,美味度为配料质量之和,给定一个美味度 n,求解 8 种配料的所有搭配方案及方案数量 。 (本笔记适合学了 Python 循环,正在熟炼的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a…

prisma 学习记录

1、prisma 可以看做是一个 ORM。 安装 prisma npm install prisma -D 初始化 prisma , 并设置要链接的数据库 npx prisma init --datasource-provider sqlite --datasource-provider 要使用的数据库 2、prisma 中的模型, 表示底层数据库中的表或者集合。 生成 Pri…

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C++)

Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C) Baumer工业相机Baumer工业相机BGAPI SDK和图像时间戳的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK获取时间戳的方…

shell脚本进阶1——精读ansible+shell脚本

文章目录 一、脚本规划思路二、主控机shell脚本2.1 脚本输出字体特效2.2 生成菜单栏对话框2.3 配置本地yum源仓库2.4 配置受控机yum源2.5 关闭防火墙和selinux2.6 把docker安装包给受控机2.7 安装docker-compose2.8 安装docker2.9 安装ansible2.10 安装pip2.11 主控本机免密登录…

利用谷歌DevTool解决web网页内存泄漏问题

目录 web网页内存泄漏 主要的内存泄漏来源 利用谷歌DevTool定位内存泄漏问题 性能Performance 主要功能 Performance insights性能数据分析 Memory内存 三种模式 相关概念 解决内存泄漏问题 第一步 :是否内存泄漏:js堆直增不降;降…

Unity3d_Cut\Clipping sphere\CSG(boolean)(裁剪模型重合部分)总结

1、https://liu-if-else.github.io/stencil-buffers-uses-in-unity3d/ 下载:https://github.com/liu-if-else/UnityStencilBufferUses 2、手动切割 Unity 模型切割工具,CSG,任意图案,任意切割_unity csg_唐沢的博客-CSDN博客 3、 Shader Unity Shader学习&#x…

CVPR 2023 | 计算机视觉顶会亮点前瞻

在知识和技术都迅速更新迭代的计算机领域中,国际计算机视觉与模式识别会议(CVPR)是计算机视觉方向的“顶级流量”,引领着学科及相关领域的研究潮流。今天我们为大家带来5篇微软亚洲研究院被 CVPR 2023 收录的论文,主题…

JVM知识点梳理

什么是JVM? JVM是java虚拟机的缩写 ,也是java程式可以实现跨平台的关键。 JVM部分需要知道什么东西? JVM的结构和功能、参数配置、GC回收机制、GC回收器极其优缺点。 JVM结构(栈,程序计数器,方法区&#xf…

基于深度学习的高精度打电话检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度打电话检测识别系统可用于日常生活中或野外来检测与定位打电话目标,利用深度学习算法可实现图片、视频、摄像头等方式的打电话目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

《C# 教程》菜鸟教程学习笔记

学习地址 ######C#有用的网站 C# Programming Guide - 介绍了有关关键的 C# 语言特征以及如何通过 .NET 框架访问 C# 的详细信息。Visual Studio - 下载作为 C# 集成开发环境的 Visual Studio 的最新版本。Go Mono - Mono 是一个允许开发人员简单地创建跨平台应用程序的软件平台…

【每日算法】【203. 移除链表元素】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

Docker基本介绍

一、定义 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整…

UnityVR--UIManager--UI管理1

目录 前言 UI节点的结构 需要用到的组件 1. CanvasGroup 2. Button等控件的OnClick()监听 3. EventTrigger 建立UI工具集 1. 管理UI节点 2. UIBase包含了以下的工具 建立分面板的管理工具——以主面板MainUi为例 前言 UI在项目中的重要性不言而喻,并且UI控件的…

软件设计师第4题

首先,我是备考2023年上半年的考试。 一、历年考试题 历年的考题如下,从表中分析可以看出,动态规划法、排序算法、回溯法、分治法是很大概率考察的算法,尤其是动态规划法,本身其理解难度较高,且可以出的题型…

【计网】第二章 物理层

文章目录 物理层一、物理层的基本概念二、数据通信的基础知识2.1 数据通信系统的模型2.2 有关信道的基本概念2.3 信道的极限容量2.3.1 奈奎斯特定理2.3.1 香农定理2.3.2 信噪比 三、物理层下面的传输媒体3.1 导引型传输媒体3.2 非导引型传输媒体 四、信道复用技术4.1 频分复用 …