关于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()方法。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。