interp1d与流数据?

时间:2016-05-02 20:09:29

标签: python scipy interpolation

我知道您可以通过引用将数据列表xy传递给scipy' interp1d。这是否意味着我可以通过简单地修改输入xy来为其添加新数据?

理想情况下,我正在寻找可以有效执行以下操作的内容:

  1. 它会插入我们请求的某个点的值。
  2. 根据该插值,我们决定是否获得真实的'值。
  3. 如果获得了真实值,那么我们希望更新算法的知识,以便将来进行插值。
  4. 但是,一旦将值放入插值算法中,就不会假定它们发生变化 - 只能添加新点。我认为 interp1d对输入数据进行某种奇特的处理以使查找更快,但我不确定是否会阻止在原地添加数据。请帮忙!

    编辑:有些人可能会注意到这与Metropolis-Hastings有很多共同点,但是,步骤1-3可能不会连续发生;因此我需要一个更抽象的插值方法来支持异步更新。如果您知道任何建议,那就太棒了!

1 个答案:

答案 0 :(得分:2)

我认为最简单的是编写自己的插值对象:

class Interpolator:
    def __init__(self,x,y):
        if len(x)!=len(y):
            raise BaseException("Lists must have the same length")
        self.xlist=x
        self.ylist=y 
        self.len=len(x)
    def find_x_index(self,x0): # find index i such that xlist[i]<=x0<xlist[i+1]
        a,b=0,self.len-1 
        while b-a>1:
            m=int((b+a)/2)
            if x0<self.xlist[m]:
                b=m
            else:
                a=m
        return a
    def add_point(self,x,y): # add a new point 
        if x<self.xlist[0]:
            self.xlist.insert(0,x)
            self.ylist.insert(0,y)
        elif x>self.xlist[-1]:
            self.xlist.append(x)
            self.ylist.append(y)
        else:
            i=self.find_x_index(x)
            self.xlist.insert(i+1,x)
            self.ylist.insert(i+1,y)
        self.len+=1
    def interpolate(self,x0): # interpolates y value for x0
        if x0<self.xlist[0] or x0>self.xlist[-1]:
            raise BaseException("Value out of range")
        a=self.find_x_index(x0)
        eps=(x0-self.xlist[a])/(self.xlist[a+1]-self.xlist[a]) # interpolation
        return (eps*self.ylist[a+1]+(1-eps)*self.ylist[a])

itp=Interpolator([1,2,3],[1,3,4])
print(itp.interpolate(1.6))
itp.add_point(1.5,3)
print(itp.interpolate(1.6))

关键是要始终对x列表进行排序,以便您可以使用二分法,这是一种对数复杂度算法。

备注:在add_point中,您应该检查两个x值不同的y[ { "category":"PASTAS", "createdAt":"2016-01-01T19:47:57.813Z", "currency":"$", "dishName":"Spaghetti", "estTime":"10-20 min", "price":10, "subName":"Pasta", "updatedAt":"2016-04-28T20:48:06.800Z" }, { "category":"PIZZAS", "createdAt":"2016-04-19T21:44:56.285Z", "currency":"$", "dishName":"Ai Funghi Pizza ", "estTime":"20-30 min", "price":20, "subName":"Pizza", "updatedAt":"2016-04-28T20:58:39.499Z" }, { "category":"PIZZAS", "createdAt":"2016-04-19T21:44:56.285Z", "currency":"$", "dishName":"Seafood Pizza", "estTime":"20-30 min", "price":10, "subName":"Pizza", "updatedAt":"2016-04-28T20:58:39.499Z" } ]