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

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

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

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

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

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

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

       

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

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

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

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

然后我们通过梯度下降的方法去更新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实现的一个简单的线性回归。

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

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

  1. 8种方法用Python实现线性回归,为你解析最高效选择

    来源:大数据文摘 编译:丁慧.katherine Hou.钱天培 作者:TirthajyotiSarkar 本文共1856字,建议阅读6分钟. 本文为大家对比了8种用Python实现线性回归的方法哪个 ...

  2. 【案例实践】Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用

    查看原文>>>基于Python多元线性回归.机器学习.深度学习在近红外光谱分析中的实践应用 [专家]: 郁磊副教授 主要从事MATLAB 编程.机器学习与数据挖掘.数据可视化和软件开 ...

  3. python 线性回归函数_8种用Python实现线性回归的方法,究竟哪个方法最高效?

    大数据文摘作品 作者:TirthajyotiSarkar 编译:丁慧.katherine Hou.钱天培 说到如何用Python执行线性回归,大部分人会立刻想到用sklearn的linear_mode ...

  4. Python多元线性回归、机器学习、深度学习在近红外光谱分析中的应用

    导师:郁磊副教授,主要从事MATLAB 编程.机器学习与数据挖掘.数据可视化和软件开发.人工智能近红外光谱分析.生物医学系统建模与仿真,具有丰富的实战应用经验,主编<MATLAB智能算法30个案 ...

  5. python 音乐下载演示源代码

    python 音乐下载演示源代码 import requests import reapi = 'http://music.taihe.com/search?' header = {'User-Age ...

  6. python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar

    [实例简介] [实例截图] [核心代码] 从零开始学Python网络爬虫_源代码_1 ├── 58project │ ├── __pycache__ │ │ ├── channel_extract.c ...

  7. python小程序源代码-Python数据库小程序源代码

    源代码: # dict1 是 字典 , 用来对应相应元素的下标,我们将文件转成列表,对应的也就是文件的下标,通过下标来找文件元素 dict1 = {'sort':0 , 'name':1 ,'age' ...

  8. python多元线性回归模型案例_Python 实战多元线性回归模型,附带原理+代码

    原标题:Python 实战多元线性回归模型,附带原理+代码 作者 | 萝卜 来源 | 早起Python( ID:zaoqi-python ) 「多元线性回归模型」非常常见,是大多数人入门机器学习的第一 ...

  9. python 线性回归 技术方案亮点_基于Python的线性回归实战

    一.线性回归的理论 1)线性回归的基本概念 线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多元的线性回归.一元线性回归是一个自变量和一个因变量间的回 ...

  10. Python实现线性回归2,梯度下降算法

    接上篇 4.梯度下降算法 <斯坦福大学公开课 :机器学习课程>吴恩达讲解第二课时,是直接从梯度下降开始讲解,最后采用向量和矩阵的方式推导了解析解,国内很多培训视频是先讲解析解后讲梯度下降, ...

最新文章

  1. 用JavaScript来实现链表LinkedList
  2. CentOS中配置Mysql表名忽略大小写以及提示:Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining d
  3. Sky Garden
  4. Objective-C优缺点
  5. css线条伸缩_CSS3弹性伸缩布局之box布局
  6. 信息学奥赛C++语言: 趣味整数5(勾股数)
  7. python接口自动化(三)--如何设计接口测试用例(详解)
  8. Recorder︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
  9. kepware mysql_Kepware EX6与MySQL数据库通讯(上篇)
  10. 新建文件没有word、ppt、excel,office图标显示为白色,不能正常显示
  11. 如何快速集成短信验证码API[图文教程]
  12. 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
  13. 数理统计——样本分布
  14. mysql根据idb还原数据_转一篇文章:MySQL 通过idb文件恢复Innodb 数据
  15. 2021钳工技能高考成绩查询,这里有2021钳工时间和报名费用以及流程
  16. Mac 重启后,连接不上wifi
  17. 永恒之蓝(MS17-010)漏洞复现及msf常用渗透命令
  18. Wi-Fi当前的趋势及对IT和物联网的影响
  19. uniapp切换中英文
  20. 信息抽取之实体消歧,统一

热门文章

  1. webpack 配置不同环境, 以及配置 baseUrl
  2. 人工智能入门书单(附PDF链接)
  3. 论文学习:BP神经网络
  4. opencv教程CV2模块——图片处理,HSV、色调、亮度调节
  5. LocalDate,LocalDateTime获取每周,每月,每年的第一天和最后一天,获取一周七天的日期,获取每月的所有日期
  6. 微服务拆分原则之 AKF
  7. 零基础成为3D游戏建模师需要多久?
  8. C语言-复制特定的字符串
  9. mysql定时任务,每天凌晨1点执行
  10. python日期推算