确定分布,以便生成测试数据
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测试)