【问题标题】:Can python optimize a variable to get max Pearson's correlation coefficient?python可以优化变量以获得最大皮尔逊相关系数吗?
【发布时间】:2019-09-16 00:37:22
【问题描述】:

如果我的 pandas 数据框包含 3 列 Col1 & Col2& Col3 并且我需要通过考虑 Col1 中修改后的值来获得 Col2Col3 之间的最大 Pearson 相关系数值对于Col2由下式得到:

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

其中 B 是变化变量,以获得 Col3Col2 的新值之间的最大 Pearson 相关系数

那么有没有一种 Python 方法可以做到这一点并返回 B。有没有办法使用 Python 执行此操作并返回 B 值,我想将这个过程重复到其他列。

【问题讨论】:

  • B 的界限是什么?
  • B 值没有界限,只是给它一个初始值
  • col3 在哪里被修改? (因为你提到了 'col2' 和 'col3' 的新值)
  • Col3没有根据B的初始值修改最先修改的Col2。抱歉造成误解。

标签: python-3.x scipy scipy-optimize


【解决方案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)

【讨论】:

  • 为什么用这行return -1*pearson # multiply by -1 to get max,最好用abs(np.corrcoef(new_col2, col3)[1,0])?
  • minimize 试图获得尽可能低的目标函数值。由于目标是最大化 pearson,我们尝试最小化它的负数。我们不是要获取绝对值
猜你喜欢
  • 2019-09-16
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2011-09-13
  • 2012-11-19
  • 2014-04-11
  • 2014-11-13
相关资源
最近更新 更多