机器学习——一元线性回归构造直线,并给出损失函数

目    录

Question

问题分析

1.概念补充

2.流程分析

3.注意

具体实现

最终成果

代码

思考:


Question

在二维平面有n个点,如何画一条直线,使得所有点到该直线距离之和最短

如果能找到,请给出其损失函数

问题分析

1.概念补充

关于损失函数:

也即代价函数,是一个量化误差的表达式

参考链接:线性回归与非线性回归:1.0一元线性回归与代价函数(损失函数)_在一元线性回归中,哪个函数不适用于损失函数(-CSDN博客

本文中我们采用`观测值与实际值差的平方`作为损失函数

具体原理参考链接:知乎形象举例——梯度下降算法

下面是MSE函数,但是我这里就没有除以2了,所以偏导应当有一个2倍

2.流程分析

对于此问题,我们应当按如下步骤进行求解

首先,我们需要对于指定初始的k与b初始化该直线

然后,对学习率(也即步长)和迭代次数进行适当调整

最后,在得到满意的结果后终止调整,整理结果,给出最终参数

3.注意

我们用的并不是直线距离进行损失计算,而是用的△y进行计算,

但是结果并没有影响,因为经过推倒后,距离d与△y成正比

具体实现

本文参考多方资料,使用python代码手写一元线性回归进行求解

计算当前参数下的最小二乘法结果:

def calcLoseFunction(k,b,XData,YData):sum=0for i in range(0,listSize):# 使用偏离值的平方进行累和sum+=(YData[i]-(k*XData[i]+b))**2return sum

梯度下降法进行搜索:

#梯度下降法
def calcGradientCorrection(b, k, XData, YData, learningRate, bfsNums):for i in range(0, bfsNums):sumk, sumb = 0, 0for j in range(0, listSize):# 定义预测值Y'normalNum = k * XData[j] + b# 计算逆梯度累和sumk += -(1 / listSize) * (normalNum - YData[j]) * XData[j]sumb += -(1 / listSize) * (normalNum - YData[j])# 在逆梯度的方向上进行下一步搜索k += learningRate * sumkb += learningRate * sumbreturn k, b

最终成果

采用随机来对点进行生成,大部分测试较为稳定,模型较为拟合

但是由于X,Y都进行随机生成,按照期望来说,在100*100的矩阵范围内数据呈现均匀分布

于是改造Y数据生成方式为:

YData=[XData[i]+generateRandomInteger(-10,10) for i in range(listSize) ]

调整初始斜率k=0.5进行测试,最终结果较为拟合,效果较好

代码

import numpy #发现直接用List就行了
import random
import matplotlib.pyplot as plt
# random.random()
# random.randint(start,stop)
#################全局数据定义区
# 数组大小
listSize=10
# 定义学习率 取尽量小0.001
learningRate=0.0001
#定义初始直线的 斜率k 和 截距b 45° 1单位距离
# 现在设置 k=0.5 检验程序
k,b=0.5,1
#定义迭代次数
bfsNums=9999
#################全局数据定义区END
# 生成随机数
def generateRandomInteger(start, end):# [1-100]return random.randint(start, end)# 打印本次随机生成的X,Y 便于快速粘贴复现
def printXYArray(XData,YData):# 打印Xprint("[", ",".join([str(i) for i in XData]), "]")# 打印Yprint("[", ",".join([str(i) for i in YData]), "]")# 最小二乘法定义损失函数 并计算
#参考链接:https://blog.csdn.net/zy_505775013/article/details/88683460
# 求最小二乘法的最小值 最终结果应当是在learningRate一定情况下  这个最小的sum
def calcLoseFunction(k,b,XData,YData):sum=0for i in range(0,listSize):# 使用偏离值的平方进行累和sum+=(YData[i]-(k*XData[i]+b))**2return sum#梯度下降法
def calcGradientCorrection(b, k, XData, YData, learningRate, bfsNums):for i in range(0, bfsNums):sumk, sumb = 0, 0for j in range(0, listSize):# 定义预测值Y'normalNum = k * XData[j] + b# 计算逆梯度累和  注意这里求偏导应当是两倍 不知道为什么写成1了# 求MSE的偏导sumk += -(2 / listSize) * (normalNum - YData[j]) * XData[j]sumb += -(2 / listSize) * (normalNum - YData[j])# 在逆梯度的方向上进行下一步搜索k += learningRate * sumkb += learningRate * sumbreturn k, b# 随机生成横坐标
XData=[generateRandomInteger(1,100) for i in range(listSize) ]
# 随机生成纵坐标
YData=[XData[i]+generateRandomInteger(-10,10) for i in range(listSize) ]
# 纯随机生成 但是可视化效果不直观
# YData=[generateRandomInteger(1,100) for i in range(listSize) ]
# 死值替换区
# XData=testArrayX
# YData=testArrayYprint("初始选取k={},b={}的情况下的损失函数值为sum={}".format(k,b,calcLoseFunction(k,b,XData,YData)))
# 对k,b进行梯度修正
k,b=calcGradientCorrection(b,k,XData,YData,learningRate,bfsNums)
print("修正后:k={},b={},最小损失sum={}".format(k,b,calcLoseFunction(k,b, XData, YData)))
print("调试数组")
printXYArray(XData,YData)#画图
plt.plot(XData, YData, 'b.')
plt.plot(XData, k*numpy.array(XData)+b, 'r')
plt.show()
print("END")

思考:

如果替换在三维空间会怎么样,如何去求?

答:在三维空间内,我们就需要对三个变量(K1,K2,b)进行偏导求解,然后同样在逆梯度方向上搜索求解。注意要替换对应的损失函数,将直线方程进行替换即可!

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

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

相关文章

数据集笔记:杭州地铁刷卡数据

1 数据位置: 链接: https://pan.baidu.com/s/1iLHomv5NRodB_3jr7FcFow 提取码: arse 全球城市计算AI挑战赛_算法大赛_天池大赛-阿里云天池的赛制 (aliyun.com) 2 数据集介绍 杭州20190101至20190125共25天地铁刷卡数据记录,共涉及3条线路81个地铁站约…

【Linux系统编程】进程状态

文章目录 前言1. 准备工作2. 阻塞、挂起状态的了解2.1 阻塞2.2 挂起 3. 看看Linux内核源代码怎么说4. R运行状态(running)5. S休眠状态(sleeping)6. D不可中断休眠状态7. T暂停状态(stopped)8. t 追踪暂停状态 (tracin…

设计模式6、适配器模式 Adapter

解释说明:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 目标接口(Target):当前系统所期待的接口,它可以是抽象类或接口 适配者(Adaptee)&#xff1a…

C#(CSharp)入门实践项目(简易回合制游戏)

项目名称 木木夕营救公主 项目介绍 这是一个小游戏,你将扮演一个英雄(木木夕),去打败恶龙,拯救出公主,该项目采用回合制战斗模式,由于角色的血量和攻击为随机数,所以需要靠运气才…

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理 引言1.1 多数据源的必要性1.2 多数据源的应用场景 实战演示2.1 创建实体类2.2 配置数据源2.3 实现数据源配置类2.4 配置Repository类2.5 运行与验证 事务管理与数据一致性3.1 事务管理3.2 使用Se…

变电站无人值守方案:提升效率与增强安全性

随着信息技术、人工智能、大数据的发展进步,电力行业正逐步向智能化转型。其中,无人值守变电站成为了现代电力系统的明显趋势。这种新型的运营模式不仅提高了效率,还极大地增强了电力系统的安全性。 无人值守变电站的核心概念是在没有人类现场…

Adams齿轮副

1.运动副 添加旋转副的时候,必须先物体后公共part(即此处的ground),最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副,和啮合点,即cv marker ,必须属…

win10打开VMware 16 pro里面的虚拟机就蓝屏怎么办

2023年9月30日,周六下午 今天下午我也遇到了这个问题,后来解决了,于是记录一下我的解决办法 目录 1、打开控制面板,并选择“程序和功能” 2、点击“启动或关闭Windows服务” 3、勾选两个服务 4、重启电脑,大功告成…

【CMU15-445 Part-14】Query Planning Optimization I

Part14-Query Planning & Optimization I SQL is Declarative,只告诉想要什么而不需要说怎么做。 IBM System R是第一个实现query optimizer查询优化器的系统 Heuristics / Rules 条件触发 静态规则,重写query来remove 低效或者愚蠢的东西&#xf…

牛客 ( 计算几何

#include <bits/stdc.h> using namespace std; using ll long long; using PII pair<double , double>; int n; PII p[3000010]; vector<PII> pp; PII yuan(PII a , PII b , PII c) {//已知三个点确定圆的半径和圆心double x1 a.first,x2 b.first,x3 c.…

华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器管理、控制、访问评测

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之体验评测&#xff1a;华为云云耀云服务器管理、控制、访问评测 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

协议-TCP协议-基础概念02-TCP握手被拒绝-内核参数-指数退避原则-TCP窗口-TCP重传

协议-TCP协议-基础概念02-TCP握手被拒绝-TCP窗口 参考来源&#xff1a; 《极客专栏-网络排查案例课》 TCP连接都是TCP协议沟通的吗&#xff1f; 不是 如果服务端不想接受这次握手&#xff0c;它会怎么做呢&#xff1f; 内核参数中与TCP重试有关的参数(两个) -net.ipv4.tc…

asp.net企业生产管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 企业生产管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 二、功能介绍 (1)用户管理&…

索尼 toio™应用创意开发征文|检测工业平台震动

虽然索尼toio Q宝机器人主要是为儿童教育娱乐开发的&#xff0c;但我认为它在工业等领域也有一定应用潜力。例如&#xff0c;工业领域经常会有某些平面在实际作业中持续震动&#xff0c;导致零件过疲劳、平台失去稳定等问题。而这样的平台往往位于机器内部&#xff0c;从外部很…

TensorFlow学习1:使用官方模型进行图片分类

前言 人工智能以后会越来越发达&#xff0c;趁着现在简单学习一下。机器学习框架有很多&#xff0c;这里觉得学习谷歌的 TensorFlow&#xff0c;谷歌的技术还是很有保证的&#xff0c;另外TensorFlow 的中文文档真的很友好。 文档&#xff1a; https://tensorflow.google.cn/…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

ubuntu安装PhotoPrism,并开启安卓照片同步

之前安装了黑群晖7.2&#xff0c;并开启了Photo&#xff0c;照片同步用的挺好。唯一的缺陷是群晖的照片搜索太弱鸡了&#xff0c;基本上关键字搜索是一点不可用&#xff0c;常见的“花”&#xff0c;“山”&#xff0c;“文件”&#xff0c;“证件”都是不可用的。 后来了解到了…

Ubuntu基于Docker快速配置GDAL的Python、C++环境

本文介绍在Linux的Ubuntu操作系统中&#xff0c;基于Docker快速配置Python、C等不同编程语言均可用的地理数据处理库GDAL的方法。 首先&#xff0c;我们访问GDAL库的Docker镜像官方网站&#xff08;https://github.com/OSGeo/gdal/tree/master/docker&#xff09;。其中&#x…

DAMA-DMBOK2重点知识整理CDGA/CDGP——第14章 大数据与数据科学

目录 一、分值分布 二、重点知识梳理 1、引言 1.1 业务驱动因素 1.2 原则 1.3 基本理念 2、活动 2.1 定义大数据战略和业务需求 2.2 选择数据源 2.3 获得和接收数据源 2.4 制定数据假设和方法 2.5 集成和调整数据进行分析 2.6 使用模型探索数据 2.7 部署和监控 …

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…