Не получить правильное значение с numpy polyfit - PullRequest
0 голосов
/ 29 марта 2020
import numpy as np
from matplotlib import pyplot as plt
a = np.ndarray((2,8))

a[0] = [0,10,21.5,25.2,70,89,112,150] # row for all X values
a[1] = [0,5,10,15,20,25,30,35] # row for all Y values


#Value by curve fitting - 7th order polynomial            
trend = np.polyfit(a[0], a[1], 7)
trendpoly = np.poly1d(trend) #Values of the coefficients of 5th order polynomial
plt.plot(a[0],trendpoly(a[0]))
plt.plot(a[0],a[1])

Y4 = trendpoly(100)
plt.scatter(100,Y4)

print(Y4)

График результатов выглядит следующим образом - идеально подходит для данных. Две перекрывающиеся кривые данных и подгонка кривой с точкой разброса, показывающей значение при X = 100, которое находится далеко от подбора кривой

Two overlapping curves of the data and the curve fit, with a scatter point showing the value at X = 100 which is way off from the curve fit

Что здесь не так? почему значение trendpoly (100) не соответствует кривой соответствия?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Если вы построите полный многочлен, который вам подходит, и разберете свои точки данных

trend = np.polyfit(a[0], a[1], 7)
x_line = np.linspace(0,150,1000)
fit = np.polyval(trend, x_line)
plt.scatter(a[0], a[1])
plt.plot(x_line, fit)

, вы, скорее всего, увидите дико колеблющуюся кривую, которая колеблется вокруг ваших точек данных. Способы определения степени вашего подходящего полинома: 1) посмотреть, какую функцию вы ожидаете от ваших данных. 2) пробовать разные полиномиальные степени, пока вы не получите форму, которая не колеблется слишком много.

Если у вас есть n точек данных, многочлен степени> = n-1 будет точно перехватывать каждую точку данных, но будет далеко от вашей кривой между точками данных.

Если вы ожидаете, что ваши данные будут следовать некоторой неполиномиальной функции, такой как log (x) или exp (x) (или, возможно, * sqrt (b * x) в этом случае), вы можете заглянуть в scipy.curve_fit.

1 голос
/ 29 марта 2020

Это проблема переоснащения .

Чем больше вы установите порядок многочлена, тем больше будет переобучение. Попробуйте с порядком 3 или менее наблюдать изменения.

enter image description here

...