如何获得某些数据的“形状”,以便可以在 numpy/scipy 中生成类似的随机数 [重复]

Posted

技术标签:

【中文标题】如何获得某些数据的“形状”,以便可以在 numpy/scipy 中生成类似的随机数 [重复]【英文标题】:How can I get the "shape" of some data so I can generate similar random numbers in numpy/scipy [duplicate] 【发布时间】:2020-10-13 18:28:41 【问题描述】:

抱歉。我知道我想做什么,但不确定它叫什么,所以一直无法搜索。

我正在追查数据中的一些异常情况(根据大约 50K 的读数,应将两个报告添加到相同的总数中略有不同)。因此,我想生成一些与相关数据“形状”相同的随机数据,以确定这是否可能归结为舍入误差。

有没有一种方法可以分析现有的 50K 左右的数字,然后生成在直方图上看起来几乎相同形状的随机数?我的假设是 numpy 可能是最好的工具,但我愿意接受建议。

【问题讨论】:

“形状”是指 num 行和 num 列(如my_array.shape),还是要使其适应数据分布? 您想生成随机数据,其中的值与原始值具有相同的近似分布? 这是另一种可能:Python: Generate random values from empirical distribution 顺便说一句:可能还有其他方法可以评估您所看到的差异。 Measurement Error Due To Rounding @PeterO。 - KDE 方法看起来在分布的边缘失去了一些保真度,但它可能就足够了。下面的 ..rv_histogram / .rvs 方法效果很好。 【参考方案1】:

如果我正确解释了您的问题,您可以使用 scipy 的 stats 包来执行此操作:

首先,我们生成一个直方图,并使用 scipy.stats.rv_histogram() 方法测量其直方图分布

import scipy.stats
import numpy as np
import matplotlib.pyplot as plt

data = scipy.stats.norm.rvs(size=50000, loc=0)
hist = np.histogram(data, bins=100)
dist = scipy.stats.rv_histogram(hist)

要从这个直方图生成新数据,我们只需在 dist 变量上调用 rvs() 方法:

fake_data = dist.rvs(size=50000)

然后,我们展示两个分布来证明我们得到了我们期望的结果:

plt.figure()
plt.hist(data,bins=100, alpha=0.5, label='real data')
plt.hist(fake_data,bins=100, alpha=0.5, label='fake data')
plt.legend(loc='upper right')
plt.show()

希望这是您想要做的。

【讨论】:

添加了更多细节,完全误解了问题! 如果原始数据不接近正态分布,这将如何公平? @wwii 自己尝试一下,我刚刚尝试使用 log-gamma 分布并得到了similarly overlapping histogram 我只是想知道您是否对此有感觉。 ...我的 +1。【参考方案2】:

神奇的词是“逆变换采样”(您可以从直方图分布中生成 CDF)。看这个不错的教程:https://usmanwardag.github.io/python/astronomy/2016/07/10/inverse-transform-sampling-with-python.html

【讨论】:

这不是答案。 @wwii 谁死了并任命你为答案的法官? 只是我的意见。对不起,如果它冒犯了。 SO 上的很多事情似乎都是具体的,但如果你花时间寻找基础,你会发现很多不同的意见。 @wwii 没有冒犯(希望不要太多)。很多人似乎认为答案是“工作代码”,但是,特别是对于寻求家庭作业帮助的人来说,这似乎不是最有用的方法。

以上是关于如何获得某些数据的“形状”,以便可以在 numpy/scipy 中生成类似的随机数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

保存在磁盘上的 numpy 数组中的随机访问

有效地减去不同形状的numpy数组

如何规范化 4D numpy 数组?

交错形状不匹配的 NumPy 数组

我应该如何获得 dask 数据框的形状?

如何保存 numpy 数组以便以后可以适当地加载它们?