如何在SQL中使用高效的简单随机样本?有问题的数据库正在运行MySQL; 我的表至少有200,000行,我想要一个大约10,000的简单随机样本.
"明显"的答案是:
SELECT * FROM table ORDER BY RAND() LIMIT 10000
Run Code Online (Sandbox Code Playgroud)
对于大型表来说,这太慢了:它为每一行调用RAND()(已经将它放在O(n)处)并对它们进行排序,最多使它成为O(n lg n).有没有办法比O(n)更快地做到这一点?
注意:正如Andrew Mao在评论中指出的那样,如果您在SQL Server上使用此方法,则应使用T-SQL函数NEWID(),因为RAND()可能会为所有行返回相同的值.
编辑:5年后
我用更大的表再次遇到了这个问题,并最终使用了@ ignorant的解决方案,并进行了两次调整:
要获取表的1000项样本,我计算行并使用frozen_rand列将结果平均下降到10,000行:
SELECT COUNT(*) FROM table; -- Use this to determine rand_low and rand_high
SELECT *
FROM table
WHERE frozen_rand BETWEEN %(rand_low)s AND %(rand_high)s
ORDER BY RAND() LIMIT 1000
Run Code Online (Sandbox Code Playgroud)
(我的实际实现涉及更多的工作,以确保我没有欠采样,并手动包裹rand_high,但基本的想法是"随机削减你的N到几千.")
虽然这会做出一些牺牲,但它允许我使用索引扫描对数据库进行采样,直到它再次小到ORDER BY RAND()为止.
这个问题询问在SQL Server上获取随机(ish)记录样本并且答案是要使用TABLESAMPLE.Oracle 10中是否有相同的功能?
如果没有,是否有一种标准方法可以从查询集中获取结果的随机样本?例如,如何从一个通常会返回数百万的查询中获取1,000个随机行?
我有一个10 ^ 7行文件,其中我想从文件中随机选择1/100行.这是我所拥有的AWK代码,但它会预先包含所有文件内容.我的PC内存无法处理这样的问题.还有其他办法吗?
awk 'BEGIN{srand()}
!/^$/{ a[c++]=$0}
END {
for ( i=1;i<=c ;i++ ) {
num=int(rand() * c)
if ( a[num] ) {
print a[num]
delete a[num]
d++
}
if ( d == c/100 ) break
}
}' file
Run Code Online (Sandbox Code Playgroud) 什么是有效的(可能用Matlab术语矢量化)生成随机数的零和特定比例的方法?特别是Numpy?
我的案例很特别1/3,我的代码是:
import numpy as np
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)
Run Code Online (Sandbox Code Playgroud)
但是,至少对于K/NK和N是自然数的情况,是否有任何内置函数可以更有效地处理这个问题?
最近我需要从列表中加权随机选择元素,无论是否有替换.虽然有未知加权选择的众所周知和良好的算法,有些用于无替换的加权选择(例如修改算法),我找不到任何好的算法用于替换加权选择.我也想避免使用resevoir方法,因为我选择了列表中的一小部分,这个小部分足够小以容纳在内存中.
有没有人对这种情况下的最佳方法有任何建议?我有自己的解决方案,但我希望找到更高效,更简单或两者兼而有之的方法.
给出一个元组列表,其中每个元组由概率和项目组成,我想根据其概率对项目进行抽样.例如,给出列表[(.3,'a'),(.4,'b'),(.3,'c')]我想在40%的时间内对'b'进行采样.
在python中执行此操作的规范方法是什么?
我已经查看了似乎没有适当函数的随机模块和numpy.random,虽然它有一个多项函数但似乎没有以一个很好的形式返回结果来解决这个问题.我基本上在matlab中寻找像mnrnd这样的东西.
非常感谢.
非常感谢所有答案.为了澄清,我不是在寻找如何编写采样方案的解释,而是指出一种简单的方法,从给定一组对象和权重的多项分布中进行采样,或者被告知不存在这样的函数在标准库中,所以应该自己写一个.
我使用R构建一个基于代理的模型,使用蒙特卡罗过程.这意味着我有许多使用某种随机引擎的函数.为了获得可重复的结果,我必须修复种子.但是,据我所知,我必须在每个随机抽签或样本之前设置种子.这是一个真正的痛苦.有没有办法修理种子?
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
print(sample(1:10,3))
# [1] 9 10 1
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含100,000个条目的数据框,并希望将其拆分为1000个条目的100个部分.
我如何采取100个部分中只有一部分的50个随机样本.数据集已经被排序,前1000个结果是下一个部分的第一个部分,依此类推.
非常感谢
可能重复:
如何从MATLAB中的N个点中随机选择k个点?
假设我有一个包含10,000行数据的数据集.创建包含1,000个随机选择行的子集的最佳方法是什么?
考虑两个1-dim数组,一个包含要从中选择的项,另一个包含绘制另一个列表项的概率.
items = ["a", 2, 5, "h", "hello", 3]
weights = [0.1, 0.1, 0.2, 0.2, 0.1, 0.3]
Run Code Online (Sandbox Code Playgroud)
在朱莉娅,怎么能随意在选择项目items使用weights对重量绘图给定项目的概率是多少?
random-sample ×10
python ×4
random ×4
arrays ×2
numpy ×2
sql ×2
algorithm ×1
awk ×1
julia ×1
linux ×1
matlab ×1
montecarlo ×1
mysql ×1
octave ×1
oracle ×1
pandas ×1
postgresql ×1
probability ×1
r ×1
sample ×1
statistics ×1
unix ×1