У меня есть 6 наборов данных, похожих на это (не мои фактические данные): "Необработанные" данные - извините, недостаточно репов для публикации изображений ...
для каждого набора данных (я) Я пытаюсь построить y_i/a_i
против a_i*x_i
так, чтобы у меня было что-то похожее на этот график (обратите внимание на сжатый и перекрывающийся вид): Сдвинутые данные Редактировать: Если неясно, y_i/a_i
против a_i*x_i
- это то, что я не могу изменить.
Я хотел бы оптимизировать вектор a
, чтобы максимально увеличить перекрытие между наборами данных.
Это сообщение привел меня на путь использования scipy.spatial.distance.cdist, чтобы минимизировать мое расстояние между точками и, таким образом, уменьшить наложение. Я решил, что pdist будет лучше для перекрытия всех наборов данных, и затем попытался использовать scipy.optimize.minimize, чтобы установить мои значения для a
. Каждый раз, когда я пытаюсь установить границы, я получаю b'ABNORMAL_TERMINATION_IN_LNSRCH
, который, кажется, происходит из-за ошибки градиента , но это начинает волновать меня.
Код ниже о том, что я пришелпокончено с тем, насколько я мог справиться.
def data_shift(x0, a, df):
"""
x0: our initial guess of values for a_i
a: a DataFrame with two columns: Dataset, a_i
df: a DataFrame with 3 columns: Dataset, x, and y
"""
#overwrite old values of a[a_i]
a['a_i']=x0
# match each data set with it's shifting variable
# and combine into one DataFrame
dfs=df.merge(a, on='Dataset')
# create new columns of shifted data based on a
dfs['ax'] = dfs['x']*dfs['a_i']
dfs['ya'] = dfs['y']/dfs['a_i']
return np.mean(pdist(dfs.loc[:, ['ax', 'ya']]))
# set bounds for values of a_i
# a_i must be >0, but generally it is <5 too
b=(0,5)
bnds=(b,b,b,b,b,b) #one b for each a_i
sol = minimize(data_shift, x0=[1,1,1,1,1,1], args=(a, df), bounds=bnds)
sol
Прямо сейчас это просто дает мне это:
fun: nan
hess_inv: <6x6 LbfgsInvHessProduct with dtype=float64>
jac: array([33751.64233148, 66479.62145507, 75388.05366494, 48267.75984839,
15358.34744573, 39810.20417996])
message: b'ABNORMAL_TERMINATION_IN_LNSRCH'
nfev: 147
nit: 0
status: 2
success: False
x: array([1., 1., 1., 1., 1., 1.])
Все предложения и альтернативы приветствуются, так как я немногонад моей головой в этот момент. Спасибо!