我想从多维正态分布中生成一个统计样本,为此我需要生成一种特定的协方差矩阵:有没有一种方法可以很容易地生成这种多维矩阵,而不用手写?(我需要50-100维的矩阵,所以手写非常繁琐。)
icomxhvb1#
您可以使用scipy.linalg.toeplitz函数,因为它正是为此类矩阵而创建的:
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. ]])
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的列表,包含了矩阵的所有行。
2条答案
按热度按时间icomxhvb1#
您可以使用
scipy.linalg.toeplitz
函数,因为它正是为此类矩阵而创建的:b4lqfgs42#
如果我没理解错的话,你想要的只是创建一个具有你提到的属性的矩阵--使用linspace(),然后在for循环中使用shift操作。
例如,
输出:
数组([1.,0.8888889,0.7777778,0.66666667,0.5555556,0.4444444,0.33333333,0.2222222,0.1111111,0.])
然后你可以根据自己的喜好移动数组。
输出:
数组([0.,1.,0.8888889,0.77777778,0.66666667,0.5555556,0.4444444,0.33333333,0.2222222,0.1111111])
现在你可以把你想移位的量变成一个变量,然后把它放入一个for循环,如下所示:
这应该会给你一个列表cov的列表,包含了矩阵的所有行。