Оптимизация мультипликативных факторов целых наборов данных для максимального перекрытия - PullRequest
1 голос
/ 07 октября 2019

У меня есть 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.])

Все предложения и альтернативы приветствуются, так как я немногонад моей головой в этот момент. Спасибо!

...