Как подогнать полином (используя np.polyfit или что-то еще) в условиях перехвата? - PullRequest
1 голос
/ 21 марта 2019

Я хочу написать обобщенную функцию, которая принимает в качестве входных данных два одномерных массива и целое число N и возвращает наиболее вероятный полином степени N, который соответствует моим данным.Я хочу, чтобы этот многочлен имел нулевой перехват.Я уже писал это:

def calibrate_polynomial(cv, opening, N): #cv and opening are list of data, N is the degree of the desired polynome
print(np.polyfit(cv, opening, N))

Я хочу добавить условие на перехват.Существует ли он с np.polyfit (кажется, нет, так как я прочитал уведомление) или у вас есть другая функция для этого?Спасибо

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Ответ, уже присутствующий здесь, упоминает scipy.optimize.curve_fit. Это то, что я собирался предложить, однако я не думаю, что установление границ действительно лучший способ сделать то, что вы хотите сделать. Если вы хотите, чтобы y-перехват был установлен на ноль, а не устанавливал границы, вы должны просто определить уравнения, которые вы используете явно. Например, для линейной подгонки:

Bpopt, Bpcov = curve_fit(lambda x,a: a*x, cv, opening, p0 = 1)

Вместо использования ax+b, вы просто используете ax. Аналогичным образом могут быть определены уравнения для прохождения (0,0) для каждого многочлена, который вы хотите подогнать.

Единственное, чего не было в этом вопросе, на что, я чувствую, я должен указать на всякий случай, это то, что вы не можете напрямую сравнивать полиномы разных степеней. Уравнение с большей степенью свободы всегда будет лучше соответствовать данным, чем уравнение с меньшей степенью свободы. Если вы хотите сравнить, например, линейную и квадратичную подгонку, вы не можете просто уместить линии и взять одну с наименьшей ошибкой. Квадратичная посадка почти всегда побеждает. Чтобы сделать сравнение, необходимо выполнить какое-то тестирование гипотез. Вы должны предположить, что полином более низкой степени действительно лучше всего подходит, и принять в качестве своей альтернативной гипотезы более высокую степень соответствия. Есть много способов сделать это. Я лично неравнодушен к начальной загрузке. Начальная загрузка, как тест на достоверность, работает путем создания набора наборов данных путем случайной выборки с заменой из вашего фактического набора данных, а затем проверки того, находится ли соответствие для вашего фактического набора данных в верхних 5% совпадений для ваших случайно сгенерированных наборов данных. Таким образом, вы можете отчасти исправить тот факт, что уравнение с более высокой степенью будет лучше подходить для любого случайного набора данных, чем уравнение с более низкой степенью. Я могу опубликовать некоторый код, если вы хотите, но, независимо от того, как вы это делаете, вам нужен тест на достоверность, чтобы сравнить совпадения с многочленами различной степени.

1 голос
/ 21 марта 2019

Вы можете использовать подпрограмму нелинейного подбора кривой в пакете scipy (см. https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)) и определить свою полиномиальную функцию в качестве входной функции для подгонки. Подпрограмма curve_fit позволяет устанавливать границы.

...