确定分布,以便生成测试数据

Posted

技术标签:

【中文标题】确定分布,以便生成测试数据【英文标题】:Determining distribution so I can generate test data 【发布时间】:2010-11-03 16:43:52 【问题描述】:

我的 Linux 机器上的文本文件中有大约 1 亿个值/计数对。我想弄清楚我将使用哪种公式来生成更多遵循相同分布的对。

从偶然的角度来看,它看起来像是幂律,但我需要比这更严格一些。 R可以轻松做到这一点吗?如果是这样,怎么做?还有其他更好的方法吗?

【问题讨论】:

【参考方案1】:

我假设您有兴趣了解您的分类值的分布。

生成“新”数据的最佳方法是使用 R 的 sample() 函数从现有数据中采样。这将为您提供遵循现有计数所指示的概率分布的值。

举个简单的例子,假设您有一个小镇的选民数据文件,其中值是选民的政治派别,计数是选民人数:

affils <- as.factor(c('democrat','republican','independent'))
counts <- c(552,431,27)
## Simulate 20 new voters, sampling from affiliation distribution
new.voters <- sample(affils,20, replace=TRUE,prob=counts)
new.counts <- table(new.voters)

在实践中,您可能会使用 R 的 read.csv() 函数引入 100m 行的值和计数。假设您有一个标有“values\t counts”的标题行,该代码可能如下所示:

dat <- read.csv('values-counts.txt',sep="\t",colClasses=c('factor','numeric'))
new.dat <- sample(dat$values,100,replace=TRUE,prob=dat$counts)

一个警告:您可能知道,R 将其所有对象都保存在内存中,因此请确保您有足够的空间来存储 1 亿行数据(将字符串作为因子存储将有助于减少占用空间)。

【讨论】:

【参考方案2】:

要查看您是否具有真正的幂律分布,请绘制频率的对数图,并查看它们是否大致排列在一条直线上。如果您确实有一条直线,您可能需要阅读Pareto distribution 上的这篇文章,了解有关如何描述您的数据的更多信息。

【讨论】:

【参考方案3】:

虽然成本有点高,但您可以准确地模拟样本的分布(无需对基本人口分布进行任何假设),如下所示。

您需要一个可以快速搜索“带有

将数据以对的形式放置,其中键是到该点的累积计数(按递增值排序)。将 K 称为最高键。

要生成一个与样本完全遵循相同分布的随机对,请生成一个介于 0 和 K 之间的随机整数 X,并在该文件结构中使用提到的“最高为

不知道如何在 R 中完成所有这些工作——在你的鞋子里,我会尝试一个 Python/R 桥,在 Python 中进行逻辑和控制,只在 R 本身中进行统计,但是,这是个人选择!

【讨论】:

+1 既简单又美丽:既然计算机允许您拥有现实本身,为什么还要将自己限制在理想的表示上?

以上是关于确定分布,以便生成测试数据的主要内容,如果未能解决你的问题,请参考以下文章

Java生成-zipf分布的数据集(自定义倾斜度,用作spark data skew测试)

MySQL快速生成大量测试数据2(脚本一键生成分表数据)

Android 测试数据存储与访问XML解析与生成

生成对抗网络与图像分割

我应该如何为测试数据生成具有唯一 id3 数据的 mp3 文件?

如何使用实体框架测试视图?