关联矩阵是一个对称矩阵,这意味着它的上对角元素和下对角元素是彼此的镜像,统称为非对角线元素(与对角线元素相反,在任何相关矩阵中它们都等于1,因为任何变量与自身的相关性仅为1)。
对于变量2和1 (第2行,第1列),在上对角线上交换第I行数和下对角线j‘列数时,相关矩阵的非对角线元素是相同的。因此,我们只需要重新计算下对角元素,然后将它们复制到矩阵的上对角线中相应的位置。
import numpy as np
from numpy.random import randn
X = randn(20,3)
Rho = np.corrcoef(X.T) #correlation matrix
print(np.tril(Rho)) #lower off-diagonal of matrix Rho to re-calculate, then copy to other side显示
array([[ 1. , 0. , 0. ],
[-0.03003281, 1. , 0. ],
[-0.02602238, 0.06137713, 1. ]])对于以下步骤序列,编写"i不等于- to j“循环的最有效方法是什么:
其目的是生成一个新的矩阵,即重新计算原矩阵。
发布于 2021-01-08 01:02:55
让我们首先生成Rho (注意,我正在初始化伪随机数生成器,以便在不同的代码运行中获得相同的Rho ):
In [526]: import numpy as np
In [527]: np.random.seed(0)
...: n = 3
...: X = np.random.randn(20, n)
...: Rho = np.corrcoef(X.T)
In [528]: Rho
Out[528]:
array([[1. , 0.03224462, 0.05021998],
[0.03224462, 1. , 0.15140358],
[0.05021998, 0.15140358, 1. ]])然后可以使用NumPy的tril_indices_from和高级索引生成新的矩阵:
In [548]: result = np.zeros_like(Rho)
In [549]: lrows, lcols = np.tril_indices_from(Rho, k=-1)
In [550]: result[lrows, lcols] = Rho[lrows, lcols] + 2
In [551]: result
Out[551]:
array([[0. , 0. , 0. ],
[2.03224462, 0. , 0. ],
[2.05021998, 2.15140358, 0. ]])
In [552]: result[lcols, lrows] = result[lrows, lcols]
In [553]: result
Out[553]:
array([[0. , 2.03224462, 2.05021998],
[2.03224462, 0. , 2.15140358],
[2.05021998, 2.15140358, 0. ]])
In [554]: result[np.arange(n), np.arange(n)] = 10
In [555]: result
Out[555]:
array([[10. , 2.03224462, 2.05021998],
[ 2.03224462, 10. , 2.15140358],
[ 2.05021998, 2.15140358, 10. ]])https://stackoverflow.com/questions/65245837
复制相似问题