2017-07-13 98 views
2

我正在处理相关矩阵,我想重新排列行和列,以便具有最高平均相关性的列在中间,第二个最好是一个索引在上面,第三个是在中间以下的一个索引,等等等等。如何对称排序相关矩阵?

在一个示例中,这是原始矩阵

[[ 1.  , -0.85240671, 0.93335528, 0.75431679, 0.81586527], 
[-0.85240671, 1.  , -0.874545 , -0.68551567, -0.8594703 ], 
[ 0.93335528, -0.874545 , 1.  , 0.7103762 , 0.86104527], 
[ 0.75431679, -0.68551567, 0.7103762 , 1.  , 0.73345121], 
[ 0.81586527, -0.8594703 , 0.86104527, 0.73345121, 1.  ]] 

理想地,新的列/行的顺序(使用python索引)为3,1,2,... 0,4。因此,它看起来像

[[1,-.686,.710,.754,.733], 
[-.686,1,-.875,-.852,-.859], 
[.710,-.875,1,.933,.861], 
[.754,-.852,.754,1,.816], 
[.733,-.859,.861,.816,1]] 

我知道的排序算法似乎都不能处理我的“对称性”目标。我为我的矩阵使用numpy。

某些矩阵不会有奇数维度,所以我也想要一种方法来处理偶数的矩阵,如果可能的话。任何帮助都是极好的。

回答

1

我不确定你的问题的“确定最大关联的顺序”部分,但这不是问题的核心。

我认为,假设你的数组称为arr,确定降相关的顺序可以通过

corrs = arr.sum(axis=0) 
corr_order = corrs.argsort()[::-1] 

但你的问题的主要部分被填满你的矩阵在这个特定的“大做中间“的顺序。必须有一个更优雅的方式,但是这是我做的事,以获得列的顺序,一旦你有你的列排序递减:

ndim = arr.shape[0] 
inds_orig = list(range(ndim)) 
inds = [] 
for _ in range(ndim): 
    inds.append(inds_orig[(len(inds_orig)-1)//2]) 
    del inds_orig[(len(inds_orig)-1)//2] 
inds = np.array(inds) 

现在,上面的ndim=5会给我们

array([2, 1, 3, 0, 4]) 

这似乎正是你想要的:中间的第一个(最大的)列,然后每个交替的边上的后续项目。

现在我们需要结合这两个数组来获得原始数组的排序+重新排列版本。使用数组来索引你的二维数组会引发奇异的索引,当我们真的想要获得基本的索引时,会有一些不便。因此,我们需要np.ix_我们看中的指标转换成等价的有效切片的:

res = np.empty_like(arr) 
res[np.ix_(inds,inds)] = arr[np.ix_(corr_order,corr_order)] 

其结果是

array([[ 1.  , 0.7103762 , 0.75431679, 0.73345121, -0.68551567], 
     [ 0.7103762 , 1.  , 0.93335528, 0.86104527, -0.874545 ], 
     [ 0.75431679, 0.93335528, 1.  , 0.81586527, -0.85240671], 
     [ 0.73345121, 0.86104527, 0.81586527, 1.  , -0.8594703 ], 
     [-0.68551567, -0.874545 , -0.85240671, -0.8594703 , 1.  ]]) 

要检查这个矩阵是正确的我的“相关性最大的定义范围内“:

>>> print(res.sum(axis=0)) 
[ 2.51262853 2.63023175 2.65113063 2.55089145 -2.27193768] 

正如您所看到的:最大的在中间,然后一个在左边,然后一个在右边,然后是第一个,然后是最后一个。

除非我弄错了,否则另一个选项将在左侧为invert the sorting permutation,并且只有在右侧的索引通过索引一个索引数组到另一个索引数组中。我不确定这会比这种方法更清晰,所以我坚持这个。

+1

非常感谢。这很有意义 – ij1994

+0

@ ij1994请让我知道,如果上述适用于您的应用程序。 –