Оптимизируйте изменяющиеся переменные, чтобы получить максимальный коэффициент корреляции Пирсона для нескольких столбцов.

Поправка:

Если у меня есть DataFrame pandas, который включает 5 столбцов Col1 и Col2 и Col3 и Col4 и Col5, и мне нужно получить максимальный коэффициент корреляции Пирсона между (Col2, Col3) и (Col2, Col4) и (Col2, Col5), учитывая значения в Col1

Модифицированные значения для Col2, полученные по следующей формуле:

df['Col1']=np.power((df['Col1']),B)
df['Col2']=df['Col2']*df['Col1']

где B — изменяющаяся переменная (одно значение), чтобы получить максимальный коэффициент корреляции Пирсона между (новыми значениями Col2, Col3) и (новыми значениями Col2, Col4) и (новыми значениями Col2, Col5).

Обновлять:

введите здесь описание изображения

В приведенной выше таблице, содержащей 5 столбцов, как я упоминал выше, корреляция между коэффициентом между (Col2,Col3) и (Col2,Col4) и (Col2,Col5) показана под таблицей.

Мне нужно изменить значения Col2 на основе двух упомянутых уравнений, где изменяющееся значение равно B.

Итак, вопрос в том, как получить наилучшее значение B, которое дает новый коэффициент корреляции, больший или равный его аналогу (старому)?

введите здесь описание изображения

Обновление 2:

Кол1, Кол2, Кол3, Кол4, Кол5

2,0.051361397,2618,1453,1099

4,0.053507779,306,153,150

2,0.041236151,39,54,34

6,0.094526419,2755,2209,1947

4,0.079773397,2313,1261,1022

4,0.083891415,3528,2502,2029

6,0.090737243,3594,2781,2508

2,0.069552772,370,234,246

2,0.052401789,690,402,280

2,0.039930675,1218,846,631

4,0.065952096,1706,523,453

2,0.053064126,314,197,123

6,0.076847486,4019,1675,1452

2,0.044881545,604,402,356

2,0.073102611,2214,1263,1050

0,0.046998526,938,648,572


person Sidhom    schedule 27.04.2019    source источник
comment
Не могли бы вы предоставить минимальный пример фрейма данных?   -  person Cleb    schedule 27.04.2019
comment
@Cleb Можешь проверить обновления?   -  person Sidhom    schedule 28.04.2019
comment
Не могли бы вы добавить данные, которые можно скопировать и вставить? картинки мало помогают...   -  person Cleb    schedule 28.04.2019
comment
@Клеб Это нормально?   -  person Sidhom    schedule 28.04.2019
comment
Да, для тех, кто заинтересован, вы можете использовать df = pd.read_clipboard(sep=',').   -  person Cleb    schedule 28.04.2019


Ответы (1)


Не очень элегантно, но работает; не стесняйтесь сделать это более общим:

import pandas as pd
from scipy.optimize import minimize


def minimize_me(b, df):

    # we want to maximize, so we have to multiply by -1
    return -1 * df['Col3'].corr(df['Col2'] * df['Col1'] ** b )

# read your dataframe from somehwere, e.g. csv
df = pd.read_clipboard(sep=',')

# B is greater than 0 for now
bnds = [(0, None)]

res = minimize(minimize_me, (1), args=(df,), bounds=bnds)

if res.success:
    # that's the optimal B
    print(res.x[0])

    # that's the highest correlation you can get
    print(-1 * res.fun)
else:
    print("Sorry, the optimization was not successful. Try with another initial"
          " guess or optimization method")

Это напечатает:

0.9020784246026575 # your B
0.7614993786787415 # highest correlation for corr(col2, col3)

Теперь я читаю из clipboard, замените его вашим файлом .csv. Затем вам также следует избегать жесткого кодирования столбцов; приведенный выше код предназначен только для демонстрационных целей, чтобы вы увидели, как настроить саму проблему оптимизации.

Если вас интересует сумма, вы можете использовать (остальная часть кода без изменений):

def minimize_me(b, df):

    col_mod = df['Col2'] * df['Col1'] ** b

    # we want to maximize, so we have to multiply by -1
    return -1 * (df['Col3'].corr(col_mod) +
                 df['Col4'].corr(col_mod) +
                 df['Col5'].corr(col_mod))

Это напечатает:

1.0452394748131613
2.3428368479642137
person Cleb    schedule 28.04.2019
comment
Спасибо за Ваш ответ. но мне нужно одно значение для B, которое может дать максимальную корреляцию, хотя вывод вашего кода такой же, как и в принятом ответе на этот вопрос '[link](stackoverflow.com/questions/55868595/ ) ' - person Sidhom; 28.04.2019
comment
@Sidhom: Что вы подразумеваете под одним значением? Должен ли B максимизировать сумму коэффициентов корреляции col2, col3, col2, col4 и col2, col5? - person Cleb; 28.04.2019
comment
Я имею в виду, что на выходе B должно быть одно значение, которое может дать наилучшую корреляцию между упомянутыми парами вместе. Если нет, это может сделать метод python, я думаю, вашей идеи о максимизации суммы коэффициентов корреляции col2, col3, col2, col4 и col2, col5 будет достаточно. - person Sidhom; 28.04.2019
comment
Большое спасибо. это лучший способ достичь требуемого. - person Sidhom; 29.04.2019