【问题标题】:Modifying a matrix to include various data features修改矩阵以包含各种数据特征
【发布时间】:2021-03-06 14:32:26
【问题描述】:

我有以下相关性:

    a     b     c
a   1     0.9   0.8
b   0.9   1     0.7
c   0.8   0.7   1

以及以下向量:

col1    col2    col3
c1      a       5
c2      a       -6
c1      b       10
c2      b       -15
c1      c       24
c2      c       -30

目的是将“col3”向量与每个“col2”的相关矩阵匹配元素相乘,同时请记住,当“col1”不同时要添加额外的权重 0.7:

蓝色 Corr(c1a,c1a): 25 = 5 * 5 * 1

绿色 Corr(c1a,c2a): -21 = 5 * -6 * 1 * .7

黄色校正(c1a,c1b): 45 = 5 * 10 * .9

red Corr(c1a,c2b): -47.25 = 5 * -15 * .9 * .7

'col1' 并不总是不同(在某些情况下它总是'c1',因此不需要额外的 0.7 权重,问题只是直接矩阵乘法)

有没有更pythonic的方式来表达上述内容?

我最初的想法是将相关矩阵扩展如下:

蓝色:1

绿色:0.7 = 1 * 0.7

黄色:0.9

红色:0.63 = 0.9 * 0.7

然后通过 einsum 或 tensordot 对向量进行上述操作。 (但我正在努力为其他矢量场景动态设置它) 也许有更好的方法来解决这个问题。 任何其他建议都会很棒!

设置:

import pandas as pd

corr = pd.DataFrame({'a':[1,.9,.8],
                     'b':[.9,1,.7],
                     'c':[.8,.7,1]},
                     index = ['a','b','c'])

inputs = pd.DataFrame({'col1':['c1','c2','c1','c2','c1','c2'],
                       'col2':['a','a','b','b','c','c'],
                       'col3':[5,-6,10,-15,24,-30]})

【问题讨论】:

    标签: python pandas numpy correlation matrix-multiplication


    【解决方案1】:

    您可以尝试使用点积和条件乘法:

    请注意,您在设置中的 corr 矩阵缺少索引标签,因此这个额外的步骤,如果 corr 矩阵是您在图像中显示的内容,您可以忽略这一点。

    corr1 = corr.set_axis(corr.columns,inplace=False)
    

    解决方案:

    u = inputs.set_index(['col1','col2'])
    v = u.dot(u.T).mul(corr1,level=1)
    cond = (v.index.get_level_values(0).to_numpy()[:,None] 
            != v.columns.get_level_values(0).to_numpy()) #Credits wwii
    #cond = (np.array(v.index.get_level_values(0))[:,None] 
    #        != np.array(v.columns.get_level_values(0))[:,None].T)
    out = v.mask(cond,v*0.7)
    

    print(out)
    
    col1          c1      c2     c1      c2      c1     c2
    col2           a       a      b       b       c      c
    col1 col2                                             
    c1   a     25.00  -21.00   45.0  -47.25   96.00  -84.0
    c2   a    -21.00   36.00  -37.8   81.00  -80.64  144.0
    c1   b     45.00  -37.80  100.0 -105.00  168.00 -147.0
    c2   b    -47.25   81.00 -105.0  225.00 -176.40  315.0
    c1   c     96.00  -80.64  168.0 -176.40  576.00 -504.0
    c2   c    -84.00  144.00 -147.0  315.00 -504.00  900.0
    

    【讨论】:

    • 非常好的解决方案:)
    • @ShubhamSharma 对cond 有什么更好的建议吗? :)
    • 轻微简化:cond1 = v.index.get_level_values(0).to_numpy()[:,None] != v.columns.get_level_values(0).to_numpy() - 答案中的最后一个[:,None].T) 是不必要的。
    • 嗨@anky 下午好!一个小的可读性改进:cond = inputs['col1'].values[:, None] != inputs['col1'].values :)
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2021-12-27
    • 1970-01-01
    • 2013-09-25
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多