Как использовать функцию leastsq из scipy.optimize в python для подгонки прямой и квадратичной линий к наборам данных x и y

Как бы я поместил прямую линию и квадратик в набор данных ниже, используя функцию leastsq из scipy.optimize? Я знаю, как использовать polyfit, чтобы сделать это. Но мне нужно использовать функцию Leastsq.

Вот наборы данных x и y:

x: 1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7

y: 6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828

Может кто-нибудь помочь мне, пожалуйста?

10 голосов | спросил user2956673 5 22013vEurope/Moscow11bEurope/MoscowTue, 05 Nov 2013 18:41:33 +0400 2013, 18:41:33

1 ответ


0

Метод leastsq () находит набор параметров, которые минимизируют функцию ошибки (разница между yExperimental и yFit). Я использовал кортеж для передачи параметров и лямбда-функций для линейного и квадратичного подгонки.

leastsq начинается с первого предположения (начального набора параметров) и пытается минимизировать функцию ошибки. В конце, если leastsq завершается успешно, он возвращает список параметров, которые наилучшим образом соответствуют данным. (Я напечатал, чтобы увидеть это). надеюсь это работает С наилучшими пожеланиями

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


def main():
   # data provided
   x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7])
   y=np.array([6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828])
   # here, create lambda functions for Line, Quadratic fit
   # tpl is a tuple that contains the parameters of the fit
   funcLine=lambda tpl,x : tpl[0]*x+tpl[1]
   funcQuad=lambda tpl,x : tpl[0]*x**2+tpl[1]*x+tpl[2]
   # func is going to be a placeholder for funcLine,funcQuad or whatever 
   # function we would like to fit
   func=funcLine
   # ErrorFunc is the diference between the func and the y "experimental" data
   ErrorFunc=lambda tpl,x,y: func(tpl,x)-y
   #tplInitial contains the "first guess" of the parameters 
   tplInitial1=(1.0,2.0)
   # leastsq finds the set of parameters in the tuple tpl that minimizes
   # ErrorFunc=yfit-yExperimental
   tplFinal1,success=leastsq(ErrorFunc,tplInitial1[:],args=(x,y))
   print " linear fit ",tplFinal1
   xx1=np.linspace(x.min(),x.max(),50)
   yy1=func(tplFinal1,xx1)
   #------------------------------------------------
   # now the quadratic fit
   #-------------------------------------------------
   func=funcQuad
   tplInitial2=(1.0,2.0,3.0)

   tplFinal2,success=leastsq(ErrorFunc,tplInitial2[:],args=(x,y))
   print "quadratic fit" ,tplFinal2
   xx2=xx1

   yy2=func(tplFinal2,xx2)
   plt.plot(xx1,yy1,'r-',x,y,'bo',xx2,yy2,'g-')
   plt.show()

if __name__=="__main__":
   main()
ответил Robert Ribas 30 Jpm1000000pmFri, 30 Jan 2015 21:33:35 +030015 2015, 21:33:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132