如何获得某些数据的“形状”,以便可以在 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 中生成类似的随机数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章