Effiziente paarweise Korrelation für zwei Merkmalsmatrizen

In Python muss ich die paarweise Korrelation zwischen allen Features in einer Matrix findenA und alle Funktionen in einer MatrixB. Insbesondere bin ich daran interessiert, die stärkste Pearson-Korrelation zu finden, die ein bestimmtes Merkmal in @ aufweisA hat über alle Funktionen inB. Es ist mir egal, ob die stärkste Korrelation positiv oder negativ ist.

Ich habe eine ineffiziente Implementierung mit zwei Schleifen und scipy unten durchgeführt. Ich würde jedoch gerne @ verwendnp.corrcoef oder eine andere ähnliche Methode, um sie effizient zu berechnen. MatrixA hat die Form 40000x400 undB hat die Form 40000x1440. Mein Versuch, es effizient zu machen, ist im Folgenden als Methode @ zu sehefind_max_absolute_corr(A,B). Es schlägt jedoch mit dem folgenden Fehler fehl:

ValueError: all the input array dimensions except for the concatenation axis must match exactly.

import numpy as np
from scipy.stats import pearsonr


def find_max_absolute_corr(A, B):
    """ Finds for each feature in `A` the highest Pearson
        correlation across all features in `B`. """

    max_corr_A = np.zeros((A.shape[1]))    

    for A_col in range(A.shape[1]):
        print "Calculating {}/{}.".format(A_col+1, A.shape[1])

        metric = A[:,A_col]
        pearson = np.corrcoef(B, metric, rowvar=0)

        # takes negative correlations into account as well
        min_p = min(pearson)
        max_p = max(pearson)
        max_corr_A[A_col] = max_absolute(min_p, max_p)

    return max_corr_A


def max_absolute(min_p, max_p):
    if np.isnan(min_p) or np.isnan(max_p):
        raise ValueError("NaN correlation.")
    if abs(max_p) > abs(min_p):
        return max_p
    else:
        return min_p


if __name__ == '__main__':

    A = np.array(
        [[10, 8.04, 9.14, 7.46],
         [8, 6.95, 8.14, 6.77],
         [13, 7.58, 8.74, 12.74],
         [9, 8.81, 8.77, 7.11],
         [11, 8.33, 9.26, 7.81]])

    B = np.array(
        [[-14, -9.96, 8.10, 8.84, 8, 7.04], 
         [-6, -7.24, 6.13, 6.08, 5, 5.25], 
         [-4, -4.26, 3.10, 5.39, 8, 5.56], 
         [-12, -10.84, 9.13, 8.15, 5, 7.91], 
         [-7, -4.82, 7.26, 6.42, 8, 6.89]])

    # simple, inefficient method
    for A_col in range(A.shape[1]): 
        high_corr = 0
        for B_col in range(B.shape[1]):
            corr,_ = pearsonr(A[:,A_col], B[:,B_col])
            high_corr = max_absolute(high_corr, corr)
        print high_corr

    # -0.161314601631
    # 0.956781516149
    # 0.621071009239
    # -0.421539304112        

    # efficient method
    max_corr_A = find_max_absolute_corr(A, B)
    print max_corr_A

    # [-0.161314601631,
    # 0.956781516149,
    # 0.621071009239,
    # -0.421539304112]  

Antworten auf die Frage(4)

Ihre Antwort auf die Frage