Press "Enter" to skip to content

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

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。