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-…

server sql 众数_sql 语句系列(众数中位数与百分比)[八百章之第十五章]

众数众数就是出现最多的那个数。select sal,count(*) as cntfrom empwhere DEPTNO20group by sal通过分组把他们的行数计算出来。那么最关键的部分在于,你如何知道最大值。是的我们可以查出当前最大值,然后再取出最大值的sal。但是这肯定要用到两个临时视…

【干货】快速部署微软开源GPU管理利器: OpenPAI

介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力。除此之外,还要压榨出硬件的所有潜力来加快模型训练。OpenPAI作为GPU管理的利器,不管是一块GPU,还是上千块GPU,都能够做好调度&a…

python调用ansysworkbench_Workbench通过Python设定材料参数

微信公众号:CAE技术分享以下一段代码是在Workbench中通过Python设定材料的弹性模量和泊松比参数:# encoding: utf-8# Release 16.0SetScriptVersion(Version"16.0.361")template1 GetTemplate(TemplateName"EngData")system1 temp…

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

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

invoke 按钮点击_h5+ app内点击按钮实现复制功能 实现方法

在项目中由于要实现点击按钮复制功能,我用的是H5APP,实现代码如下(包括安卓IOS):/*** //参数copy是要复制的文本内容* tip 复制成功后的提示语,可空*/function copy_fun(copy,tips) {if(!tips){tips"已成功复制到剪贴板"…

机器学习平台建设

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

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

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

现代软件工程 作业汇总

文档属于这个专栏: ​​​​​​现代软件工程讲义 目录_SoftwareTeacher的博客-CSDN博客 备份:现代软件工程课程 参考:各个学校的编程/软工作业列表 ------- 软件工程的作业 ------- 很多老师反映软件工程的作业题不好出,学生做的…

现代软件工程 作业 第一周博客作业

(软件工程作业汇总) 第一周的博客作业 (这是历届学生的练习中, 从各个老师的作业中汇集而来,特别是北航的作业,东北师大的作业) 1. 介绍自己,建博客 在 http://www.csdn.net 建账号。关注老师和助教,关注一些和你一起…

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…

现代软件工程 作业 团队第一个作业

这是现代软件工程作业系列的一部分 1. 团队成员介绍 介绍每个成员(照片,主页,技术特长,在团队中担任的角色)。 建议拍一张有创意的合影。 在介绍的时候,可以采用艺术照等形式, 保护同学的隐私,不想说明真实…

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

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

webpack打包后的文件夹是空的_vue+webpack 打包文件 404 页面空白的解决方法

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

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

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

.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同学不想问别人,可笑的自尊心让他…

python建立列表并输入_python操作列表

遍历列表 for magic = [a,b,c] for m in magic: print(m) 输出控制台 image.png 深入for以及for之后进行操作 for m in magic: print(m.title()+ good boy) print(hahaha) 输出控制台 image.png 创建数值列表 使用函数range for value in range(1,5): print(value) 输出控制台 …

现代软件工程 作业 原型设计

[ 现代软件工程 作业系列] [ 这个作业来自福州大学 ] 软件工程课不是大家埋头写程序的课, 而是教给大家在软件需求 - 设计 - 实现 - 测试 - 维护 过程中的原理,方法和工具。下面我们就看如何用原型设计工具来帮助我们理清用户需求。 一、阅读《构建之法…

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

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