Ответ, уже присутствующий здесь, упоминает scipy.optimize.curve_fit
. Это то, что я собирался предложить, однако я не думаю, что установление границ действительно лучший способ сделать то, что вы хотите сделать. Если вы хотите, чтобы y-перехват был установлен на ноль, а не устанавливал границы, вы должны просто определить уравнения, которые вы используете явно. Например, для линейной подгонки:
Bpopt, Bpcov = curve_fit(lambda x,a: a*x, cv, opening, p0 = 1)
Вместо использования ax+b
, вы просто используете ax
. Аналогичным образом могут быть определены уравнения для прохождения (0,0) для каждого многочлена, который вы хотите подогнать.
Единственное, чего не было в этом вопросе, на что, я чувствую, я должен указать на всякий случай, это то, что вы не можете напрямую сравнивать полиномы разных степеней. Уравнение с большей степенью свободы всегда будет лучше соответствовать данным, чем уравнение с меньшей степенью свободы. Если вы хотите сравнить, например, линейную и квадратичную подгонку, вы не можете просто уместить линии и взять одну с наименьшей ошибкой. Квадратичная посадка почти всегда побеждает. Чтобы сделать сравнение, необходимо выполнить какое-то тестирование гипотез. Вы должны предположить, что полином более низкой степени действительно лучше всего подходит, и принять в качестве своей альтернативной гипотезы более высокую степень соответствия. Есть много способов сделать это. Я лично неравнодушен к начальной загрузке. Начальная загрузка, как тест на достоверность, работает путем создания набора наборов данных путем случайной выборки с заменой из вашего фактического набора данных, а затем проверки того, находится ли соответствие для вашего фактического набора данных в верхних 5% совпадений для ваших случайно сгенерированных наборов данных. Таким образом, вы можете отчасти исправить тот факт, что уравнение с более высокой степенью будет лучше подходить для любого случайного набора данных, чем уравнение с более низкой степенью. Я могу опубликовать некоторый код, если вы хотите, но, независимо от того, как вы это делаете, вам нужен тест на достоверность, чтобы сравнить совпадения с многочленами различной степени.