关于numpy.polyfit()与Stats.linregress()方法最小二乘近似拟合斜率对比

 更新时间:2024年04月07日 08:57:07   作者:肖永威  
这篇文章主要介绍了关于numpy.polyfit()与Stats.linregress()方法最小二乘近似拟合斜率对比,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

numpy.polyfit()与Stats.linregress()方法最小二乘近似拟合斜率对比

对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。

而快速且准确地线性回归模型对拟合大型数据集非常重要性。

由于在机器学习中,Scikit-learn 是一个十分流行的 Python 库,因此,人们经常会从这个库调用线性模型来拟合数据。

除此之外,我们还可以使用该库的 pipeline 与 FeatureUnion 功能(如:数据归一化、模型回归系数正则化、将线性模型传递给下游模型),但是一般来看,如果一个数据分析师仅需要一个又快又简单的方法来确定回归系数(或是一些相关的统计学基本结果),那么这并不是最快或最简洁的方法。

接下来,我们研究两个更快更简洁的方法。

1. numpy.polyfit()方法

这是一个非常一般的最小二乘多项式拟合函数,它适用于任何 degree 的数据集与多项式函数(具体由用户来指定),其返回值是一个(最小化方差)回归系数的数组。

对于简单的线性回归而言,你可以把 degree 设为 1。如果你想拟合一个 degree 更高的模型,你也可以通过从线性特征数据中建立多项式特征来完成。

2. Stats.linregress( ) 方法

这是 Scipy 中的统计模块中的一个高度专门化的线性回归函数。

其灵活性相当受限,因为它只对计算两组测量值的最小二乘回归进行优化。

因此,你不能用它拟合一般的线性模型,或者是用它来进行多变量回归分析。

但是,由于该函数的目的是为了执行专门的任务,所以当我们遇到简单的线性回归分析时,这是最快速的方法之一。

除了已拟合的系数和截距项(intercept term)外,它还会返回基本的统计学值如 R² 系数与标准差。

本质上,std_err应该为梯度中表示的每个系数给出一个值。

简单来说,std_err就是告诉您数据的梯度拟合度(数值越高表示精度越低),不是传统统计中的标准差。

3. 两个方法对比

分别随机取10、100、1000、10000组数据对比计算速度。

附代码:

import pandas as pd
import datetime
import numpy as np
import random
from scipy import stats

x =[i for i in range(10)]
y =[j*random.random() + random.randint(2,6) for j in range(10)]

print('start np.polyfit')
now_time = datetime.datetime.now()
time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f')
print(time_str)
p,V = np.polyfit(x, y, 1)
##std = np.var(y, ddof=1)
#std = np.std(y, ddof=1)
print(p,V)

now_time = datetime.datetime.now()
time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f')
print(time_str)
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
print(slope,intercept)
now_time = datetime.datetime.now()
time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S.%f')
print(time_str)

总结

polyfit()方法要比linregress()快,特别是单组数据量少时,差距比较大。在做大数据线性回归时,如果单组数据量少于1000,可以多考虑polyfit()方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论