Подгонка двухмерных Y-данных в python - PullRequest
1 голос
/ 05 июня 2019

У меня есть общий класс нелинейных задач, где у меня есть 2 или более векторов y-данных, которые связаны зависимым, но известным способом с 2 или более векторами x-данных, и я хочу найти параметры. Я ищу способ адаптации базовой модели нелинейного соответствия в python, чтобы учесть оба набора данных.

В общем случае у меня может быть пара:

[y1(x1, x2; A, B), y2(x1, x2; A, B)]

В качестве конкретного примера я мог бы иметь:

y1 = A sin(B x1) + e^(-A x1)

y2 = A x1^2 + B x2 + log[A x2]

(Предположим, что они аналитически не разрешимы или могут привести к неэффективности в случае их решения). Мне известны все значения y1, y2 и x1, x2, и я хочу найти оценку для A и B, которая учитывает данные обоих ys. Я мог бы просто подогнать одно или другое уравнение и получить оценку для A и B.

Например, представьте, если y2 не зависит от B (или очень слабо). Он по-прежнему дает достоверную информацию о значении A, которое я хочу y1 принять во внимание.

В качестве дополнительного вопроса, как бы я использовал этот метод, чтобы поместить разные веса в два набора данных y?

Edit:

Один из возможных подходов, который я могу придумать, состоит в том, чтобы сложить все y-данные в один столбец, а затем использовать функцию для обработки ожидаемого y1,y2, а затем завершить функцию чем-то вроде return vstack((y1,y2)), чтобы я Можно сравнить два набора? Тогда я мог бы просто иметь весовую функцию, которая соответствует длине этой объединенной функции?

1 Ответ

0 голосов
/ 06 июня 2019

Я думаю, что вы можете следовать этому symfit примеру здесь и адаптировать его к вашей проблеме. Так что это будет что-то вроде:

from symfit import variables, parameters, Fit, sin, exp, log

x_1, x_2, y_1, y_2 = variables('x_1, x_2, y_1, y_2')
A, B = parameters('A, B')

model_dict = {
    y_1: A * sin(B * x_1) + exp(-A * x_1),
    y_2: A * x_1**2 + B * x_2 + log(A * x_2)
}

fit = Fit(model_dict, x_1=x1data, y_1=y1data, x_2=x2data, 
          y_2=y2data, sigma_y_1=y1stdev, sigma_y_2=y2stdev)
fit_result = fit.execute()

Этот пример уже включает разные веса для разных y_1 и y_2, предоставляя стандартные отклонения в качестве дополнительной информации.

Отказ от ответственности: я автор symfit.

...