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]