Scipy 'تقليل مجموع المربعات من مجموعة من المعادلات "
سؤال
أواجه مشكلة في روتين التحسين "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
أو قذيفة بيثون، يجب أن تحصل على آثار المكدس التي تظهر لك بالضبط الخط الذي يحدث فيه الخطأ، لذلك ابدأ هناك. إذا لم تتمكن من معرفة ذلك من هناك، فمن المحتمل أن يساعدنا تتبع المكدس.