numpy polyfit产生废话

时间:2016-09-23 12:21:43

标签: python numpy data-fitting

我正在尝试使用这些值:Values to fit

这是我的代码:

  for i in range(-area,area):
    stDev1= []
    for j in range(-area,area):
        stDev0 = stDev[i+i0][j+j0]
        stDev1.append(stDev0)
    slices[i] = stDev1
fitV = []
xV = []

for l in range(-area,area):
    y = np.asarray(slices[l])
    x =  np.arange(0,2*area,1)

for m in range(-area,area):
        fitV.append(slices[m][l])
        xV.append(l)


fit = np.polyfit(xV,fitV,4)
yfit = function(fit,area)

x100 = np.arange(0,100,1)

plt.plot(xV,fitV,'.')
plt.savefig("fits1.png")

def function(fit,area):
   yfit = []
   for x in range(-area,area):
       yfit.append(fit[0]+fit[1]*x+fit[2]*x**2+fit[3]*x**3+fit[4]*x**4)
   return(yfit)

i0 = 400
j0 = 400
area = 50 
stdev = 2d np.array([1300][800]) #just an image of "noise" feel free to add any image // 2d np array you like. 

这会产生: Wrong fit, in green are the same values I plotted in image 1

显然这是完全错误的吗? 我想我错过了理解polyfit的概念?从文档的要求是我用两个形状x [i] y [i]的数组喂它?

中的我的价值观
  xV = [ x_1_-50,x_1_-49,...,x_1_49,x_2_-50,...,x_49_49] 

我的是:

  fitV = [y_1_-50,y_1_-49,...,y_1_49,...y_2_-50,...,y_2_49]

1 个答案:

答案 0 :(得分:1)

我不完全了解你的程序。将来,如果您将问题提炼为MCVE,将会很有帮助。但这里有一些想法:

  1. 在您的数据中,对于给定的 x 值,似乎有多个 y 值。给定( x y )数据,polyfit返回表示多项式函数的元组,但没有函数可以映射单个 x 的值为 y 的多个值。作为第一步,考虑使用例如均值,中值或模式将每组 y 值折叠成单个代表值。或者,或许,在您的域中,有一种更自然的方式来做到这一点。

  2. 其次,使用这对函数np.polyfitnp.polyval的惯用方法,并且您不会以标准方式使用它们。当然,存在许多有用的偏离这种模式,但首先要确保你理解这两个函数的基本模式。

    一个。根据您在 x_data 的时间或地点拍摄的测量 y_data ,绘制它们并猜测拟合的顺序。那就是它看起来像一条线?像抛物线?让我们假设您认为您的数据是抛物线的,并且您将使用二阶多项式拟合。

    湾确保按照增加x的顺序对数组进行排序。有很多方法可以做到这一点,但np.argsort很简单。

    ℃。运行polyfitp = polyfit(x_data,y_data,2),它返回包含p(c2,c1,c0)中的第2,第1和第0阶系数的元组。

    d。在习惯使用polyfitpolyval时,接下来您将生成适合度:polyval(p,x_data)。或者您可能希望更粗略或精细地对拟合进行采样,在这种情况下,您可以采用x_data的子集或在x_data中插入更多值。

  3. 下面是一个完整的例子。

    import numpy as np
    from matplotlib import pyplot as plt
    
    # these are your measurements, unsorted
    x_data = np.array([18, 6, 9, 12 , 3, 0, 15])
    y_data = np.array([583.26347805, 63.16059915, 100.94286909, 183.72581827, 62.24497418,
                       134.99558191, 368.78421529])
    
    # first, sort both vectors in increasing-x order:
    sorted_indices = np.argsort(x_data)
    x_data = x_data[sorted_indices]
    y_data = y_data[sorted_indices]
    
    # now, plot and observe the parabolic shape:
    plt.plot(x_data,y_data,'ks')
    plt.show()
    
    # generate the 2nd order fitting polynomial:
    p = np.polyfit(x_data,y_data,2)
    
    # make a more finely sampled x_fit vector with, for example
    # 1024 equally spaced points between the first and last
    # values of x_data
    x_fit = np.linspace(x_data[0],x_data[-1],1024)
    
    # now, compute the fit using your polynomial:
    y_fit = np.polyval(p,x_fit)
    
    # and plot them together:
    plt.plot(x_data,y_data,'ks')
    plt.plot(x_fit,y_fit,'b--')
    plt.show()
    

    希望有所帮助。