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

Posted 肖永威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

4. 结论

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

参考:

Tirthajyoti Sarkar. Data science with Python: 8 ways to do linear regression and measure their speed. freecodecamp. 2017.12
机器之心. Python环境下的8种简单线性回归算法.2018.01

以上是关于numpy.polyfit()方法与Stats.linregress( ) 方法最小二乘近似拟合斜率对比分析的主要内容,如果未能解决你的问题,请参考以下文章

多个维度的 NumPy PolyFit 和 PolyVal?

numpy.polyfit 给出空残差数组

用犰狳在 C++ 中实现 numpy.polyfit 和 numpy.polyval

在没有numpy polyfit的python中拟合二次函数

在 numpy polyfit 中使用的权重值是多少,拟合的误差是多少

Numpy Polyfit 或 X 和 Y 多维数组的任何拟合