【问题标题】:Optimize changing variables to get max Pearson's correlation coefficient for multiple columns优化更改变量以获得多列的最大 Pearson 相关系数
【发布时间】:2019-09-16 12:20:14
【问题描述】:

修改:

如果我有一个包含 5 列 Col1 & Col2 & Col3 & Col4 & Col5 的 pandas DataFrame,我需要获得最大 Pearson 相关系数介于 (Col2,Col3 ) & (Col2,Col4) & (Col2,Col5) 通过考虑Col1中的值

Col2的修改值由下式得到:

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

其中B 是变化变量(单个值),以获得最大 Pearson 相关系数(Col2,Col3)和(Col2,Col4 的新值)和( Col2,Col5) 的新值。

更新:

上表包含我上面提到的5列,说明了(Col2,Col3) & (Col2,Col4) & (Col2,Col5)之间的系数之间的相关性桌子下方。

我需要根据上面提到的两个等式更改Col2 的值,其中更改值为B

所以问题是如何获得B 的最佳值,它给出的新相关系数大于或等于其对应物(旧)?

更新 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

【问题讨论】:

  • 您能提供一个最小的示例数据框吗?
  • @Cleb 你能检查更新吗?
  • 你能添加一个可以复制和粘贴的数据吗?图片没有多大帮助...
  • @Cleb 这可以吗?
  • 是的,有兴趣的可以使用df = pd.read_clipboard(sep=',')

标签: python scipy correlation minimization scipy-optimize


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

【讨论】:

  • 感谢您的回答。但我需要 B 的单个值可以给出最大相关性,您的代码输出与此问题“[链接](stackoverflow.com/questions/55868595/…)”中接受的答案中的输出相同
  • @Sidhom:单值是什么意思? B是否应该最大化col2, col3col2, col4col2, col5的相关系数之和?
  • 我的意思是 B 的输出应该是一个值,可以给出所提到的对之间的最佳相关性。如果没有python方法可以做到这一点,我认为你关于最大化col2, col3col2, col4col2, col5的相关系数之和的想法就足够了
  • 非常感谢。这是实现要求的更好方法。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多