Python 手写线性回归算法竟如此简单

python机器学习-线性回归(LinearRegression)算法 用python进行线性回归分析非常方便,如果看代码长度你会发现真的太简单。但是要灵活运用就需要很清楚的知道线性回归原理及应用场景。现在我来总结一下用python来做线性回归的思路及原理。 线性回归应用场景 线性回归介绍 机器学习中的线性回归 简单的线性回顾实例 线性回归应用场景 线性回归介绍 ——线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系... 阅读详情

摘要:通俗易懂介绍线性回归算法,并 Python 手写实现。

之前我们介绍了:kNN 算法,主要用于解决分类问题,也可以解决回归问题,它有很多优缺点,其中一个缺点是模型结果不具有可解释性,而很多时候我们是希望得到的模型是能够作出合理解释的,以便指导业务。今天要介绍的线性回归(Linear Regression)模型就是一个很好的可解释模型。\

Python资源共享群:484031800

比如建立了一个关于房价和房屋面积的线性回归模型:y(房价)= 15000*x(房屋面积)+ 100

就可以解释成:房屋面积每增加一平米,房价就会增加 15,000 元。

除了这个优点以外,线性回归还有一个重要的优点是它是很多机器学习算法的基础,比如之后会介绍的多项式回归、逻辑回归、svm。通常在建立复杂的模型前都会先尝试一下线性回归模型,所以很有必要学好它。

相比与 kNN 模型,我们更熟悉线性回归,因为它和初中学过的一元函数 y = k*x + b很像,算法思想也比较简单,仅多了一点数学公式推导。

下面依然通过一个小场景切入该算法:

01 场景代入

小花是一家房屋中介销售员,一天有个客户打电话过来说,想卖掉自己一套 80 平米的房子,问小花这边能报价多少。小花说稍后给客户报价,放下电话后赶紧查看过往房屋销售记录,想从中找个参考价格,但发现此前并没有接手过 80 平米的房子,便一下犯了难不知道报多少合适:报高了自己吃亏,报少了客户可能去别家。

作为小花的同事,你把一切看在眼里,善解人意地问她是否需要帮忙,她如找到救星一般,一边点头一边抓住你的手,拜托你给她个参考价出来。你不慌不忙拿出纸笔,一顿狂算后给了小花一个答案:125 万,在这个基准价上可以再适当调整。

小花告诉了客户后很顺利地拿下这一单。走到你跟前抛来崇拜的眼神,说下班要请你吃饭,你口头忙说不用客气心里却万马奔腾。下了班小花带你去了一家她和闺蜜常去的店,还专门点了瓶红酒。喝到微醺恍惚之时,你发觉不知什么时候小花坐到了你身边,你面红耳赤小心脏扑通直跳,不敢想接下来会发生什么,只好装懵闭上了眼睛。只感觉小花越来越近,近到快贴到耳根边,感觉要发生点什么的时候,听到她飘来一句:那个房自你为什么确定报价 125 万?

你睁开眼发现小花坐在对面认真地在等你的回答,才发觉刚才是自己在 YY,只好抛出一句自己的口头禅来化解尴尬:无他,唯机器学习熟尔。

段子编完了。。。


02 线性回归解释

下面我们就用线性回归来解决为什么 80 平米的房报价 125 万这个问题。分为两步:抽象出线性回归模型,接着 Python 手写代码预测结果。

由于小花手上只有一组少量的房屋成交记录,这组记录由房屋面积和报价两列数据组成(为了建模而作的简单假设),因此,我们可以将其绘制到坐标轴中(横轴是房屋面积,纵轴是房价),如下面红点所示:

 

 

 

 

 

现在,需要根据这组数据去给客户 80 平米的房子预测出一个合理价格。显然,仅凭这几个散点找不到任何规律,房价可以假设成很多值:

 

 

 

 

 

不过,我们看到房价和房屋面积呈现一定的线性关系,于是自然地想到是否可以画出一条直线,能够最大化地拟合住所有红色样本点。这条直线能够代表样本的总体规律,从而可以建立一个线性方程:y = ax + b,将 x = 80 代入该方程就可以得到最合适的房价:

 

 

 

 

 

不过新的问题来了,如何确定这条直线就能够最大化拟合红色样本点?因为可以画出很多这样的直线:

 

 

 

 

 

可以这样来想:图中每个样本都有预测房价和实际房价,且每条直线的预测房价不尽相同,那么可以使用这一个方法来判断直线拟合程度的好坏:

计算各直线上全部样本点的实际房价和预测房价的差值,求出它们的总和,对比哪条直线的总和最小,就认为该条直线拟合效果最好。

不过差值有正有负,为了避免相互抵消,可以换成计算差值的平方和:

 

 

 

 

 

 

 

 

 

 

这个平方和计算公式也叫损失函数(loss function),损失的意思就是指没有拟合到真实值的部分。

另外,这里的未知数不再是 x 和 y (x y 都是已知样本值)而是斜率 a 和 截距 b,相当于是关于 a 和 b 的二次方程。我们知道它是一条抛物线,有最小值。

所以,我们的目的从找到一条最大化拟合住所有红色样本点的直线,转变成找到一条损失函数值最小的直线 。

寻找这条直线显然不能靠手动划线去找,因为穷举不完。可以换个思路:求出该损失函数的最小值,反解出未知数 a 和 b,就可以找到这条直线。

如何求该函数的最小值呢?这就可以用到中学学过的函数求导来解决,让导函数等于 0 就能找到函数最小值。

到这儿,我们的找直线问题最终变成了数学求导。

求导不难高中数学知识就够,下面来一步步写下:

03 线性回归公式推导

为了方便求导,令该损失函数等于 J(a,b),分别对 a 和 b 求偏导,令其等于 0 求解 a 和 b 的值:

 

 

 

 

 

b 的形式简单些,所以先对 b 求导:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

很容易就能求出 b 的值:y 的均值减去 a 乘以 x 的均值:

 

 

 

 

 

 

 

 

 

 

由于,我们已有全部样本点的 x 和 y 值,所以均值很容易计算,只需要求出 a。

下面来推导 a ,会稍微复杂点:

 

 

 

 

 

 

 

 

 

 

把 b 代入:

 

 

 

 

 

分别乘入 x^{(i)}:

 

 

 

 

 

 

 

 

 

 

将 a 整理合并:

 

 

 

 

 

 

 

 

 

 

最后就能求出 a:

 

 

 

 

 

不过该公式略复杂,还可以进一步整理让 a 跟 x 和 y 的均值产生联系。对分子第二项做变换:

 

 

 

 

 

变换后,发现 x 和 y 对调后上式也成立,接着再从另一个角度变换:

 

 

 

 

 

这样就可以对 a 的表达式做替换,分子和分母都加一项再减去相等的一项(等于没加没减):

 

 

 

 

 

凑成这样的形式是为了变换:分子可以合并因式分解项,分母可以写成完全平方公式:

 

 

 

 

 

到这里, a 和 b 的计算公式就都和 x 和 y 的均值产生联系,很容易能求出来:

 

 

 

 

 

数学公式推导出来后,简单的几行 Python 代码就可以计算出 a 和 b,有了 a 和 b 就能解出直线 y 的表达式,从而绘制出前面的最佳拟合直线。

04 Python 手写线性回归

 

 

 

 

 

 

 

 

 

 

 

可以看到,数学是编程的基础很重要,如果觉得推导过程难可以不用管它,只需记住 a 和 b 的表达式就可以编程实现。

到这儿我们介绍了线性回归算法,并用简单的 Python 代码实现了它,解决了房价为什么是 125 万的问题。

进一步地我们还可以像调用 sklearn 库一样,把这些代码封装成一个名为 SimpleLinearRegression 的库方便快速调用:

 

 

 

 

 

上面这些代码是模仿 sklearn 底层编写的,写好后在 jupyter notebook 中就可以调用该类方法:

 

 

 

 

 

可以看到我们得到了一样的 a 和 b 以及房价,初步完整地实现了线性回归算法代码。


不过发现了一个问题就是前面在计算斜率 a 的值时,使用了 for 循环这种低效率计算方法,当数据量很大时算法运行会变慢。

那么有什么优化方法么?有的,就是使用:向量化运算,它可以将算法运行效率提升一到两个数量级。

下面具体介绍下如何使用向量化运算改进,只需要两行代码。

05 向量化加速线性回归运算

我们换个角度来看上面的斜率 a 计算公式,可以把 a 的分子和分母都看成是两个向量 w v 的每一个元素相乘再相加 :

 

 

 

 

 

即分子分母都看成是这样的形式:

 

 

 

 

 

这里的 w 和 v 向量都有 m 个元素:

 

 

 

 

 

其实向量相乘再相加,就是向量的点积公式即:

 

 

 

 

 

这样就可以不用 for 循环而直接用 numpy 的向量点积公式 np.dot 计算分子分母的值:

# np.dot 向量化计算分子分母 
num = (x-x_mean).dot(y-y_mean)
dom = (x-x_mean).dot(x-x_mean)

进而求出 a 和 b:

 

 

 

 

 

可以看到,a 和 b 的值和 for 循环结果相同,两行代码就解决了。

刚才说当数据量很大时,for 循环计算效率很低,而向量化运算则会快很多,由于我们例举的数据集很小所以体现不出二者性能区别。下面重新生成一个 100 万的大数据集测试一下:

 

 

 

 

 

上面模拟生成了一个在 y = 3*x + 1 直线附近的数据集,首先使用 for 循环拟合(lr.fit),程序平均运行时间在 1.41s,接着使用向量化拟合(lr.fit2),平均运行时间只有 24.2 ms,二者相差了 50 倍!性能差距很大。

所以,线性回归算法实现时尽量使用向量化运算这种方式。

06 调用 sklearn 线性回归算法

最后,我们来熟悉使用下 sklearn 中的线性回归算法,只需要 5 行代码:

from sklearn.linear_model import LinearRegression 
lr = LinearRegression()
lr.fit(x,y)
x_predict = np.array([55, 80])
y_predict = lr.predict(x_predict)
# [out]:
    array([[ 76.94915254],
             [124.40677966]])

从 sklearn 的 linear_model 方法中调用线性回归库 LinearRegression,实例化之后在训练集(x,y)上 fit 拟合,然后在预测集上 (x_predict) 预测得到 y 值(预测房价),结果和我们刚才手写的一样。

sklearn 库调用起来很简单,但是只有自己动手去写一遍才能更深刻理解该算法。

以上就是线性回归算法的第一篇文章,算法介绍完了我们还需要知道如何评价其效果好坏,下一篇文章将介绍线性回归的几个评价指标。

python机器学习手写算法系列——线性回归 本文致力于手把手教你实现一个最简单的机器学习模型--一元线性回归模型。短短的14行代码,就实现了。希望读完以后,你也能自己实现它。并对线性回归有更好的了解,或者从不了解到了解。 阅读详情

相关推荐

python实现基于KNN算法的手写数字识别系统 非常详细!!!!

可爱聪明善良的你关注有惊喜哦 实验知识点: 1、K 近邻分类算法 2、从文本文件中解析和导入数据 3、使用 Matplotlib 创建扩散图 4、归一化数值 首先介绍下监督学习和无监督学习: 监督学习:(数据有输入有输出),通过已有的一部分数据和输出数据之间的相应关系,生成一个函数,将输入映射到合适的输出,在准确的说有监督学习就是训练样本中必须有标签或者标记; 无监督学习:(数据只有输入),给定...

springhammer的博客 2万+

Python手写线性回归算法

作者 |苏南下来源 |机器会学习ML(ID:AI_Learning007)摘要:通俗易懂介绍线性回归算法,并 Python 手写实现。之前我们介绍了:kNN 算法,主...

Python大本营的博客 1365

手写算法-Python代码实现非线性回归

手写算法-Python代码实现非线性回归生成非线性数据集1、用线性回归拟合2、多项式拟合sklearn实现,校验系数的结果总结 生成非线性数据集 前面我们介绍了Python代码实现线性回归,今天,我们来聊一聊当数据呈现非线性时,这时我们继续用线性表达式去拟合,显然效果会很差,那我们该怎么处理?继续上实例(我们的代码里用到的数据集尽量直接由Python生成,因此,是可以全部跑通的,有需要的同学,建议大家粘贴复现一下,多思考,多动手,才可以学的更好。) import numpy as np from matpl

weixin_44700798的博客 1万+

python 手写代码实现线性回归

一元一次 导包 import numpy as np import matplotlib.pyplot as plt %matplotlib inline from sklearn.linear_model import LinearRegression 创建数据 X = np.linspace(2,10,20).reshape(-1,1) # f(x) = wx + b y = np.r...

流沙 2144

【机器学习小论文】sklearn线性回归LinearRegression代码及调参

一、前言 最近在写小论文,就是硕士毕业论文的部分成果,需要用到线性回归,所以就把相关代码贴上,便于日后写论文时总结,也顺便给后来者提供思路。小论文的思路主要是,先用线性回归,再用随机森林,最后再用xgboost,来预测房价,最后得出结论。所以,这个会陆续的贴出相关代码。至于数据清洗那一块,暂时不贴上了,主要原因就是数据清洗不容易,并且每个人的清洗方法也不一样,所以主要还是看思路。 二、算法简介 2.1 什么是回归分析 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关

xiaohutong1991的专栏 7107

线性回归原理及python实现

文件为pdf格式,详细叙述了线性回归原理,并对一元线性回归和二元线性回归附上了python示例代码。 博客地址:https://blog.youkuaiyun.com/Albert201605/article/details/81984974

【Python】手写线性回归——梯度下降法的包

机器学习入门,手写python线性回归模型、梯度下降法的包,包括理论推导、代码、数据集

I_no_know_answer的博客 1761

Python实现的简单线性回归算法实例分析

本文实例讲述了Python实现的简单线性回归算法。分享给大家供大家参考,具体如下: 用python实现R的线性模型(lm)中一元线性回归的简单方法,使用R的women示例数据,R的运行结果: > summary(fit) Call: lm(formula = weight ~ height, data = women) Residuals:     Min      1Q  Median      3Q     Max -1.7333 -1.1333 -0.3833  0.7417  3.1167 Coefficients:              Estimate Std. Error

Pytorch手写线性回归案例

采用用torch实现简单的线性回归,从定义到模型训练回归。

qq_42719311的博客 218

【无标题】 Python自动化法律文书撰写

Jinja2是一个功能强大的模板引擎,支持丰富的语法和功能。除了条件判断和循环语句外,Jinja2还支持过滤器、宏、继承等高级特性,非常适合处理复杂的文书模板。

master_chenchen的博客 2063

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 484

python手写线性回归

线性模型 概念:试图学得一个通过属性的线性组合来进行预测的函数 形式: 可解释性: 性能度量 常用性能度量均方误差: 最小二乘法 基于均方误差最小化进行模型求解的方法 求解w和b使均方误差最小化的过程称为线性回归模型的最小二乘参数估计(parameter eatimation) 基于最小二乘法求解一元线性回归 对w求导 对b求导 令导数等于0,解w和b , python实现 示例数据 中国平安和沪深300指数的日收益率数据,使用中国平安收益率作为特征收入,沪深30

大太阳的博客 1504

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 410

python 回归_Python 手写线性回归算法竟如此简单

【从零开始学机器学习第 11 篇】摘要:通俗易懂介绍线性回归算法,并 Python 手写实现。之前我们介绍了:kNN 算法,主要用于解决分类问题,也可以解决回归问题,它有很多优缺点,其中一个缺点是模型结果不具有可解释性,而很多时候我们是希望得到的模型是能够作出合理解释的,以便指导业务。今天要介绍的线性回归(Linear Regression)模型就是一个很好的可解释模型。比如建立了一个关...

weixin_39630106的博客 253

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

线性回归是一种用于预测数值型数据的统计学分析方法,它通过建立一个或多个自变量与因变量之间的线性关系来进行预测。线性回归的基本思想是通过拟合最佳直线(也就是线性方程),来描述自变量和因变量之间的关系。这条直线被称为回归线,其目的是使得所有数据点到这条直线的垂直距离(即残差)的平方和最小。这个最小化过程通常称为最小二乘法。以山河作礼。🎖️🎖️:Python领域新星创作者,优快云实力新星认证,优快云内容合伙人,阿里云社区专家博主,新星计划导师,在职数据分析师。💕💕悲索之人烈焰加身,堕落者不可饶恕。

weixin_50804299的博客 1万+

从零开始,手把手教你用RTL代码设计一个简单的8位CPU(附状态图与ALU设计)

本文详细介绍了如何从零开始设计一个简单的8位CPU,包括状态机设计、ALU实现与RTL编码实战。通过具体的指令集分析、状态图设计和Verilog代码示例,帮助读者深入理解CPU工作原理,并掌握RTL代码编写技巧。特别适合计算机系统学习者和硬件设计爱好者。

weixin_30847063的博客 320

05- 线性回归算法 (LinearRegression) (算法)

线性回归算法(LinearRegression)存在一定的误差符合正太分布求这个正太分布的最小均值和方差求误差的极小值。

March_A的博客 7159

【异常】Milvus向量数据库的常见错误“collection not loaded“(集合未加载)

Milvus数据库报错"collection not loaded"分析及解决方案。该错误发生在对未加载的集合执行查询操作时,核心原因是集合创建后需先加载到内存才能使用。解决方案包括:1)确认集合是否存在;2)查询前调用loadCollection接口加载集合;3)处理加载超时或失败情况,可检查加载状态;4)确保Milvus服务正常运行。建议在长期不使用集合时释放内存资源。文末附Java代码示例说明具体操作方法。

奶爸的编程之路,也就一周冷个三天 380

SAP PCE 到底有没有 AI 能力:从标准功能、Joule、ABAP 扩展到项目落地的完整解读

摘要:SAP S/4HANA Cloud Private Edition(PCE)已深度集成AI能力,主要体现在三个方面:1)标准业务流程中的AI辅助功能(如财务分录生成、维修单据处理);2)通过Joule提供的自然语言交互入口,支持业务导航和部分事务处理;3)开发者可通过ABAP AI SDK与BTP平台集成实现扩展。PCE不是独立AI平台,企业级自定义AI需结合SAP BTP实现。AI能力已深度融入财务、制造等业务场景,但关键业务仍需人工审核。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 330

Python手写机器学习的“线性回归”算法

我们只考虑如何手写实现,不考虑效果好不好,和统计学上的使用方法,主要是培养代码算法实现思想,如果您想学习线性回归知识,请看我博客的专门有写文章。

Eric005的博客 1184

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python算法总结(五)线性回归(附手写python实现代码)

一、算法类型 有监督的回归算法 二、手写线性回归算法 - 简单线性回归 (1)损失函数公式 (2)参数w求解公式 (3)手写python算法 计算回归系数 def Standard_Regress(dataset): xmat=np.mat(dataset.iloc[:,:-1].values) ymat=np.mat(dataset.iloc[:,-1].values).T xtx=xmat.Txmat if np.linalg.det(xtx)==0: print(‘矩阵为奇异矩阵,无法求逆’) ret

cqx2020的博客 2096

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

手写算法—Python代码实现一元线性回归

Python实现线性回归简述假设函数、损失函数和梯度下降法Python实现线性回归对比sklearn实现的一元线性回归 简述 线性回归模型是机器学习里面最基础的一种模型,是为了解决回归问题,学习机器学习从线性回归开始最好,网上关于机器学习的概述有很多,这里不再详细说明,本博文主要关注初学者常见的一些问题以及本人的一些思考和心得,会以实例的方式展现出来。 假设函数、损失函数和梯度下降法 首先,我们利用sklearn包来生成一组回归数据 import numpy as np import pandas as p

weixin_44700798的博客 7132

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

线性回归:LinearRegression模型

LinearRegression` 是一种简单而有效的方法,适用于线性关系的建模。`scikit-learn` 提供了易于使用的 API,非常适合于快速构建和评估线性回归模型。无论是初学者还是专业人士,都可以依赖这个工具来处理回归问题。

Wei_sx的博客 1262
上一篇: Python3结合Dlib实现人脸识别和剪切 !
下一篇: 用Python分析韩国女团喜欢什么单词 !
普通网友
博客等级 码龄7年 438粉丝 263原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值