Python, смоделируйте функцию на основе значений x и y - PullRequest
0 голосов
/ 12 мая 2018

У меня проблема, у меня есть 2 списка со значениями x и y, и я хотел бы создать функцию на их основе.Но проблема в том, что я хотел бы создать такую ​​функцию:

f (x) = a * (xb) ** c

Я уже знаю scipy.interpolate, но я не могНе найти ничего, что могло бы вернуть функцию, подобную этой.

Есть ли довольно простой способ попытаться создать лучшую функцию, которую я могу найти, выполнив поиск значений a, b и c, наиболее подходящих?

спасибо за вашу помощь!

Редактировать:

вот как выглядят мои текущие значения x и y:

enter image description here

Я создал эту функцию:

def problem(values):
    s = sum((y - values[0]*(x-values[1])**values[2])**2 for x,y in zip(X,Y))
    return(s)

и попытался найти наилучшие значения a, b и c с помощью scipy.optimize.minimize, но я не знаю, с какими значениямиа, б и в я должен начать ...

values = minimize(problem,(a,b,c))

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

def def (a, b, c, d):

вернуть a * (x [d] -b) ** c

Полагаю, это то, что вы ищете. С D, которое является значением массива X. Не уверен, где Y входит в это.

0 голосов
/ 12 мая 2018

(отредактировано для учета добавленного кода ОП и подвопроса.)

Общая идея состоит в том, чтобы использовать минимизацию наименьших квадратов, чтобы найти "лучшие" значения a, b и c. Сначала определите функцию, параметры которой a, b, c, которая возвращает сумму квадратов разностей между заданными значениями y и вычисленными значениями a * (x-b)**c. (Эта функция может быть выполнена в виде одной строки.) Затем используйте процедуру оптимизации, например, найденную в scipy, чтобы минимизировать значение этого значения функции. Эти значения a, b, c - то, что вы хотите - используйте их, чтобы определить желаемую функцию.

Необходимо рассмотреть несколько деталей, например, ограничения на допустимые значения a, b, c, но они в некоторой степени зависят от ваших списков значений x и y.

Теперь, когда вы показали график ваших значений x и y, я вижу, что все ваши значения положительные и функция в целом увеличивается. Для этой общей ситуации я бы использовал начальные значения

a = 1.0
b = 0.0
c = 1.0

Это дает прямую линию через начало координат, фактически линию y = x, которая часто является приличным первым предположением. В вашем случае значения x и y имеют очень разную шкалу: y примерно в сто раз больше, чем x, поэтому вы, вероятно, получите лучшие результаты, изменив значение a:

a = 100.0
b = 0.0
c = 1.0

Я вижу еще лучшие значения и некоторые ограничения на конечные значения, но я бы предпочел, чтобы этот ответ был более общим и полезным для других подобных проблем.

Ваша функция problem() выглядит правильно для меня, хотя я бы написал немного по-другому для большей ясности. Обязательно протестируйте его.

...