问题描述
我想从具有给定均值和协方差的多元正态分布中生成样本,当然,numpy.random.multivariate_normal
是可能的。但是我想生成这样的东西(从哲学上来说)是无限的,因此我想定义一个多元正态生成器mvn
,以便mvn.next()
生成另一个具有给定均值和协方差的随机向量。当然,我可以继续调用numpy.random.multivariate_normal(mean,cov,1)
,但这是非常无效的(我将在每次调用时计算协方差矩阵的特征分解)。当然,我可以自己从头开始实现此功能,但似乎应该已经存在类似的东西...
解决方法
只需建立一些基本事实,这就是实现它的方式:
from collections.abc import Generator
import numpy as np
class multinorm(Generator):
def __init__(self,themean,themat):
self.eigs,self.cmat = np.linalg.eigh(themat)
self.meanvec = themean
self.thedim = self.meanvec.shape[0]
self.themult = np.diag(np.sqrt(self.eigs))
def send(self,ignored_arg):
tmpvec = np.random.randn(self.thedim)
return ( self.cmat.T @ self.themult) @ tmpvec + self.meanvec
def throw(self,type=None,value=None,traceback=None):
raise StopIteration