Python实现线性回归(公式推导+源代码)

article/2025/8/24 19:47:37

写这篇文章之前,首先要对自己做一个小小的反思,很多时候在学习新技术的时候,看到出了什么什么框架,在这个框架上什么什么方法可以直接拿过来用,这样的好处就是我们可以减少写代码量,几个函数就可以帮我们解决需要写几十行代码才能解决的问题。这样看起来很好是建立在你对这个函数的底层有一个深入研究,如果你是一个新手,第一次你可能在网上查阅资料明白一个大概,但是你下次还是不会,究其原因:知其然,而不知其所以然。

对我而言,我身上也存在着这种通病,为了能:知其然,知其所以然。于是乎,我打算在学习机器学习算法的过程中,不调用机器学习函数库里面的一些封装方法,通过纯Python去实现,这一篇文章算是作为我践行:知其然,知其所以然这种思想的第一步。

好了,话不多说,开始进入我们的主题。

线性回归,就是能够用一条直线较为精确地描述数据之间的关系。这样当出现新的数据的时候,就能够预测出一个简单的值。线性回归中最常见的就是房价的问题。

在这里插入图片描述在这里插入图片描述

左图代表的是房价(纵坐标)与房间面积(横坐标)的关系,右图代表的是通过一条直线f = kx + b 来预测房屋关系。通过这条直线我们就可以大概知道房间面积对应的房价。

下面我们通过一个具体的例子通过Python来实现一个简单的线性回归

比如我们有一组数据,数据的格式如下所示(数据地址):

       

我们将这些数据通过python绘制出来,如下所示:

然后我们需要做的是找一条直线去最大化的拟合这些点,理想情况是所有点都落在直线上。希望所有点离直线的距离最近。简单起见,将距离求平方,误差可以表示为

image.png

找到最能拟合数据的直线,也就是最小化误差。通常我们使用的是最小二乘法

上述公式只有m, b未知,因此可以看最一个m, b的二次方程,求Loss的问题就转变成了求极值问题。 这里不做详细说明。另每个变量的偏导数为0, 求方程组的解。

image.png

image.png

然后我们通过梯度下降的方法去更新m和b。

在动手写算法之前我们需要理一下编写思路。回归模型主体部分较为简单,关键在于如何在给出 MSE损失函数之后基于梯度下降的参数更新过程。首先我们需要写出模型的主体和损失函数以及基于损失函数的参数求导结果,然后对参数进行初始化,最后写出基于梯度下降法的参数更新过程。

import numpy as np
import matplotlib.pyplot as plt# 计算loss
def liner_loss(w,b,data):""":param w::param b::param data::return:"""x = data[:,0]  # 代表的是第一列数据y = data[:,1]  # 代表的是第二列数据# 损失函数:使用的是均方误差(MES)损失loss = np.sum((y - w * x - b) ** 2) / data.shape[0]# 返回lossreturn loss# 计算梯度并更新参数
def liner_gradient(w,b,data,lr):""":param w::param b::param data::param lr::return:"""# 数据集行数N = float(len(data))# 提取数据x = data[:,0]y = data[:,1]# 求梯度dw = np.sum(-(2 / N) * x * (y - w * x -b))db = np.sum(-(2 / N) * (y - w * x -b))# 更新参数w = w - (lr * dw)b = b - (lr * db)return w,b# 每次迭代做梯度下降
def optimer(data,w,b,lr,epcoh):""":param data::param w::param b::param lr::param epcoh:训练的次数:return:"""for i in range(epcoh):# 通过每次循环不断更新w,b的值w,b = liner_gradient(w,b,data,lr)# 每训练100次更新下loss值if i % 100 == 0 :print('epoch {0}:loss={1}'.format(i,liner_loss(w,b,data)))return w,b# 绘图
def plot_data(data,w,b):""":param data::param w::param b:"""x = data[:,0]y = data[:,1]y_predict = w * x + bplt.plot(x, y, 'o')plt.plot(x, y_predict, 'k-')plt.show()def liner_regression():"""构建模型"""# 加载数据data = np.loadtxt('D:\python-workspace\Machine_Learing\Regression\data.csv',delimiter=',')# 显示原始数据的分布x = data[:, 0]y = data[:, 1]plt.plot(x, y, 'o')plt.show()# 初始化参数lr = 0.01  # 学习率epoch = 1000  # 训练次数w = 0.0  # 权重b = 0.0  # 偏置# 输出各个参数初始值print('initial variables:\n initial_b = {0}\n intial_w = {1}\n loss of begin = {2} \n'\.format(b,w,liner_loss(w,b,data)))# 更新w和bw,b = optimer(data,w,b,lr,epoch)# 输出各个参数的最终值print('final formula parmaters:\n b = {1}\n w = {2}\n loss of end = {3} \n'.format(epoch,b,w,liner_loss(w,b,data)))# 显示plot_data(data,w,b)if __name__ == '__main__':liner_regression()

然后我们运行,结果如下:

initial variables:
 initial_b = 0.0
 intial_w = 0.0
 loss of begin = 184.68365853658537 

 

epoch 0:loss=3.265436338536489
epoch 100:loss=1.4187213286545117
epoch 200:loss=1.3652986742281288
epoch 300:loss=1.3437697330412992
epoch 400:loss=1.3350937263246236
epoch 500:loss=1.3315973587190568
epoch 600:loss=1.330188348003359
epoch 700:loss=1.329620526932774
epoch 800:loss=1.3293916991711343
epoch 900:loss=1.3292994832474747


final formula parmaters:
 b = 1.2393038013472177
 w = 1.8672419688724071
 loss of end = 1.3292625499252577 

 

 

 

 

 

 

 

 

 

 

 

 

好了,以上就是Python实现的一个简单的线性回归。

不积跬步,无以至千里。加油!


http://chatgpt.dhexx.cn/article/34FlvZyw.shtml

相关文章

线性回归方程推导

理论推导 机器学习所针对的问题有两种:一种是回归,一种是分类。回归是解决连续数据的预测问题,而分类是解决离散数据的预测问题。线性回归是一个典型的回归问题。其实我们在中学时期就接触过,叫最小二乘法。 线性回归试图学得一个…

线性回归相关知识及公式推导

转自https://www.cnblogs.com/GuoJiaSheng/p/3928160.html 在现实生活中普遍存在着变量之间的关系,有确定的和非确定的。确定关系指的是变量之间可以使用函数关系式表示,还有一种是属于非确定的(相关),比如人的身高和…

线性模型(二)-- 线性回归公式推导

我们在初中学习线性方程的时候就已经接触过回归的相关概念,在这里简单介绍一下机器学习中的“回归”,机器学习的目的有两个:回归和分类,回归是解决连续数据的预测问题,而分类是为了解决离散数据的预测问题。线性回归是…

一元线性回归公式推导

一元线性回归公式推导 平均损失函数: 对w,b求偏导: 可求解(先求b,再求w): 或: 这两个式子中的w是等价de,可由第一个w分子分母同除n,再由下式得到第二个w: 参考文献: https://zhidao.baidu.com/q…

线性回归模型公式推导

线性回归公式推导 线性模型一、线性回归(一)一元线性回归1. 由最小二乘法得出损失函数2. 证明损失函数 E ( w , b ) E(w,b) E(w,b)是关于 w w w和 b b b的凸函数3. 对损失函数求关于b和w的一阶偏导数4. 令一阶偏导数为0解出 w w w和 b b b (二…

线性回归--公式推导

线性回归 -- LIner regression 线性回归&#xff08;Linear regression&#xff09;是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 —维基百科 线性回归--理论推导 <1> 数据: 本次推导使用的数据为--银行贷款数据。 &…

线性回归原理及算法

今天给大家的介绍一下线性模型&#xff0c;线性回归模型虽说模型简单&#xff0c;但距今为止依旧在机器学习算法中占据一定的地位&#xff0c;不仅如此&#xff0c;而且在实际的业务应用中也是屡试不爽的机器学习算法。 线性回归模型公式&#xff1a;YXwb &#xff08;一个X变量…

机器学习之线性回归

线性回归是最简单的一个函数拟合过程&#xff0c;一元线性回归公式为yaxb。 我们做拟合&#xff0c;首先需要定义一个损失函数。一般常用的损失函数有&#xff1a;0-1损失函数和绝对值损失函数 0-1损失是指&#xff0c;预测值和目标值不相等为1&#xff0c;否则为0&#xff1a;…

在线Cron表达式生成器,定时任务表达式生成器

近期项目需要在后台管理系统的页面上生成定时任务表达式存入定时任务系统的数据库中&#xff0c;就是那种根据后台管理员指定的时分秒年月日生成一个定时任务表达式。 一时间有点不好下手。我可以根据后台管理员指定的时分秒年月日手动写一个定时任务表达式&#xff0c;也可以…

在线QuartzCron定时任务表达式在线生成

在线QuartzCron定时任务表达式在线生成 在线QuartzCron定时任务表达式在线生成 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要的功能就是调度器(完成定时任务)。本工具可以在线生成QuartzCron表达式 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要…

Android Studio修改应用名称及应用图标

一、修改应用名称 找到src/main/AndroidManifest.xml文件&#xff1a; android:label后面配置的就是应用名称配置路径或应用名称。 方式1&#xff1a;android:label"xxx应用"&#xff08;应用名称显示xxx应用&#xff09; 方式2&#xff1a;android:label"st…

Android修改应用程序图标和名字

Android修改应用程序图标和名字 对于一个APP应用程序来说&#xff0c;最鲜明的就是APP的图标和名字了。 修改应用图标 在res/drawable中保存一个jpg或者png的图片文件。(png支持透明度) 例&#xff1a;在drawable中保存icon.jpg文件修改AndroidManifest.xml中application的a…

flutter 修改app名字和图标(安卓)

安卓 修改名字: 找到flutter项目下面的android>app>src>main>AndroidManifest.xml 修改里面的android:label"改成你要的名字" 修改图标: 找到android>app>src>main>res里面的mipmap-xx文件夹修改里面的图标 一件生成多种格式的图标: http…

android studio修改app图标

一、修改图标文件 1.找到项目下的多个mipmap-目录&#xff08;如下图&#xff09;&#xff0c;将要修改的图片在每个目录中都放入一份 2.再找到mipmap-anydpi-v26目录&#xff08;如下图&#xff09;&#xff0c;修改目录中两个文件的内容&#xff0c;使其指向我们上一步放入的…

如何修改安卓应用图标和程序名称

安卓修改大师可以在没有源代码的情况下&#xff0c;直接反编译已经打包的APK安装包&#xff0c;通过修改SMALI代码实现添加和去除部分功能&#xff0c;也可以通过修改应用图标和应用程序名称实现个性化应用&#xff0c;甚至可以通过修改应用程序配置参数&#xff08;内置统计参…

修改app图标

修改app图标 1.准备三个尺寸的.png图片 &#xff08;注&#xff1a;一定要是.png后缀的图片&#xff09;,分别命名为xx.png, xx2x.png, xx3x.png; 2.在项目中找到项目->Resource->AppLogo,把三个尺寸的图片拉入项目中&#xff0c;选择Copy items if needed、Create gr…

如何修改软件名称及图标,非常详细

所需工具 MT管理器&#xff1a;下载 理论&#xff1a; 补充android:versionName"2.4"是版本号 实战&#xff1a; 修改图标 wzry.png就是刚刚复制进来的图片名称 图标修改完成 下面开始修改名称&#xff1a;

iOS开发技巧:设置App icon图标及修改应用程序名

前言 这是iOS开发技巧系列博客的第二篇&#xff0c;本篇主要简单介绍一下如何设置应用程序的icon图标以及修改应用程序名。 设置 icon 首先我们来看看如何设置App icon图标&#xff0c;设置应用程序的icon图标主要有两种方法&#xff1a; 第一种&#xff1a;通过项目的Imag…

更换app图标和名称

更换app图标和名称 参考地址&#xff1a; https://blog.csdn.net/pla12147111/article/details/97684488 预装&#xff1a;预装雷电模拟器3.59 和 AndroidKiller.exe 打开后等待反编译成功 更换文字&#xff0c;首先在模拟器中安装app查看app图标和名称 打开工具&#xf…

Android Studio中修改APP图标和APP名称

Android Studio生成的APP默认图标是经典的机器人图标。可以通过Android Studio实现APP图标和名称的修改。 1 修改APP图标 在程序对应的AndroidMenifest.xml中指定了该APP的图标。 <application>......android:icon"mipmap/ic_launcher"</application>…