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

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

关于作者:饼干同学,某人工智能公司交付开发工程师/建模科学家。专注于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研发工程师成长指南

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

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

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

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

503247f9520911de025a6f250859ea47.png

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

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

相关文章

AI应用开发实战系列之四 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型。 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 https://github.com/Microsoft/vs-tools-for-…

现代软件工程 结对/团队作业 - 汉字的 2048 + 俄罗斯方块

一个很有趣的软件工程/编程作业,如果把汉字构成的规律运用在 2048 俄罗斯方块这样的游戏中,会有什么效果呢? (链接1, 链接2) 既然是软件工程的作业, 那就要体现出一些工程的特性: 作业要求: 1) 学生自行…

机器学习平台建设

本文从机器学习平台的架构开始,再到具体的功能,然后从需求的角度带给读者思考,找到合适的机器学习平台建设之路。最后,推荐了微软开源开放的机器学习平台OpenPAI,是可私有部署的机器学习训练平台。 本文不少要点都可以…

型管件的作用_管道工程基础 - 管件和管道附件的布置规定

概述1.1 管件的用途1.2 管件的种类根据管件的端部连接形式可将管件分为对焊连接管件、承插焊连接管件、螺纹连接管件、法兰连接管件以及其它管件。管件和管道附件的布置2.1管件的布置(1)弯头宜选用曲率半径等于1.5倍公称直径的长半径弯头;输送气固、液固两相流物料的…

java grpc 客户端处理 go 服务端多返回值_grpc基础实践(二)

在此篇中我们将简要介绍关于grpc对java客户端的实现。在开始开发前,我们需要先导入io.grpc grpc-netty 1.11.0io.grpc grpc-protobuf 1.11.0io.grpc grpc-stub 1.11.0如果是Android除了这几个包外,你可能还需要一个javax.annotation:javax.annotation-ap…

asp.net 文本框显示xml格式数据_Excel 办公小技巧,查找和替换数据,您值得拥有...

在数据处理的过程中,有时需要在工作表中查找一些数据,以便查看或修改数据。若工作表的数据能一目了然,则可手动进行查找,但在记录繁多的工作表中查找所需数据并替换,效率比较低,而且极易出现遗漏。这时就可…

微软认知服务应用秘籍 – 与机器人聊知识

在本篇博客中,我们将会学习到零代码情况下,如何利用已有的技术建立自己的知识问答系统,这种系统的可以广泛适用于学校、企业、客服、政府公开信息等领域,代替传统的电话咨询、电子邮件沟通等高人工负荷的方式。 建立知识库 什么…

.net 开发怎么实现前后端分离_ASP.NET Core模块化前后端分离快速开发框架介绍

源码地址GitHub:https://github.com/iamoldli/NetModular演示地址地址:http://118.24.75.170:6220/账户:admin密码:admin前端框架演示地址(临时)地址:http://progqx5cu.bkt.clouddn.com/skins/index.html#/账户&#x…

微软认知服务应用秘籍 – 支持跨平台客户端的视觉服务中间层

不断演进的应用场景 初级应用场景—宅在家里 场景:Bob同学有一天在网上看到了一张建筑物的图片,大发感慨:"好漂亮啊!这是哪里?我要去亲眼看看!"Bob同学不想问别人,可笑的自尊心让他…

就业技术书文件表格_429页标准指南,教你如何管理工程监理文件资料,丰富图表一看就会...

房屋建筑工程监理文件资料的管理,参差不齐,也给监理工作带来了很大障碍。这份房建工程监理文件资料管理标准指南,能够帮助广大监理和资料员们实现监理文件资料标准化管理,能够有效地补充和支撑现场监理工作,对于工程资…

微软认知服务应用秘籍 – 君子动口不动手

概述 科技的不断发展带动着人们生活质量不断的提升,其中一方面就体现在日常家庭生活中,智能设备层出不穷,给人们的生活带来了很大的便利。 以电视为例,几十年前的电视还是按钮式的,每次换台还要跑到电视跟前&#xf…

AI应用开发实战 - 手写算式计算器

扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集了解如何扩展数据集实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开发案例。本文的应用是基于前文“手写识别应用入门”中的基础应用进行扩…

sed 删除某一行_Linux常用命令三剑客之sed,您真的会用吗?

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解Linux系统中的sed命令的作用与使用案例。sed用于查找、过滤、文本替换、替换和插入、删除等文本操作。它是Linux/Un…

现代软件工程 期中/期末总结博客作业

(软件工程作业列表) 经历了一个学期的学习, 可以把经历和收获总结一下。 第一部分 耕耘 请说明你付出了多少时间,写了多少代码,多少注释,多少文档(博客),多少次签入,最好用折线图或其他合适的图形化的方式…

caj转pdf python_PDF怎么转换成Word?2种方法3秒一键转换!建议收藏

Hello,大家好!今天给大家带来:PDF一键转Word的干货!保证全方位满足你工作和学习的需求~01Word转换法适用:纯文字简单型PDF文件。其实对于简单纯文字的PDF文件,直接使用Word就能转换,操作也非常简…

AI应用开发基础傻瓜书系列1-神经网络的基本工作原理

Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可 更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区 Content01.0-神经网络的基本工作原理01.1-基本数学导数公式01.2-Python-Numpy库的点滴02.0-反向传播与梯度下…

动力环境监控系统论文_浅谈动力环境监控系统技术标准

动力环境监控系统技术标准规定了监控系统各因素指标、功能,对实现机房设备故障自动检测、无人化值守、降低维护保养成本的动环系统有重要的作用和意义。运用动环监控,能解决成本高、效率低、告警慢、信息落后能问题。一、动环监控系统的技术标准1、可靠性…

cmd python封装成exe_别再问我怎么Python打包成exe了!

也许我们不一定是专业的程序员,但是我们仍然可以通过代码提高我们的效率,尽量少加班,多陪陪媳妇(如果有)。再不行,让代码替我们干着重复的工作,我们有节省出来的时间打游戏不好嘛,是…

监听router_深入揭秘前端路由本质,手写 mini-router

前言前端路由一直是一个很经典的话题,不管是日常的使用还是面试中都会经常遇到。本文通过实现一个简单版的 react-router 来一起揭开路由的神秘面纱。通过本文,你可以学习到:前端路由本质上是什么。前端路由里的一些坑和注意点。hash 路由和 …

AI应用开发基础傻瓜书系列附录-基本数学导数公式

基本函数导数公式 Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可 更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区 Content01.0-神经网络的基本工作原理01.1-基本数学导数公式01.2-Python-Numpy库的点滴02.…