Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用平均绝对偏差定制回归_Python_Numpy_Scipy_Regression_Scipy Optimize - Fatal编程技术网

Python 使用平均绝对偏差定制回归

Python 使用平均绝对偏差定制回归,python,numpy,scipy,regression,scipy-optimize,Python,Numpy,Scipy,Regression,Scipy Optimize,接下来,我现在严重怀疑是否或是否是一些随机噪声数据良好线性拟合的良好迹象。因此,我想开发一个定制的回归函数,这样我既可以了解它是如何工作的,也可以改进现有的工具 考虑这些随机生成的数据阵列x和y: 将numpy导入为np np.随机种子(42) x=np.随机随机数(30)*10 y=1.5*x+0.3+(np.rand.rand(30)-0.5)*3.5 现在,我可以用以下公式定义任意数据点集的平均/平均绝对偏差: def aad(X, Y, a, b): # assumes X and Y

接下来,我现在严重怀疑是否或是否是一些随机噪声数据良好线性拟合的良好迹象。因此,我想开发一个定制的回归函数,这样我既可以了解它是如何工作的,也可以改进现有的工具

考虑这些随机生成的数据阵列
x
y

将numpy导入为np
np.随机种子(42)
x=np.随机随机数(30)*10
y=1.5*x+0.3+(np.rand.rand(30)-0.5)*3.5
现在,我可以用以下公式定义任意数据点集的平均/平均绝对偏差:

def aad(X, Y, a, b): # assumes X and Y are of the identical shape/size
    n = X.size # highly unsafe!
    U = (a * X + Y - b) / 2 / a
    V = (a * X + Y + b) / 2
    E = np.sqrt(np.power((X - U), 2) + np.power((Y - V), 2))
    return E.sum() / n
在我看来,这是量化一行
y=a*x+b
到这对数据点的适合度的最佳方法。该函数只需查找假定直线到任何数据点的最近点,然后计算该点与直线之间的垂直距离

现在我需要一个函数,比如说:

linearFit(X, Y)
给出了相同形状的
X
Y
数组,找到使
aad(X,Y,a,b)
最小的
a
b
。结果必须是绝对最小值,而不仅仅是局部最小值

当然,本着SO最佳实践的精神,我已经尝试了
scipy.optimize
函数
fmin
brute
,正如您在和中看到的那样。然而,我似乎无法理解这些函数的正确语法。如果您能帮助我为假定的
linearFit
函数找到一个规范且性能良好的实现,我将不胜感激。提前感谢您的支持

p.S.提供了一个临时解决方案:

从scipy.optimize导入最小化
aad=λP:aad(P[0],P[1],x1,y1)
最小化(aad_x0=[x0,Y0])
然而,我得到的结果并没有那么有希望!解算器未成功,我收到消息:

由于精度损失,不一定达到预期误差

首先,由于我意识到这不是上面评论中讨论的普通最小二乘(OLS)回归。它实际上有许多名称,其中包括戴明回归、正交距离回归(ODR)和总最小二乘法(TLS)。此外,还有,
scipy.odr
用于此目的!它的语法有点奇怪,文档也没有什么帮助,但是可以找到一个很好的教程

Nex I在
aad
定义中发现一个小错误,并将其重命名并修复为:

def aaod(a,b,X,Y):#假设X和Y的形状/大小相同
n=X.size仍然非常不安全!不要在实际生产中使用它
U=(a*X+Y-b)/2/a
V=(a*X+Y+b)/2
E=np.sqrt(np.power((X-U),2)+np.power((Y-V),2))
返回E.sum()/n
代表平均绝对正交距离。现在将拟合函数定义为:

从scipy.optimize导入最小化
从scipy.stats导入回归
def odrFit(X,Y):
X0=linregresse(X,Y)#等等,这是作弊!
aaod=λP:aaod(P[0],P[1],X,Y)
res=最小化(aaod_x0=x0[:2],方法='Nelder-Mead')
res_list=res.x.tolist()
res_list.append(aaod_(res_list))
返回资源列表
这不一定是性能最好、最规范的实现。我从中学习的临时
lambda
函数和
方法='Nelder Mead'
的变通方法。
scipy.odr
实现也可以通过以下方式完成:

来自scipy.odr导入模型、odr、RealData
def f(B,x):
返回B[0]*x+B[1]
线性=模型(f)
mydata=RealData(x,y)
myodr=ODR(mydata,线性,beta0=[1,2.]))
myoutput=myodr.run()
现在比较定制的
odrFit()
函数和
scipy.stats.linregresse()之间的结果:

斜率、截距、r_值、p_值、标准误差=线性回归(x,y) 打印(*odrFit(x,y)) # --> 1.4804181575739097, 0.47304584702448255, 0.6008218016339527 打印(斜率、截距、aaod(斜率、截距、x、y)) # --> 1.434483032725671 0.5747705643012724 0.608021569291401 打印(*myoutput.beta,aaod(*myoutput.beta,x,y)) # --> 1.5118079563432785 0.23562547897245803 0.6055838996104704

这表明我们的函数实际上比Scipy的最小绝对偏差回归法更精确。这可能只是纯粹的运气,需要做更多的测试才能得出可靠的结论。可以找到完整的代码。

有很多方法可以计算最小绝对偏差回归,只需谷歌搜索一些算法即可。不过,这是一个迭代问题,与其他问题相比有一些缺点ols@bryan60好的,这就是它的名字。我不知道。我也不知道常用的方法叫回归。谢谢使用
scipy.optimize
函数有什么简洁的方法吗?我从未遇到过需要L1回归的用例。删除异常值将得到大致相同的结果。你不能很好地适应随机数据。这就是随机数据的要点。任何关联都是虚假的。@bryan60编辑了这篇文章。这不是真正的随机数据,而是带有随机噪声的数据。如果噪声是随机的,那么绝对误差和平方误差不会有多大区别。当异常值的权重较小时,绝对值最强。如果你能测量噪声的原因并将其用于多元回归,你会有一个更好的拟合。或者,如果噪声确实像信号噪声一样是随机的,那么还有其他技术。