Состояние документов для второго возвращаемого значения из curve_fit :
pcov
Расчетная ковариация поп. Диагонали обеспечивают дисперсию оценки параметра. Чтобы вычислить одно стандартное отклонение ошибок по параметрам, используйте perr = np.sqrt(np.diag(pcov))
.
Поэтому, если вы хотите минимизировать общую ошибку, вам нужно объединить ошибки обоих ваших подгонок.
def objective(what, ever):
poptRI, pcovRI = curve_fit(CCRI, f_exp, e_exp, p0=(ig_fc, ig_alpha))
poptiQ, pcoviQ = curve_fit(CCiQ, f_exp, iq_exp, p0=(ig_fc, ig_alpha))
# not sure if this the correct equation, but you can start with it
err_total = np.sum(np.sqrt(np.diag(pcovRI))) + np.sum(np.sqrt(np.diag(pcoviQ)))
return err_total
Об общих ошибках 2d гауссовых функций:
https://www.visiondummy.com/2014/04/draw-error-ellipse-representing-covariance-matrix/
Обновление: поскольку вы хотите, чтобы poptRI
и poptiQ
были одинаковыми, вы нужно минимизировать их расстояние.
Это можно сделать, как
from numpy import linalg
def objective(what, ever):
poptRI, pcovRI = curve_fit(CCRI, f_exp, e_exp, p0=(ig_fc, ig_alpha))
poptiQ, pcoviQ = curve_fit(CCiQ, f_exp, iq_exp, p0=(ig_fc, ig_alpha))
delta = linalg.norm(poptiQ - poptRI)
return delta
Минимизация этой функции приведет (должна) привести к аналогичным значениям для poptRI
и poptiQ
. Вы берете параметры как векторы и пытаетесь минимизировать длину их дельта-вектора.
Однако этот подход предполагает, что poptRI
и poptiQ
(и их коэффициенты) находятся примерно в одном диапазоне, так как вы используют некоторые метри c на них. Если, скажем, один, если они находятся в диапазоне 2000, а другой в диапазоне 2. Тогда оптимизатор предпочтет настроить первый. Но, возможно, это нормально.
Если вы как-то хотите относиться к ним одинаково, вам нужно нормализовать их. Один подход (при условии, что все коэффициенты одинаковы) может быть
linalg.norm((poptiQ / linalg.norm(poptiQ)) - (poptRI / linalg.norm(poptRI))))
. Вы нормализуете результаты по единичным векторам, затем вычитаете их, затем создаете норму.
То же самое верно для входных данных. к функции, но это может быть не так важно, там. См. Ссылки ниже.
Но это сильно зависит от проблемы, которую вы пытаетесь решить. Не существует общего решения.
Некоторые ссылки, связанные с этим:
Является ли нормализация полезной / необходимой в оптимизации?
Почему мы Нужно ли нормализовать вход для искусственной нейронной сети?
Еще одна целевая функция:
Это то, что вы пытаетесь сделать? Вы хотите найти лучшие fc
и alpha
, чтобы результаты подгонки обеих функций были как можно ближе?
def objective(fc, alpha):
poptRI, pcovRI = curve_fit(CCRI, f_exp, e_exp, p0=(fc, alpha))
poptiQ, pcoviQ = curve_fit(CCiQ, f_exp, iq_exp, p0=(fc, alpha))
delta = linalg.norm(poptiQ - poptRI)
return delta