更好的方法不是直接从对数均匀生成样本,而是应该创建对数均匀密度。
在统计学中,这是一个倒数分布,已经存在于 SciPy:scipy.stats.reciprocal
中。例如,要构建一个示例10^{x~U[-1,1]}
,您将执行以下操作:
rv = scipy.stats.reciprocal(a=0.1,b=10)
x = rv.rvs(N)
或者,我编写并使用以下代码对任何scipy.stats
类似(冻结的)随机变量进行对数变换
class LogTransformRV(scipy.stats.rv_continuous):
def __init__(self,rv,base=10):
self.rv = rv
self.base = np.e if base in {'e','E'} else base
super(LogTransformRV, self).__init__()
self.a,self.b = self.base ** self.rv.ppf([0,1])
def _pdf(self,x):
return self.rv.pdf(self._log(x))/(x*np.log(self.base)) # Chain rule
def _cdf(self,x):
return self.rv.cdf(self._log(x))
def _ppf(self,y):
return self.base ** self.rv.ppf(y)
def _log(self,x):
return np.log(x)/np.log(self.base)