Scipy 'تقليل مجموع المربعات من مجموعة من المعادلات "

StackOverflow https://stackoverflow.com/questions/1488227

  •  18-09-2019
  •  | 
  •  

سؤال

أواجه مشكلة في روتين التحسين "SciPy"، إذا قمت بتنفيذ البرنامج التالي

    raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.

وأحيانا index out of range for an array...

from scipy import *
import numpy
from scipy import optimize
from numpy import asarray
from math import *

def func(apar):
  apar = numpy.asarray(apar)
  x = apar[0]
  y = apar[1]
  eqn = abs(x-y)
  return eqn

Init = numpy.asarray([20.0, 10.0])
x = optimize.leastsq(func, Init, full_output=0, col_deriv=0, factor=100, diag=None, warning=True)
print 'optimized parameters: ',x
print '******* The End ******'

أنا لا أعرف ما هي المشكلة مع بلدي func optimize.leastsq () دعوة، الرجاء مساعدتي

هل كانت مفيدة؟

المحلول

leastsq يعمل مع المتجهات حتى الوظيفة المتبقية، func, ، يحتاج إلى إرجاع متجه طول اثنين على الأقل. لذلك إذا استبدلت return eqn مع return [eqn, 0.], ، سوف يعمل مثالك. تشغيله يعطي:

optimized parameters:  (array([10., 10.]), 2)

وهو واحد من العديد من الإجابات الصحيحة للحد الأدنى من الفرق المطلق.

إذا كنت ترغب في تقليل وظيفة العددية، fmin هو الطريق للذهاب، optimize.fmin(func, Init).

القضية هنا هي أن هذين الوظيفتين، على الرغم من أنها تبدو هي نفسها بالنسبة للأجمال تهدف إلى أهداف مختلفة. leastsq يجد الخطأ الأقل تربيعا، عموما من مجموعة من المنحنيات المثالية، وهي طريقة واحدة فقط للقيام ب "أفضل ملاءمة". من ناحية أخرى fmin يجد الحد الأدنى لقيمة وظيفة العددية.

من الواضح أنك مثال لعبة، والتي لا معنى لها من المنطقي حقا، وبالتالي الطريقة التي تذهب بها تعتمد على ما هو هدفك النهائي.

نصائح أخرى

منذ أن تريد تقليل وظيفة العددية البسيطة (func() إرجاع قيمة واحدة، وليس قائمة القيم)، scipy.optimize.leastsq() يجب استبداله بمكالمة واحدة من fmin وظائف (مع الحجج المناسبة):

x = optimize.fmin(func, Init)

يعمل بشكل صحيح!

حقيقة، leastsq() يقلل من مجموع المربعات من قائمة القيم. لا يبدو أنه يعمل على (قائمة تحتوي على أ) قيمة واحدة، كما هو الحال في مثالك (على الرغم من أنه يمكن، من الناحية النظرية).

مجرد النظر إلى المستندات المربعات الصغرى, قد يكون ذلك وظيفتك func يتم تعريف بشكل غير صحيح. كنت تفترض أنك تتلقى دائما مجموعة من الطول على الأقل 2، ولكن الوظيفة الأمثل غامضة بجنون حول طول الصفيف الذي ستتلقاه. قد تحاول الكتابة لعرض أي شيء apar هو، لمعرفة ما تحصل عليه بالفعل.

إذا كنت تستخدم شيء مثل ipython أو قذيفة بيثون، يجب أن تحصل على آثار المكدس التي تظهر لك بالضبط الخط الذي يحدث فيه الخطأ، لذلك ابدأ هناك. إذا لم تتمكن من معرفة ذلك من هناك، فمن المحتمل أن يساعدنا تتبع المكدس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top