Оптимизируйте изменение переменных, чтобы получить максимальный коэффициент корреляции Пирсона для нескольких столбцов - PullRequest
0 голосов
/ 27 апреля 2019

Поправка:

Если у меня есть пандас DataFrame, который содержит 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).

Обновление:

enter image description here

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

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

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

enter image description here

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

Col1, Col2, Col3, COL4, Col5

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

1 Ответ

1 голос
/ 28 апреля 2019

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

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
...