【问题标题】:A generator for multivariate normal variates in PythonPython中多元正态变量的生成器
【发布时间】:2020-08-25 03:43:02
【问题描述】:

我想从具有给定均值和协方差的多元正态分布中生成样本,这当然可以使用numpy.random.multivariate_normal。但是我想生成一个(从哲学上讲)无限流这样的东西,所以我想定义一个多元法线生成器mvn,以便mvn.next() 产生另一个具有给定均值和协方差的随机向量。当然,我可以继续调用numpy.random.multivariate_normal(mean, cov, 1),但这非常低效(我将在每次调用时计算协方差矩阵的特征分解)。当然我可以自己从头开始实现,但似乎这样的东西应该已经存在了......

【问题讨论】:

  • 为什么不使用大的size 调用numpy 代码,然后将值一一列出?当你耗尽初始数组时,创建另一个。
  • @hpaulj 当我说我可以自己做时,这就是我的意思之一。 :) 只是因为从道德上讲,随机样本是一个生成器(如“随机数生成器”),以这种方式打包似乎是有意义的......
  • 不要将 random 包对 generator 的使用与 Python 对同一术语的使用混淆。
  • @hpaulj 是什么让你觉得我把他们​​弄糊涂了?

标签: python numpy scipy generator


【解决方案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
    

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 2021-04-28
    • 2015-12-04
    • 2019-03-09
    • 2018-09-01
    • 2014-01-06
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多