Может ли Python оптимизировать переменную, чтобы получить максимальный коэффициент корреляции Пирсона?

Если у меня pandas dataframe включает 3 столбца Col1 & Col2 & Col3, и мне нужно получить максимальный коэффициент корреляции Пирсона между Col2 и Col3, учитывая значения в Col1, где измененные значения для Col2 получены по следующей формуле:

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

где B - изменяющаяся переменная для получения максимального коэффициента корреляции Пирсона между Col3 и новыми значениями Col2.

Итак, существует ли метод Python, который может сделать это и вернуть B. Есть ли способ выполнить эту операцию с помощью Python и вернуть значение B, где я хочу повторить этот процесс для других столбцов.


person Sidhom    schedule 26.04.2019    source источник
comment
Каковы границы B?   -  person Adarsh Chavakula    schedule 26.04.2019
comment
не границы для значений B просто дают начальное значение для него   -  person Sidhom    schedule 26.04.2019
comment
И где col3 модифицируется? (поскольку вы упомянули новые значения col2 и col3)   -  person Adarsh Chavakula    schedule 26.04.2019
comment
Col3 не изменял Col2, который был изменен первым на основе начального значения B. Извините за недопонимание.   -  person Sidhom    schedule 26.04.2019


Ответы (1)


Это должно работать

import pandas as pd
import numpy as np
from scipy.optimize import minimize

# dataframe with 20 rows
df = pd.DataFrame(data=np.random.randn(20,3), 
                  columns=['Col1', 'Col2', 'Col3'])

# cost function
def cost_fun(B_array, df):
    B = B_array[0]
    new_col1 = np.power((df['Col1']), B)
    new_col2 = np.array(df['Col2']) * new_col1
    col3 = np.array(df['Col3'])
    pearson = np.corrcoef(new_col2, col3)[1,0]
    return -1*pearson # multiply by -1 to get max

# initial value
B_0 = 1.1

# run minimizer
res = minimize(cost_fun, [B_0], args=(df), 
               options={"maxiter": 100,
                        "disp": True})
# results
print(res)
person Adarsh Chavakula    schedule 26.04.2019
comment
почему вы используете эту строку return -1*pearson # multiply by -1 to get max, лучше всего использовать abs (np.corrcoef (new_col2, col3) [1,0])? - person Sidhom; 26.04.2019
comment
minimize пытается получить наименьшее возможное значение целевой функции. Так как цель состоит в том, чтобы максимизировать пирсон, мы стараемся минимизировать его негатив. Мы не пытаемся получить абсолютное значение - person Adarsh Chavakula; 26.04.2019