向量化使得简单线性回归性能提升
一、摘要
本文主要讲述了向量化运算在简单线性回归算法中的应用。通过回顾传统for循环方式实现的简单线性回归算法,介绍了如何通过最小二乘法计算a的值。然而,这种方式在计算性能上存在效率较低的问题。为了提高性能,视频引入了向量化运算的概念,即将计算过程从循环方式转变为向量之间的计算。通过向量化运算,可以快速地计算出结果,相比传统的for循环方式,在性能上具有显著的优势。视频还强调了向量化运算需要基于推导的结果进行,对于入门级别的同学来说,可以先实现更清晰的程序版本,再基于这个版本进行向量化,以更好地理解算法的原理。
二、向量化运算概述
向量化概述:
- 向量化运算是一种重要的概念,可以提高计算性能。
- 通过将计算转换为向量之间的运算,可以大大提升性能。
向量化运算性能高的原因:
在计算机学科中,向量化运算通常比for循环等具有更好的计算性能,主要原因如下:
- 硬件层面
- 利用SIMD指令集:现代计算机的CPU通常支持单指令多数据(SIMD)指令集,如Intel的SSE、AVX等。向量化运算能够直接利用这些指令集,在一条指令中同时对多个数据元素进行相同的操作,例如可以同时对4个或8个单精度浮点数进行加法运算。而for循环每次只能处理一个数据元素,需要多条指令来完成相同数量数据的操作,这使得向量化运算在数据处理效率上有天然的优势。
- 提高缓存命中率:向量化运算通常会连续访问内存中的数据,这有利于提高CPU缓存的命中率。因为数据在内存中是连续存储的,当加载一个数据元素时,相邻的数据元素也很可能被加载到缓存中,后续对这些数据的访问就可以直接从缓存中获取,大大加快了访问速度。相比之下,for循环可能会以非连续的方式访问数据,导致缓存失效的情况更频繁,需要从内存中多次读取数据,增加了访问时间。
- 软件层面
- 减少指令开销:for循环需要在每次迭代时执行循环控制指令,如比较、跳转等,这些指令会增加额外的开销。而向量化运算将多个数据的处理合并为一个操作,减少了指令的数量和执行时间,从而提高了整体性能。
- 编译器优化:编译器对向量化运算的优化能力更强。编译器可以识别向量化的代码模式,并对其进行更高级的优化,如自动展开循环、调整指令顺序等,以充分利用硬件的特性。对于for循环,虽然编译器也能进行一些优化,但由于其灵活性较高,编译器很难像对向量化运算那样进行深度优化。
- 并行执行能力:向量化运算更适合并行计算。在多核处理器或GPU等并行计算环境中,向量化运算可以很容易地将数据划分到不同的核心或线程中进行并行处理,从而进一步提高计算速度。for循环虽然也可以通过一些方式实现并行化,但需要更多的代码调整和同步操作,实现起来相对复杂,且可能存在数据竞争等问题,影响性能。
三、向量化运算在简单线性回归中的应用
- 在简单线性回归中,a(斜率)的计算方式可以通过向量化运算来优化。
- 通过将计算转换为向量点乘,可以避免使用for循环,提高效率。
- 向量化运算的实现
- 基于上一篇博文中的SimpleLinearRegressionModel类所在工程中文件改名成为SimplyLearnRegressionDemo.py,然后在其中新建一个SimpleLinearRegressionVectorModel类,使得fit函数通过向量化运算来计算a和b。
- 通过使用numpy的dot方法,实现了向量点乘,提高了计算速度。
- 具体SimpleLinearRegressionVectorModel代码如下:
import numpy as np class SimpleLinearRegressionModel: def __init__(self): # 初始化线性回归模型的参数a和b为None self.a_ = None self.b_ = None def fit(self, x_train, y_train): """ 根据训练数据集x_train,y_train训练Simple Linear Regression模型 """ # 断言x_train的维度为1,确保是单特征训练数据 assert x_train.ndim == 1, \ "Simple Linear Regressor can only solve single feature training data." # 断言x_train和y_train的长度相等,确保数据匹配 assert len(x_train) == len(y_train), \ "the size of x_train must be equal to the size of y_train" # 先分别求出x和y的均值 x_mean = np


2803

被折叠的 条评论
为什么被折叠?



