如何在python中使用仅为上限的数据进行最小二乘拟合?

如何在python中使用仅为上限的数据进行最小二乘拟合?,python,least-squares,model-fitting,Python,Least Squares,Model Fitting,我试图在python中对一个已知的具有三个变量的函数执行最小二乘拟合。对于随机生成的有错误的数据,我能够完成此任务,但我需要拟合的实际数据包括一些数据点,这些数据点是值的上限。该函数将通量描述为波长的函数,但在某些情况下,在给定波长下测得的通量不是一个有误差的绝对值,而是通量的最大值,实际值是低于该值直至零的任何值 有没有办法告诉拟合任务某些数据点是上限?此外,我必须对许多数据集执行此操作,每个数据集的上限数据点数量不同,因此能够自动执行此操作将是有益的,但不是必要的 如果有任何不清楚的地方,我

我试图在python中对一个已知的具有三个变量的函数执行最小二乘拟合。对于随机生成的有错误的数据,我能够完成此任务,但我需要拟合的实际数据包括一些数据点,这些数据点是值的上限。该函数将通量描述为波长的函数,但在某些情况下,在给定波长下测得的通量不是一个有误差的绝对值,而是通量的最大值,实际值是低于该值直至零的任何值

有没有办法告诉拟合任务某些数据点是上限?此外,我必须对许多数据集执行此操作,每个数据集的上限数据点数量不同,因此能够自动执行此操作将是有益的,但不是必要的

如果有任何不清楚的地方,我深表歉意,如果需要的话,我会尽力解释得更清楚

下面是我用来拟合数据的代码

import numpy as np
from scipy.optimize import leastsq
import math as math
import matplotlib.pyplot as plt


def f_all(x,p):
    return np.exp(p[0])/((x**(3+p[1]))*((np.exp(14404.5/((x*1000000)*p[2])))-1))

def residual(p,y,x,error):
    err=(y-(f_all(x,p)))/error
    return err


p0=[-30,2.0,35.0]

data=np.genfromtxt("./Data_Files/Object_001")
wavelength=data[:,0]
flux=data[:,1]
errors=data[:,2]

p,cov,infodict,mesg,ier=leastsq(residual, p0, args = (flux, wavelength, errors), full_output=True)

print p

Scipy.optimize.leastsq
是一种方便的数据拟合方法,但其背后的工作是最小化函数
Scipy.optimize
包含许多最小化函数,其中一些函数具有处理约束的能力。这里我用
fmin_slsqp
解释,我知道,也许其他人也可以这样做;看

fmin_slsqp
需要最小化函数和参数的初始值。最小化的函数是残差的平方和。对于参数,我首先执行传统的leastsq拟合,并将结果用作约束最小化问题的初始值。然后有几种方法来施加约束(见doc);更简单的是
f_ieqcons
参数:它需要一个函数,该函数返回一个数组,该数组的值必须始终为正(这就是约束条件)。这里,如果对于所有最大值点,拟合函数低于该点,则函数返回正值

导入numpy
导入scipy.optimize作为scimin
将matplotlib.pyplot导入为mpl
datax=numpy.array([1,2,3,4,5])#数据坐标
datay=numpy.array([2.95,6.03,11.2,17.7,26.8])
constraintmaxx=numpy.array([0])#最大约束列表
constraintmaxy=numpy.array([1.2])
#无约束最小二乘拟合
def fitfunc(x,p):#模型$f(x)=a x^2+c
a、 c=p
返回c+a*x**2
定义残差(p):#残差数组
返回数据y fitfunc(数据x,p)
p0=[1,2]#初始参数猜测
p无,cov,infodict,mesg,ier=scimin.leastsq(残差,p0,全输出=真)#传统最小二乘拟合
#带约束的最小二乘fir
def sum_残差(p):#我们想要最小化的函数
回报总额(残差(p)**2)
def约束(p):#约束:返回数组的所有值在结尾处都将>=0
返回constraintmaxy fitfunc(CONSTRAINTMAX,p)
pwith=scimin.fmin_slsqp(残差之和,pwith,f_ieqcons=constraints)#带约束的最小化
#策划
ax=mpl.figure().添加子批次(1,1,1)
ax.绘图(datax,datay,ls=”“,marker=“x”,color=“blue”,mew=2.0,label=“Datas”)
ax.绘图(CONSTRAINTMAX,constraintmaxy,ls=,marker=“x”,color=“red”,mew=2.0,label=“Max points”)
morex=numpy.linspace(0,6100)
ax.plot(morex,fitfunc(morex,pwhithout),color=“blue”,label=“无约束拟合”)
ax.plot(morex,fitfunc(morex,pwith),color=“red”,label=“符合约束条件”)
ax.图例(loc=2)
mpl.show()
在这个例子中,我在一条抛物线上拟合了一个虚构的点样本。以下是无约束和有约束的结果(左侧的红十字):


我希望这将为您的数据样本;否则,请发布一个数据文件,以便我们可以尝试使用真实数据。我知道我的示例不考虑数据上的错误条,但您可以通过修改残差函数轻松处理它们。

正常处理上限点,但惩罚进入非物理区域的任何拟合是否有意义,例如,在这种情况下,通过从
残差返回一个非常大的值
?当使用上限进行拟合时,拟合不一定是非物理的,但它可以约束斜率的尾部(它基本上是一个修改的黑体函数)。如果没有这一限制,拟合仍然可以是真实的,但没有那么好。因此,通常处理上限点只会产生不好的拟合,就像处理误差较大的数据点一样,而不是为拟合函数提供至少一些有用的输入。我希望我的回答有意义。我并不是说这个问题离题了,但如果你想先讨论一下你正在尝试做的事情的方法,那将是一个好地方。这非常有效。非常感谢你!我花了两周的时间试图自己解决这个问题,互联网在不到一天的时间里就解决了这个问题!现在我只需要将这段代码用于我所有的数据,并将其自动化,尽管希望这将是最简单的部分!