python 生成特定的Toeplitz协方差矩阵

l2osamch  于 2023-01-16  发布在  Python
关注(0)|答案(2)|浏览(210)

我想从多维正态分布中生成一个统计样本,为此我需要生成一种特定的协方差矩阵:
有没有一种方法可以很容易地生成这种多维矩阵,而不用手写?(我需要50-100维的矩阵,所以手写非常繁琐。)

icomxhvb

icomxhvb1#

您可以使用scipy.linalg.toeplitz函数,因为它正是为此类矩阵而创建的:

>>> import numpy as np
>>> from scipy import linalg
>>> linalg.toeplitz(np.arange(1,0,-0.1), np.arange(1,0,-0.1))
array([[1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1],
       [0.9, 1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2],
       [0.8, 0.9, 1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3],
       [0.7, 0.8, 0.9, 1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4],
       [0.6, 0.7, 0.8, 0.9, 1. , 0.9, 0.8, 0.7, 0.6, 0.5],
       [0.5, 0.6, 0.7, 0.8, 0.9, 1. , 0.9, 0.8, 0.7, 0.6],
       [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 0.9, 0.8, 0.7],
       [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 0.9, 0.8],
       [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 0.9],
       [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]])
b4lqfgs4

b4lqfgs42#

如果我没理解错的话,你想要的只是创建一个具有你提到的属性的矩阵--使用linspace(),然后在for循环中使用shift操作。
例如,

x = np.linspace(1, 0, num=10)

输出:
数组([1.,0.8888889,0.7777778,0.66666667,0.5555556,0.4444444,0.33333333,0.2222222,0.1111111,0.])
然后你可以根据自己的喜好移动数组。

np.roll(x, shift=1, axis=0)

输出:
数组([0.,1.,0.8888889,0.77777778,0.66666667,0.5555556,0.4444444,0.33333333,0.2222222,0.1111111])
现在你可以把你想移位的量变成一个变量,然后把它放入一个for循环,如下所示:

import numpy as np

cov = []
x = np.linspace(1, 0, num=10)

for i, value in enumerate(x):
   cov.append(np.roll(x, shift=i, axis=0))
   
print(cov)

这应该会给你一个列表cov的列表,包含了矩阵的所有行。

相关问题