我从相关矩阵开始,这意味着第i个第i个条目将是第i个元素和第j个元素之间的相关性(因此对角线将为1)。我试图找到每个元素与另一个元素的最大相关性(不包括它本身,因为1的列表在我的情况下是没有帮助的)。
1 0.7 0.4 0.1
0.7 1 0.3 0.2
0.4 0.3 1 0.5
0.1 0.2 0.5 1
假设我有上述矩阵。我希望有类似的东西
(最大相关,第i个元素,第j个元素)。在上面的矩阵中,我想得到
[(0.7, 0, 1), (0.7, 1, 0), (0.5, 2, 3), (0.5, 3, 2)]
结果是。
有什么好办法可以解决这个问题?
我有矩阵作为熊猫数据帧。索引和列具有相同的名称,现在说[0, 1, 2, 3]
。目前我只想做类似
D = {}
for i in df.columns:
max = (0, 0, 0)
for j in df.columns:
if i==j:
continue
element = df.loc[i,j]
if element > max[0]:
max = (element, i, j)
D[i] = max
这可以做得更好/更快,是否有内置的方法可以改善这一点?
答案 0 :(得分:1)
试试这个:
import numpy as np
c = np.array([[1. , 0.7, 0.4, 0.1],
[0.7, 1. , 0.3, 0.2],
[0.4, 0.3, 1. , 0.5],
[0.1, 0.2, 0.5, 1. ]])
c -= np.eye(c.shape[0]) # remove the 1 on diagonal
result = np.array([[np.max(row), num_row, np.argmax(row)] for num_row, row in enumerate(c)])
根据我对相关性的理解,我假设你在对称实值二次相关矩阵1
的对角线上总是有c
的值,并且你不要关心这个对角线条目,所以我只是取消它。我接下来要做的是迭代列表推导中的相关矩阵的所有行。对于每一行,我分别找到np.max
和np.argmax
的最大值和最大索引,从而得到您想要的结果。如果您不想使用数组,则可以使用result = [(np.max(row), num_row, np.argmax(row)) for num_row, row in enumerate(c)]
(或根据@kraskevich result = list(zip(np.max(c, axis=1), np.arange(c.shape[0]), np.argmax(c, axis=1)))
的解决方案),它可以准确地生成您的预期输出。
答案 1 :(得分:1)
Firstly, you can fill the diagonal with a value that is smaller than any correlation coefficient. There's a standard numpy
function to do it:
np.fill_diagonal(df.values, -2.)
After that you just need to find the maximum value and its index in each column (a DataFrame
has methods for computing both) and zip the results:
list(zip(df.max(), df.columns, df.idxmax()))
答案 2 :(得分:0)
所以我结束了使用一些想法,将对角线改为一些相对较小的值,如-1,两个答案(来自Michael和kraskevich),但使用不同的方法。
maxCors = dfFinalCor.apply(lambda x: (max(x), x.idxmax(), x.name)).tolist()
给我我需要的东西:)
另外,我觉得apply
在这里运作良好。 (我不知道为什么,但我不想使用zip,除非我必须这样做)