模型之母:简单线性回归的代码实现

关于作者:饼干同学,某人工智能公司交付开发工程师/建模科学家。专注于AI工程化及场景落地,希望和大家分享成长中的专业知识与思考感悟。

0x00 前言

在《模型之母:简单线性回归&最小二乘法》中,我们从数学的角度理解了简单线性回归,并且推导了最小二乘法。

本文内容完全承接于上一篇,我们来以代码的方式,实现简单线性回归。话不多说,码起来

0x01 简单线性回归算法的实现

首先我们自己构造一组数据,然后画图

import numpy as npimport matplotlib.pyplot as pltx = np.array([1.,2.,3.,4.,5.])y = np.array([1.,3.,2.,3.,5,])plt.scatter(x,y)plt.axis([0,6,0,6])plt.show()

下面我们就可以根据样本真实值,来进行预测。

实际上,我们是假设线性关系为: 这根直线,然后再根据最小二乘法算a、b的值。我们还可以假设为二次函数:。可以通过最小二乘法算出a、b、c

实际上,同一组数据,选择不同的f(x),即模型,通过最小二乘法可以得到不一样的拟合曲线。

不同的数据,更可以选择不同的函数,通过最小二乘法可以得到不一样的拟合曲线。

下面让我们回到简单线性回归。我们直接假设是一条直线,模型是:

根据最小二乘法推导求出a、b的表达式:

下面我们用代码计算a、b:

# 首先要计算x和y的均值x_mean = np.mean(x)y_mean = np.mean(y)# a的分子num、分母dnum = 0.0d = 0.0for x_i,y_i in zip(x,y):   # zip函数打包成[(x_i,y_i)...]的形式    num = num + (x_i - x_mean) * (y_i - y_mean)    d = d + (x_i - x_mean) ** 2a = num / db = y_mean - a * x_mean

在求出a、b之后,可以计算出y的预测值,首先绘制模型直线:

y_hat = a * x + bplt.scatter(x,y)    # 绘制散点图plt.plot(x,y_hat,color='r')    # 绘制直线plt.axis([0,6,0,6])plt.show()

然后进行预测:

x_predict = 6y_predict = a * x_predict + bprint(y_predict)

5.2

0x02 向量化运算

我们注意到,在计算参数a时:

# a的分子num、分母dnum = 0.0d = 0.0for x_i,y_i in zip(x,y):   # zip函数打包成[(x_i,y_i)...]的形式    num = num + (x_i - x_mean) * (y_i - y_mean)    d = d + (x_i - x_mean) ** 2a = num / d

我们发现有这样一个步骤:向量w和向量v,每个向量的对应项,相乘再相加。其实这就是两个向量“点乘”

这样我们就可以使用numpy中的dot运算,非常快速地进行向量化运算。

总的来说:

向量化是非常常用的加速计算的方式,特别适合深度学习等需要训练大数据的领域。

对于 y = wx + b,  若 w, x都是向量,那么,可以用两种方式来计算,第一是for循环:

y = 0for i in range(n):    y += w[i]*x[i]    y += b

另一种方法就是用向量化的方式实现:

y = np.dot(w,x) + b

二者计算速度相差几百倍,测试结果如下:

import numpy as npimport timea = np.random.rand(1000000)b = np.random.rand(1000000)tic = time.time()c = np.dot(a, b)toc = time.time()print("c: %f" % c)print("vectorized version:" + str(1000*(toc-tic)) + "ms")c = 0tic = time.time()for i in range(1000000):    c += a[i] * b[i]toc = time.time()print("c: %f" % c)print("for loop:" + str(1000*(toc-tic)) + "ms")

运行结果:

c: 249981.256724vectorized version:0.998973846436msc: 249981.256724for loop:276.798963547ms

对于独立的样本,用for循环串行计算的效率远远低于向量化后,用矩阵方式并行计算的效率。因此:

只要有其他可能,就不要使用显示for循环。

0x03 自实现的工程文件

3.1 代码

还记得我们之前的工程文件吗?创建一个SimpleLinearRegression.py,实现自己的工程文件并调用

import numpy as npclass SimpleLinearRegression:    def __init__(self):        """模型初始化函数"""        self.a_ = None        self.b_ = None    def fit(self, x_train, y_train):        """根据训练数据集x_train,y_train训练模型"""        assert x_train.ndim ==1, \            "简单线性回归模型仅能够处理一维特征向量"        assert len(x_train) == len(y_train), \            "特征向量的长度和标签的长度相同"        x_mean = np.mean(x_train)        y_mean = np.mean(y_train)        num = (x_train - x_mean).dot(y_train - y_mean)  # 分子        d = (x_train - x_mean).dot(x_train - x_mean)    # 分母        self.a_ = num / d        self.b_ = y_mean - self.a_ * x_mean        return self    def predict(self, x_predict):        """给定待预测数据集x_predict,返回表示x_predict的结果向量"""        assert x_predict.ndim == 1, \            "简单线性回归模型仅能够处理一维特征向量"        assert self.a_ is not None and self.b_ is not None, \            "先训练之后才能预测"        return np.array([self._predict(x) for x in x_predict])    def _predict(self, x_single):        """给定单个待预测数据x_single,返回x_single的预测结果值"""        return self.a_ * x_single + self.b_    def __repr__(self):        """返回一个可以用来表示对象的可打印字符串"""        return "SimpleLinearRegression()"

3.2 调用

下面我们在jupyter中调用我们自己写的程序:

首先创建一组数据,然后生成SimpleLinearRegression()的对象reg1,然后调用一下

from myAlgorithm.SimpleLinearRegression import SimpleLinearRegressionx = np.array([1.,2.,3.,4.,5.])y = np.array([1.,3.,2.,3.,5,])x_predict = np.array([6])reg = SimpleLinearRegression()reg.fit(x,y)

输出:SimpleLinearRegression()

reg.predict(x_predict)reg.a_reg.a_

输出:array([5.2]) 0.8 0.39999999999999947

y_hat = reg.predict(x)plt.scatter(x,y)plt.plot(x,y_hat,color='r')plt.axis([0,6,0,6])plt.show()

0xFF 总结

在本篇文章中,我们实现了简单线性回归算法的代码,并且使用了向量化运算,事实证明,向量化运算能够提高运算效率。

同时我们发现,只要数学公式推导清楚了,实际写代码时没有太多难度的。

那么我们思考一个问题,在之前的kNN算法(分类问题)中,使用分类准确度来评价算法的好坏,那么回归问题中如何评价好坏呢?

热门文章

直戳泪点!数据从业者权威嘲讽指南!

AI研发工程师成长指南

数据分析师做成了提数工程师,该如何破局?

算法工程师应该具备哪些工程能力

数据团队思考:如何优雅地启动一个数据项目!

数据团队思考:数据驱动业务,比技术更重要的是思维的转变

c++ 线性回归_模型之母:简单线性回归的代码实现相关推荐

  1. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  2. python做线性回归_利用python实现简单的线性回归

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 用pytho ...

  3. python 多元线性回归_多元统计分析之多元线性回归的R语言实现

    多元统计分析之多元线性回归的R语言实现 多元统计分析--multivariate statistical analysis 研究客观事物中多个变量之间相互依赖的统计规律性.或从数学上说, 如果个体的观 ...

  4. python动物重量排序_用python画简单的动物代码

    用python画简单的动物代码 发布时间:2020-04-30 14:57:42 来源:亿速云 阅读:344 作者:小新 今天小编给大家分享的是用python画简单的动物代码,相信很多人都不太了解,为 ...

  5. opencv机器学习线性回归_机器学习入门1---简单线性回归

    归纳整理昨日学习的知识点,学会记录是个好习惯. 什么是机器学习? 简单来说,就是使用机器学习算法来建立模型,输入新的数据通过模型进行评估预测. 机器学习步骤 提出问题→理解数据→清洗数据→构建模型→评 ...

  6. excel计算二元线性回归_怎么看懂Excel线性回归参数

    虽然之前用python做线性回归的时候看上去好像很简单,但是直到我在excel上实践了线性回归,发现有很多指标值得去参考,对于在python上实现有指导作用. 打开excel2016,先找个数据 我们 ...

  7. numpy多元线性回归_使用sklearn实现多元线性回归

    使用sklearn实现多元线性回归 多元线性回归 import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sk ...

  8. java 一元线性回归_算法笔记:一元线性回归及Java实现

    这是voidAlex原创的第四篇博文. 源码在我的GitHub 回归问题 回归问题是研究自变量和因变量之间关系的一种预测模型技术.例如我们可以通过回归模型去预测房价与房子面积之间的关系,一个人每周花在 ...

  9. sklearn 线性回归_使用sklearn库做线性回归拟合

    背景资料 随着海拔高度的上升,温度越来越低,经过气象专家的研究,在一定的海拔高度范围内,高度和温度呈线性关系.现有一组实测资料,我们需要对这些数据进行处理拟合,获得此线性关系. 解决思路 采用skle ...

最新文章

  1. 斯坦佛编程教程-Unix编程工具(四)
  2. 达摩院清华博士研发了一个AI摸鱼神器!有了它,老板都不好意思打扰你
  3. R语言可视化分面图、多变量分组多水平t检验、可视化多变量分组多水平分面条形图(faceting bar plot)并添加显著性水平、在标签和绘图上边框之间添加15%的空格、添加抖动数据点
  4. java自动化开发_Java自动化开发指南
  5. java 写文件 异常 磁盘空间满_系统磁盘空间满的一个问题
  6. iOS开发HTTPS实现之信任SSL证书和自签名证书
  7. python入门——条件控制+循环语句
  8. 双域隔离技术何以助力物联网安全? | 人物志
  9. android 视频标签,android--------WebView实现 Html5 视频标签加载
  10. 敏捷团队章程-让团队持续敏捷
  11. Forever young
  12. linux SQL2019 代理SQLServerAgent is not currently running so it cannot be notified of this action
  13. 智能合约逆向心法1(案例篇)——34C3_CTF题目分析
  14. BUU-MISC-你能看懂音符码
  15. 简析王者荣耀的匹配机制
  16. java实现多个mav文件拼接合并成一个mav文件
  17. 关于skeaz128.h芯片包总头文件V1.3版本与V1.2版本的变更说明
  18. 金链盟中国区块链应用大赛正式启动,200万奖金将花落谁家?
  19. 用户体验五要素_新零售「盒马」的用户体验设计5要素
  20. 重新发现科技与人文的互动

热门文章

  1. Mybatis学习笔记13 - 动态sql之set标签
  2. flannel无法跨主机ping通容器的解决方式
  3. DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
  4. HDU 3896 Greatest TC 双连通分量
  5. 第4章 分治策略 monge阵列
  6. 3.1_ 5_动态分区分配算法
  7. 操作系统学习笔记-06-系统调用
  8. 一元多项式的建立及加减
  9. 计算机应用基础王秀娟,计算机应用基础课教学内容设计分析.doc
  10. 澳洲虚拟主机空间_澳洲空间|澳洲虚拟主机|澳洲主机|澳洲虚拟空间-万纵科技 www.xmwzidc.cn...