Лучше подходит для степенной кривой - PullRequest
1 голос
/ 30 января 2020

Итак, у меня было несколько точек в информационном кадре, которые заставили меня поверить, что я имею дело со степенной кривой. После некоторого поиска в Google, я использовал то, что нашел в этом посте до go о подгонке кривой.

def func_powerlaw(x, m, c, c0):
    return c0 + x**m * c

target_func = func_powerlaw

X = np.array(selection_to_feed.selection[1:])
y = np.array(selection_to_feed.avg_feed_size[1:])

popt, pcov = curve_fit(func_powerlaw, X, y, p0 =np.asarray([-1,10**5,0]))

curvex = np.linspace(0,5000,1000)
curvey = target_func(curvex, *popt)

plt.figure(figsize=(10, 5))
plt.plot(curvex, curvey, '--')
plt.plot(X, y, 'ro')
plt.legend()
plt.show()

Вот результат:

Кривая

Проблема в том, что подгонка кривой приводит к отрицательным значениям для первых нескольких значений (как вы можете видеть на синей линии), и в фактических отношениях отрицательные значения Y не могут существовать.

Несколько вопросов:

  1. Что я могу сделать, чтобы никакие отрицательные значения Y не могли быть выведены? Действительно, X 0 также должен иметь значение Y 0.
  2. Является ли кривая степенного закона правильной? Как бы вы описали эту кривую?

Спасибо!

1 Ответ

0 голосов
/ 30 января 2020

Если вы ищете только простое приближенное уравнение с лучшей подгонкой, я извлек данные из вашего графика и добавил известную точку данных [0,0] для вашей заметки. Поскольку неопределенность для точки [0,0] равна нулю, то есть вы на 100% уверены в этом значении, я использовал взвешенную регрессию, в которой этой известной точке был присвоен чрезвычайно высокий вес, а вес для всех остальных точек был 1. Это привело к тому, что кривая прошла через точку [0,0], что можно сделать с помощью любого программного обеспечения, которое позволяет взвешенную аппроксимацию. Я обнаружил, что стандартное уравнение Geometri c плюс смещение «y = a * pow (x, (b * x)) + offset» с параметрами:

a = -1.0704001788540748E+02
b = -1.5095055897637395E-03
Offset =  1.0704001788540748E+02

соответствует, как показано в прилагаемом документе. участок и проходит через [0,0]. Мое предложение состоит в том, чтобы выполнить регрессию, используя это уравнение с фактическими данными плюс известную точку [0,0], используя эти значения в качестве начальных оценок параметров - и, если возможно, используя очень большой вес для точки [0,0] как Я сделал.

plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...