加权随机抽样算法

我的技术点滴总结:一种加权随机抽奖算法 抽奖中有一个比较典型的问题:重复中奖。抽奖往往不只一轮,在多轮抽奖下,如果之前中过奖的人接连继续中奖,这场活动会瞬间引来大家非议,主办方也会陷入尴尬,为避免把一场活动办砸,我们有必要解决下这个问题。 阅读详情
AI摘要

本文介绍了基于权重的随机抽样算法,包括基于均匀分布概率的抽样、蓄水池算法及其加权版本A-Res和A-ExpJ。探讨了在大数据场景下如何高效地进行加权随机抽样,适用于推荐系统、数据流处理等领域。

1. 基于均匀分布概率的算法

 

例如,3等奖抽中的概率是70%,2等奖是20%,1等奖是10%,这样,大部分人都只能中3等奖,小部分人是二等奖,而只有特别少的人才可能拿到一等奖。产生0-100之间的均匀分布的随机数,当随机数在0-70时,就获得3等奖,70-90是2等奖,90-100是一等奖。

 

另一个例子:按权重均一化后,编号3被抽中的概率要求是70%,5出现的概率为25%,0出现的概率为5%,如下图所示:

 

则产生0-100之间的均匀分布的随机数,当随机数在0-70时,取3,70-95取7,95-100取10。

但这种方法是有放回抽样,选取的时候要遍历集合,时间复杂度是O(n*m),m为抽样数,n为样本数。

该方法可以先对样本集按照权重排序。这样遍历的时候,概率高的项可以很快遇到,减少遍历的项。但增加了排序开销。

 

2.蓄水池算法(均等概率抽样)

转自:https://www.cnblogs.com/bentuwuying/p/7744652.html

 

最近在个性化推荐系统的优化过程中遇到一些问题,大致描述如下:目前在我们的推荐系统中,各个推荐策略召回的item相对较为固定,这样就会导致一些问题,用户在多个推荐场景(如果多个推荐场景下使用了相同的召回策略)、多次请求时得到的结果也较为固定,对流量的利用效率会有所降低;尤其对于行为较少的用户,用来作为trigger的行为数据本身就很少,这样就使得召回item同质化较为严重,使得第一个问题更加明显。

目前的解决方法是,在推荐策略的召回阶段加入一定的随机机制,使得用户在多个场景、多次请求时能后给用户展示相似但不完全雷同的结果 。所以问题就转化为在N个召回结果(召回结果需要适当地扩大)中随机抽样出K个结果,两个难点:

1. N的值很大时,直接在N个数中取K个数实际是比较慢的,再加上我们这里还要求是不重复的采样,这就导致每次产生的随机数采样的结果与之前采样的某一个结果一致就需要重新进行采样,这就导致线上计算的性能会受到影响,这个影响随着N的增加会越来越严重。所以我们需要有一种时间复杂度较小的采样算法,如O(N)的时间复杂度。

2. 对于推荐策略召回的结果,其实每个item是具有不同的权重(相似度)的,所以我们也可以利用到这部分信息,即在抽样时并不是等概率采样,而是带权重的概率采样。

 

对于第一个问题,我们可以使用蓄水池算法来解决。首先先看这个问题的简化版,即从n个数中随机采样出1个数。

解法:我们总是选择第一个对象,以1/2的概率选择第二个,以1/3的概率选择第三个,以此类推,以1/m的概率选择第m个对象。当该过程结束时,每一个对象具有相同的选中概率,即1/n,证明如下。

证明:第m个对象最终被选中的概率P=选择m的概率*其后面所有对象不被选择的概率,即

再来看对应的蓄水池抽样问题,即从n个数中随机采样k个数。可以类似的思路解决。先把读到的前k个对象放入“水库”,对于第k+1个对象开始,以k/(k+1)的概率选择该对象,以k/(k+2)的概率选择第k+2个对象,以此类推,以k/m的概率选择第m个对象(m>k)。如果m被选中,则随机替换水库中的一个对象。最终每个对象被选中的概率均为k/n,证明如下。

证明:第m个对象被选中的概率=选择m的概率*(其后元素不被选择的概率+其后元素被选择的概率*不替换第m个对象的概率),即

实际代码实现还是比较简单的:

复制代码

 1 List<Map<String, Object>> sampleList = new ArrayList<>();
 2 for (int i=0; i<sampleNum; ++i) {
 3     sampleList.add(rawList.get(i));
 4 }
 5 for (int i=sampleNum; i<rawListSize; ++i) {
 6     int j = r.nextInt(i+1);
 7     if (j < sampleNum) {
 8         sampleList.remove(j);
 9         sampleList.add(rawList.get(i));
10     }
11 }  

复制代码

再来看看第二个问题,这就涉及到了带权重的概率抽样问题了。那有没有在蓄水池算法基础上的带权重概率的抽样算法呢?当然是有的,想要详细了解的可以直接看paper《Weighted random sampling with a reservoir》。

首先对于每个样本,都具有一个权重Wi,我们可以针对这个权重值做一个变换作为每个样本的得分:sampleScore = random(0, 1)^(1/Wi)。然后采样过程与之前的一致,也是对每个样本进行顺序读取。对前k个样本维护一个最小堆(针对sampleScore排序),然后对于后续的样本,每次来一个样本,都将这个新样本的sampleScore与之前的最小样本的sampleScore进行比较,如果比最小sampleScore要大,则推出这个最小值,压入这个新样本并继续维护这个最小堆,直到所有样本都被遍历过一次。

具体的代码实现如下:

复制代码

Comparator<Map<String, Object>> cmp = new Comparator<Map<String, Object>>() {
    public int compare(Map<String, Object> e1, Map<String, Object> e2) {
        return Double.compare((double)e1.get(sampleScoreField), (double)e2.get(sampleScoreField));
        }
};
PriorityQueue<Map<String, Object>> pq = new PriorityQueue<>(sampleNum, cmp);
for (int i=0; i<sampleNum; ++i) {
    Map<String, Object> item = rawList.get(i);
    double sampleScore = Math.pow(r.nextDouble(), 1.0/(0.001+MapUtils.getDoubleValue(item, weightField, 0.0)));
    item.put(sampleScoreField, sampleScore);
    pq.add(item);
}
for (int i=sampleNum; i<rawListSize; ++i) {
    Map<String, Object> item = rawList.get(i);
    double sampleScore = Math.pow(r.nextDouble(), 1.0/(0.001+MapUtils.getDoubleValue(item, weightField, 0.0)));
    item.put(sampleScoreField, sampleScore);
    Map<String, Object> minItem = pq.peek();
    if (sampleScore > (double)minItem.get(sampleScoreField)) {
        pq.remove();
        pq.add(item);
    }
}    

复制代码

 

 

 

 

 

 

 

3. A-Res算法

摘自:http://live.aulddays.com/tech/17/weighted-random-sampling-reservoir-algorithm.htm

 

最近,Aulddays 遇到一个随机抽样任务。有一个对象集合,由于整个集合非常大,希望考虑每个对象的热门程度抽样出一部分对象来进行分析。把这个任务抽象出来,其实就对应了一个带概率加权的随机抽样 (Weighted Random Sampling) 问题。对应到不同的应用场景,可以对应解决搜索query抽样、商品抽样、网页抽样等任务。对于不加权的普通随机抽样,其实并不难解决,在样本集合非常大的情况下,还可以使用经典的蓄水池算法 (Reservoir Sampling) 来高效实现的抽样。但对于带概率加权的情况,就不太容易了,特别的,在 Aulddays 的任务中,结果集合中每个对象只有1次,对应了无放回的情况,则更困难一些。在内存足够的情况下,似乎还能想到接近于 O(mlogn) 的思路,但大数据上就没什么好的思路了。Survey 了一番之后,发现这个问题其实已经被研究了很久,但直到 2006 年才得到较好的解决:Pavlos S. Efraimidis and Paul G. Spirakis, 2006, Weighted random sampling with a reservoir。这里介绍一下他们提出的 A-Res 算法。

问题定义

(简单)随机抽样

给定 n 个样本(样本集合),从中随机抽出 m 个样本(抽样集合),样本集合中每个样本出现在抽样集合的概率相等(=m/n)。

加权随机抽样

样本集合中每个样本附加一个权重 wi >0,每个样本被抽中的概率由 wi 确定。wi 有两种指定方法:

  1. 概率值,即所有样本的权重 wi 加和为 1
  2. 相对权重,wi 只表明样本之间被抽中概率的相对关系,但事先并不知道每个样本具体的概率是多少。在大数据的场景下,这个是更常见的情况

显然,概率值是相对权重的一个特例,解决了相对权重的情况,拿概率值作为输入也是直接可运行的。

有放回/无放回 (with/without replacement)

顾名思义,无放回就是被抽中之后就不会被再次加入候选,也就是一个样本在最终的抽样结果中最多只出现1次。有放回则可能在结果中出现多次。更一般的,还可以定义 k-1-放回,即一个样本最多被抽中 k 次(被放回 k-1 次)。不难看出,无放回对应 k=1,而有放回对应 k=m (m是抽样集合的大小)
这里首先重点研究无放回的情况。对于有放回的情况,可以在无放回算法的基础上做简单扩展来解决。

A-Res 算法

A-Res 算法也利用了蓄水池 (reservoir) 的思想来解决大数据的问题,也就是说,事先不用知道样本集合的大小 n 和样本权重的情况(i.e. 权重之和),只需要依次遍历一次样本集合即可以得到结果,空间复杂度是 O(m),正比于结果集合的大小。
出人意料的,A-Res 算法相当简洁,只需要计算和记录一个参数即可。具体算法如下:

Algorithm: A-Res
Input: 样本序列 V,长度未知,第 i 个样本 vi 的权重为 wi
Output: 长度为 m 的结果集合 R
 
foreach vi in V (i = 1, 2, ...):
   ki = rand(0, 1) ^ (1 / wi)
   if i <= m:
      (vi, ki) 加入 R
   else:
      (vt, kt) = min k ∈ R // Aulddays: 选出 R 中 k 最小的那个样本
      if ki > kt:
         (vi, ki) 替换 (vt, kt)
提示:当  wi 值为一般权重而非概率值时,可能会是一个很大的数值,从而使得  ki 的指数操作可能会丢失精度。这种情况下可以对  ki 取 log() 而变成  ki = log(rand(0, 1)) / wi,因为后续在各个  ki之间只涉及比较相对大小而不是绝对值,所以可以保证精度的同时不影响结果。

循环中的每一轮需要查找/更新蓄水池中 ki 特征值的最小值,显然这里用一个最小堆来维护是一个较优化的选择。于是整个算法的时间复杂度就是 O(m*log(n))

显然,整个算法的核心在于 ki = (rand(0, 1)) ^ (1 / wi) 这个特征值,这里做一个简单证明:

  • 令 U1, U2 为两个相互独立的随机变量且均服从 [0, 1] 区间上的均匀分布
  • 令 k1 = (U1)1/w1, k2 = (U2)1/w2, 其中 w1, w2 > 0 (在算法中 w1, w2 就是对应目标样本的权重)
  • 可以推出概率关系:P(k1≤k2) = w2/(w1+w2)
  • 因此比较 ki 特征值确实实现了按 wi 的概率加权随机抽样

扩展(分布式、有放回)

因为所有数据只需过一轮,A-Res 可以比较容易的扩展到并行或分布式的情况。

对于有放回的情况,只需要这样进行修改:创建 m 个大小为 1 的蓄水池,对于每个样本 vi,分别在每个蓄水池上独立的运行 A-Res 算法。

 

 

4.总结篇

转自:https://xiaochai.github.io/2018/03/12/weighted-random-sampling-paper/

问题定义

不放回随机抽样(random sampling without replacement(RS))问题要求从大小为nn的集合中,随机抽取mm个不同元素。如果所有的元素被抽取出来的概率一致,则称之为均匀随机抽样(uniform RS)。一次遍历解决均匀随机抽样问题在推荐阅读的[1,5,10]中有讨论。在数据流上使用蓄水池类型(Reservoir-type)均匀随机抽样算法在推荐阅读[11]给出。推荐阅读[9]给出了一种可并行计算的均匀随机抽样算法。对于加权随机抽样(weighted random smapling(WSR)),它指的是所有元素都含有权重,每一个元素被取出的概率是由元素本身的权重决定的。WSR问题可以使用以下算法D来定义:

算法D,WRS定义

输入:含有nn个带权重元素的集合VV

输出:含有mm个元素的加权随机抽样结果集SS

    1: for k=1k=1 to mm do 
    2:     元素vivi在第kk回合被选出来的概率为pi(k)=wi∑sj∈V−Swjpi(k)=wi∑sj∈V−Swj
    3:     从V−SV−S中选出vivi,然后插入到S中
    4: End-For

 

加权随机抽样(WRS)中最重要的算法有Alias Method, Partial Sum Trees 和 the Acceptance/Rejection method(推荐阅读[8]包含了WRS问题的解决算法汇总)。但这些算法皆非一次遍历算法(one-pass)。这篇论文中将展示一种简单的,非常灵活的解决WRS问题的方法。该方法可以基于数据流运行,并且此方法支持并行和分布式计算。以作者所知(To the best knowledge of the entry authors),这是第一个可以解决数据流的WRS算法,也是第一个能够支持并行、分布式运算的WRS算法。

定义:所谓一次遍历WRS(One-pass WRS)是指只对元素集合进行一次遍历即可完成加权随机抽样的WRS算法。如果这个集合的大小是不确定的(例如数据流),可以使用蓄水池类型抽样算法来解决。这种算法使用一组额外空间(蓄水池)来保存最后结果的候选元素。

符号与假设:开始时所有元素的权重是未知的正实数。总集合的大小为nn,抽样mm个元素。元素vivi的权重为wiwi。函数random(L,H)random(L,H)产生(L,H)(L,H)之间的随机数。XX表示随机变量。假设支持无限精度计算。在无特别说明时,本文所指的抽样都是不放回抽样。WRS这个名词可以用作抽样的结果,或者抽样的操作过程,视上下文而定。

关键结果

WRS方法的关键工作如下,姑且称之为算法A:

算法A

输入:含有nn个带权重元素的集合VV

输出:mm个元素的加权随机抽样结果

    1:对于任意的vi∈Vvi∈V, ui=random(0,1)ui=random(0,1),ki=u1wiki=ui1w
    2:选取mm个kiki最大的元素做为WRS

定理1. 算法A可获得一个WRS结果

以下使用蓄水池类型适配的算法A,我们称之为A-Res算法(algorithm A-Res):

使用蓄水池适配的算法A(Algorithm A With a Reservoir(A-Res))

输入:含有nn个带权重元素的集合VV

输出:存储有mm个元素的加权随机抽样结果的蓄水池空间RR

    1: 将VV的前m个元素直接插入RR
    2: 对于vi∈Rvi∈R:计算关键值(key)ki=u1wiiki=ui1wi,其中ui=random(0,1)ui=random(0,1)
    3: 让ii依次等于m+1,m+2,...,nm+1,m+2,...,n,执行4到7步骤
    4:     计算RR中的最小关键值做为当前的阈值TT
    5:     计算vivi的关键值ki=u1wiiki=ui1wi,其中ui=random(0,1)ui=random(0,1)
    6:     如果ki>Tki>T
    7:         则将R中关键值最小的元素使用vivi代替

算法A-Res使用了算法A来计算生成了加权抽样结果。下面的命题给出此算法集合RR的操作次数:

定理2. 如果A-Res作用在nn个权重(wiwi)大于0的元素上,且wiwi为一般连续分布(common continuous distribution)的独立随机数,则集合RR的插入操作次数预期为(不包括前m个元素的插入):

n∑i=m+1P[第i个元素被插入S]=n∑i=m+1mi=O(m×log(nm))∑i=m+1nP[第i个元素被插入S]=∑i=m+1nmi=O(m×log(nm))

令SwSw为被A-Res算法连续跳过的元素(没有插入到S)的权重之和,如果TwTw为当前进入S集合的阈值,则SwSw为服从指数分布的连续随机变量。所以可以使用SwSw随机跳过若干元素,这样就不用对所有元素生成随机数了。同样的方法已经在均匀随机抽样中得到 应用(推荐阅读[3]中有对应的例子)。以下算法A-ExpJ是使用指数跳跃类型适配的算法A:

使用指数跳跃的算法A(Algorithm A with exponential jumps(A-ExpJ)

输入:含有nn个带权重元素的集合VV

输出:存储有mm个元素的加权随机抽样结果的蓄水池空间RR

    1: VV的前mm个元素直接插入RR
    2: 计算RR中各个元素的关键值(即key值,ki=u1wiiki=ui1wi,其中ui=random(0,1)ui=random(0,1)
    3: RR中最小的关键值为阈值TwTw
    4: 对VV中剩下的元素执行5~10步骤
    5:    令r=random(0,1)r=random(0,1), Xw=log(r)log(Tw)Xw=log(r)log(Tw)
    6:    从当前的元素vcvc一直跳过,直到vivi满足以下条件:
    7:    wc+wc+1+...+wi−1<Xw<=wc+wc+1+...+wi−1+wiwc+wc+1+...+wi−1<Xw<=wc+wc+1+...+wi−1+wi
    8:    使用vivi替换掉RR中关键值最小的元素
    9:    令tw=Twiwtw=Twwi, r2=random(tw,1)r2=random(tw,1) , vivi的关值为: ki=r1wi2ki=r21wi
    10:    算出新的阈值TwTw为当前RR中最小的关键值

定理3. 算法A-ExpJ可获得一个WRS结果

定理2给出了使用A-ExpJ跳过的元素数量。所以使用A-ExpJ可使得随机数的生成量从原来的O(n)O(n)减少到O(mlog(nm))O(mlog(nm))。生成高质量的随机数有可能会有较大的性能开销,所以这个算法优化在复杂的随机抽样场景中可带来可观的性能改善

应用

随机抽样在计算机科学的许多应用领域都是一个基础的问题,如数据库领域(推荐阅读[4],[8]),数据挖掘,近似算法和随机算法([6])。通用工具算法A在随机算法设计中可以找到其对应的应用。如在k-Median算法的近似算法中使用了算法A(推荐阅读[6])。

基于蓄水池方式的算法A,A-Res和A-ExpJ只需要很少的额外存储(m个元素的堆),就可以使得抽样处理期间始终存储着对于已经处理过的元素的加权随机抽样,所以在数据流处理这一领域中这些算法都可以得到应用(推荐阅读[2],[7])。

算法A-Res和A-ExpJ也可以应用于对数据流的放回加权随机抽样(weighted random sampling with replacement)中。开k个A-Res和A-ExpJ进程,并行计算目标数据流的结果为1不放回随机抽样,最终的k个结果合并,即为k个放回加权随机抽样的结果。

推荐阅读

[1] J. H. Ahrens and U. Dieter, Sequential random sampling, ACM Trans. Math. Softw., 11 (1985), pp. 157–169.

[2] B. Babcock, S. Babu, M. Datar, R. Motwani, and J. Widom, Models and issues in data stream systems, in Proceedings of the twenty-first ACM SIGMOD-SIGACT-SIGART symposium on Principles of database systems, ACM Press, 2002, pp. 1–16.

[3] L. Devroye, Non-uniform Random Variate Generation, Springer Verlag, New York, 1986.

[4] C. Jermaine, A. Pol, and S. Arumugam, Online maintenance of very large random samples, in SIGMOD ’04: Proceedings of the 2004 ACM SIGMOD international conference on Management of data, New York, NY, USA, 2004, ACM Press, pp. 299–310.

[5] D. Knuth, The Art of Computer Programming, vol. 2 : Seminumerical Algorithms, Addison- Wesley Publishing Company, second ed., 1981.

[6] J.-H. Lin and J. Vitter, ǫ-approximations with minimum packing constraint violation, in 24th ACM STOC, 1992, pp. 771–782.

[7] S. Muthukrishnan, Data streams: Algorithms and applications, Foundations & Trends in Theoretical Computer Science, 1 (2005).

[8] F. Olken, Random Sampling from Databases, PhD thesis, Department of Computer Science, University of California at Berkeley, 1993.

[9] V. Rajan, R. Ghosh, and P. Gupta, An efficient parallel algorithm for random sampling, Information Processing Letters, 30 (1989), pp. 265–268.

[10] J. Vitter, Faster methods for random sampling, Communications of the ACM, 27 (1984), pp. 703–718.

[11] —, Random sampling with a reservoir, ACM Trans. Math. Softw., 11 (1985), pp. 37–57.

 


以上为简化版论文,文中省略了算法的证明和详细说明。只是把实现思路陈述了下。

更详细的论文里解释了概率计算与各个定理的完整计算和证明,我对其中的推倒有许多不明白的地方,所以就不给予列举,只是给出对应算法的代码实现。

定义数据结构和最小堆

// 元素数组结构
type Data struct {
	Condition int
	Value     int
	Weight float64 // 原生的权重
	Key    float64 // 关键值
}

// 最小堆的实现
type PHeap []*Data

func (h PHeap) Len() int{
	return len(h)
}

func (h PHeap) Less(i, j int)bool {
	return h[i].Key < h[j].Key
}

func (h PHeap)Swap(i, j int){
	h[i], h[j] = h[j], h[i]
}

func (h *PHeap)Push(x interface{}){
	d := x.(*Data)
	*h = append(*h, d)
}
func (h *PHeap)Pop()interface{}{
	item := (*h)[h.Len()-1]
	*h = (*h)[0:h.Len()-1]
	return item
}

A-Res

// 加权随机抽样
func WSRARes(l *list.List, m int, cond int) []*Data{
	h := PHeap{}
	heap.Init(&h)

	for e := l.Front(); e != nil; e = e.Next() {
		data, ok := e.Value.(*Data);
		if !ok || data.Condition <= cond {
			continue;
		}
		data.Key = math.Pow(rand.Float64(), 1/data.Weight)
		if h.Len() < m {
			heap.Push(&h, data)
		} else if h[0].Key < data.Key {
			heap.Pop(&h)
			heap.Push(&h, data)
		}
	}
	return h
}

A-ExpJ

func WSRExpJ(l *list.List, m int, cond int ) []*Data {
	h := PHeap{}
	heap.Init(&h)

	var XW float64
	var flightSum float64
	for e := l.Front(); e != nil; e = e.Next() {
		data, ok := e.Value.(*Data);
		if !ok || data.Condition <= cond {
			continue;
		}
		data.Key = math.Pow(rand.Float64(), 1/data.Weight)
		if h.Len() < m {
			heap.Push(&h, data)
			if h.Len() == m { // 当插入完所有元素之后,算出xw值
				XW = math.Log(rand.Float64())/ math.Log(h[0].Key)
			}
		} else if flightSum += data.Weight; flightSum >= XW {
			tw := math.Pow(h[0].Key, data.Weight)
			r2 := rand.Float64()*(1- tw) + tw
			data.Key = math.Pow(r2, 1/data.Weight)
			heap.Pop(&h)
			heap.Push(&h, data)
			flightSum = 0;
			XW = math.Log(rand.Float64())/ math.Log(h[0].Key)
		}
	}
	return h
}
加权随机算法 //待随机类 class Temp{ //名字 String name; //权重 double wight; public Temp(String name,double wight){ this.name=name; this.wight=wight; } public double get() { ... 阅读详情

相关推荐

python按指定概率抽样_概率加权的随机抽样 (Weighted Random Sampling) – A-Res 蓄水池算法...

概率加权的随机抽样 (Weighted Random Sampling) – A-Res 蓄水池算法2017-11-20 18:51:10旧日重来最近,Aulddays 遇到一个随机抽样任务。有一个对象集合,由于整个集合非常大,希望考虑每个对象的热门程度抽样出一部分对象来进行分析。把这个任务抽象出来,其实就对应了一个带概率加权的随机抽样 (Weighted Random Sampling) 问题。...

weixin_39946657的博客 1509

加权随机采样 (Weighted Random Sampling)

一个集合里有n个元素,每个元素有不同的权重,现在要不放回地随机抽取m个元素,每个元素被抽中的概率为元素的权重占总权重的比例。要怎么做呢? 简单的解法 现在考虑只抽取一个元素,假设权重之和为1。我们可以从[0, 1]中随机得到一个权重,假设为0.71,而后从第一个元素开始,不断累加它们的权重,直到有一个元素的累加权重包含0.71,则选取该元素。下面是个示意图: 要选取 m 个元素,则可以按上面的方法先选取一个,将该元素从集合中去除,再反复按上面的方法抽取剩余的元素。这种方法的...

Bingo 7673

面试突击:如何用Alias Method在O(1)时间搞定加权随机抽样?

本文深入解析了Alias Method算法,这是一种能在O(1)时间复杂度内实现加权随机抽样的高效算法。文章详细对比了其与线性扫描、二分查找法的优劣,并通过生动的比喻和Python、C++代码实现,阐述了其“化非均匀为均匀”的核心思想与构建步骤。该算法是解决游戏掉落、推荐系统等场景下高频采样性能瓶颈的利器。

weixin_29080843的博客 520

加权随机采样

https://lotabout.me/2018/Weighted-Random-Sampling/ 具体文章在上面

wusecaiyun的专栏 1040

论文学习笔记 XGBoost: A Scalable Tree Boosting System

今天分享一篇论文《XGBoost: A Scalable Tree Boosting System》,由陈天奇于2016年发表,该算法在Kaggle等比赛中大放异彩,现在在工业界也被广泛应用。

AidenLau的博客 2518

公平抽签算法实现:Fisher-Yates与蓄水池抽样详解

随机抽样是数据处理中的基础算法,其核心原理是通过概率均等分布确保每个元素被选中的机会相同。Fisher-Yates洗牌算法通过倒序交换实现O(n)时间复杂度的完美洗牌,而蓄水池抽样算法则针对流式数据实现单次遍历抽样。这些算法在在线考试系统组卷、会议抽奖等场景有重要应用价值,其中高质量的随机数生成和并行化处理是关键实现细节。通过蒙特卡洛测试和卡方检验可以验证算法公平性,而加权随机抽样和分层抽样则是常见的实用变种。

weixin_32075843的博客 245

Java采样算法终极指南:从数据流中随机抽样的完整教程

在大数据时代,从海量数据流中高效抽取随机样本是数据分析、机器学习和系统设计中的关键任务。**Java采样算法**为处理未知大小的数据流提供了轻量级解决方案,其中蓄水池采样(Reservoir Sampling)更是成为流式数据随机抽样的行业标准。本文将带你全面掌握Java中实现随机采样的核心技术,从基础原理到实战应用,让你轻松应对各类抽样场景。 ## 为什么选择Java采样算法? 传统随机抽样

gitblog_00919的博客 951

掌握控制随机几率加权技术

在数据分析、机器学习、统计学以及概率论中,理解并应用概率分布是核心的技能之一。概率分布描述了一个随机变量可能出现的所有结果及其发生的概率。在第二章中,我们将深入探讨概率分布的基础知识,理解各种类型的分布,并探讨如何根据问题的性质选择合适的概率分布。概率分布是对随机变量可能出现的所有结果及每个结果发生的概率进行数学描述的一种方式。它为每个可能的结果指定了一个概率,表示这个结果出现的可能性。这些概率的总和必须等于1,因为所有可能的结果构成了一个完备事件集。

weixin_28988985的博客 889

蓄水池算法

最近有个需求,需要从不固定大小的数据集中取固定数量的数据作为样本,有个同学提到了蓄水池算法,于是了解了一下。 蓄水池算法,本身是为了解决海量数据的随机抽样问题,在算法领域应用还是挺广泛的,由于数据本身是有权重,又出现了加权蓄水池算法。 蓄水池算法 问题描述: 给定一个不固定长度的数据集合 sequence,从中等概率地抽取 k 个元素作为...

weixin_33686714的博客 270

Python+MySQL英语词汇量估算工具:分层抽样与加权算法实现

抽样估计是一种通过少量样本推断整体分布的基础统计方法,其核心在于用概率模型替代全量计算,从而在可控成本下获得可接受的精度。在词汇量评估场景中,分层随机抽样结合二项分布方差估计,能够有效降低样本偏差并给出置信区间。Python 负责抽样逻辑与估算算法实现,MySQL 则承担词库存储、作答记录与估算历史管理,二者配合可构建一套完整的数据驱动评估流程。该方案适用于语言能力测评、在线教育自适应测试以及软件工程课设等需要快速推断用户知识掌握程度的场景。本文围绕英语词汇量估算工具,详细讲解词库分层设计、MySQL 表结

weixin_29057065的博客 197

转换shp坐标系之前,设置转换的投影

1.点击目录》工具箱》系统工具箱》Data Management Tools.tbx》投影和变换》创建自定义地理(坐标)变换 2.名称自定义 2.输入地理坐标系可以根据所需要转换的shp文件属性中查询出来 把图层拖入arcgis中,右键属性即可查看 3.复制坐标系,点击“输入地理坐标系”右侧的按钮后,粘贴在顶部搜索框中,并按enter键,选择对应的坐标系 4.点击“输出地理坐标系”右侧的按钮后,选择转换后的坐标系,如4326,选择后点击确认按钮。 5.自定义方法中选择

Wangwangwang___的博客 1863

python 加权随机算法_python – 生成加权随机数

嗨,我正在做一些基因组学课程的代码,我在某个方面遇到了困难.我有一套相互排斥的活动概率我想用给定的概率模拟n次随机抽样事件.输入:概率= {0.3,0.2,0.5}事件{e1,e2,e3} n = 100输出:e3应为~50,e2为~20,e1为~30.请注意,这些可能不完全是50,20,30,因为经验值与理论值不同……最佳答案Python没有内置任何加权采样功能(NumPy / SciPy),但...

weixin_39673742的博客 295

不只是对齐:用 MFA 和 Praat 给你的语音数据集快速生成 TextGrid 标注文件

本文详细介绍了如何利用Montreal Forced Aligner(MFA)和Praat工具快速生成TextGrid标注文件,大幅提升语音数据标注效率。通过批量对齐、质量校验和跨语言处理等实战技巧,帮助研究者构建自动化标注流水线,适用于语音合成和语音识别等多种应用场景。

weixin_30675247的博客 378

MATLAB抽样函数进化论:从randperm到datasample的技术迭代史

本文深入探讨了MATLAB抽样函数从randperm到datasample的技术演进历程,重点分析了随机抽样、矩阵操作等核心功能的迭代优化。通过对比randperm、randsample和datasample的特性差异,揭示了MATLAB在数据科学领域的技术突破,为开发者提供了高效的抽样解决方案。

weixin_29043895的博客 558

告别‘打架’的检测头:手把手教你用PyTorch实现YOLOv11解耦头(附完整代码)

本文详细解析了YOLOv11解耦检测头的创新设计与PyTorch实现,通过解耦分类和回归任务,显著提升目标检测性能。文章包含完整的代码实现、架构设计解析及工程调优技巧,帮助开发者深入理解并应用这一先进技术。

weixin_29031057的博客 301

海康视觉通讯配置

本文介绍了海康通讯管理中TCP和Modbus协议的配置方法。TCP通讯时,视觉系统作为服务器接收PLC客户端发送的触发信号,需注意十进制与十六进制字符串的转换。Modbus配置需填写PLC的IP地址和寄存器首地址,并预先定义整型变量。TCP通讯需开启16进制发送模式以避免数据格式问题。文章重点说明了不同通讯方式下的数据格式转换和参数设置要点。

A567852的博客 2243

蓄水池取样(Reservoir sampling)

Reservoir samplingis a family ofrandomized algorithmsfor choosing asimple random sample, without replacement, ofkitems from a population of unknown sizenin a single pass over the items. The size of the populationnis not known to the algorithm and...

console_log的博客 736

图解移动机器人中的运动规划(Motion Planning),附几十种规划算法

运动规划是移动机器人的核心理论和工程技术之一,本文作为教程先导,解析了运动规划的两大组件——路径规划和轨迹规划。欢迎感兴趣的同学订阅专栏!

FRIGIDWINTER的博客 4万+

加权AUC怎么算?从定义推导到numpy实现一次讲透

在机器学习模型评估中,AUC是衡量二分类模型排序能力的核心指标。当样本因采样、业务重要性或倾向性加权而带权重时,普通AUC无法反映真实分布下的排序能力,需要计算加权AUC。其本质是在正负样本两两比较时引入权重乘积,而非对样本分数或聚合结果简单加权。加权AUC广泛应用于风控、电商等样本不均衡或重要性不均的场景,能够修正采样偏移的统计口径,并让重要样本在评估中发挥更大作用。本文详细推导加权AUC的概率定义与公式,给出两种等价的排序加速算法,并附上可直接落地的numpy实现与暴力对拍验证方法,帮助你在实战中彻底掌

weixin_32377497的博客 280

药物代谢仿真软件:PKSim_(6).案例研究与实践应用

通过本章的案例研究和实践应用,我们展示了如何利用PKSim软件构建药物动力学模型、进行参数估计、仿真预测和结果分析。这些方法不仅有助于优化药物代谢研究过程,还可以在药物研发中提供重要的数据支持。通过模型的构建和验证,我们可以更好地理解药物在体内的动态变化过程,为临床试验和药物治疗提供科学依据。

kkchenjj的博客 655

【ArcPy】用Python批量处理大规模地理数据的几何校正

在许多GIS应用中,尤其是在大规模地理数据处理时,几何校正(Geometric Correction)是一个至关重要的任务。它确保了不同来源的地理数据能够正确地对齐和匹配,从而为后续分析提供准确的基础。几何校正的常见应用包括遥感影像的地理配准、矢量数据的投影转换等。几何校正通常包括坐标转换、重采样等步骤。以下示例展示了如何使用arcpy的工具进行几何校正。"""实施几何校正:param input_layer: 输入待校正数据层。

陈书予 1000

用随机抽样实现 Harness 的性能热点分析

性能热点分析是一种识别系统中最消耗资源或最慢执行部分的技术。这些"热点"往往是系统性能瓶颈的主要来源。通过定位和优化这些热点,我们可以获得最大的性能提升回报。在持续交付平台如 Harness 中,性能热点分析尤为重要。Harness 作为一个现代化的软件交付平台,需要处理复杂的部署流程、集成多种工具和服务,并确保整个 CI/CD 流水线的高效运行。当流水线变慢或资源消耗异常时,快速定位问题变得至关重要。

软件工程实践的博客 108

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3961

bagging介绍

之前写过boosting的博客,这篇是关于bagging的。 训练 bagging采用自助采样(bootstrap sampling) N个样本,有放回随机抽样N次,一次实验大约可以采集到63%样本。如果进行T次实验,得到T笔数据,分别训练一个模型。 包外估计(out of bag estimate):对于剩下的37%数据,可以用于validation。 预测 结果组合采用的策略:分类...

huangjin_1995的博客 3048

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

hadoop 抽样

蓄水库抽样(reservoid sampling) 怎样随机从N个元素中选择一个元素,你依次遍历每个元素,但不知道N多大。 将N个元素用[1、2、...、N]编号。如果在知道N的大小,我们可以从[1、N]中随机选择一个数作为选择对象。 但是现在不知道N的大小,要使每一个元素被取的概率相等(随机)。这个概念叫蓄水池抽样。 Solution:以1/i的概率取第i个元素。 证明:数

三少GG 3614

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: JavaCV, JavaCPP,和JavaCPP Presets的关系
下一篇: Kmeans聚类K值选择Parametric Bootstrap方法,以及数据重抽样方法Bootstrapping
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值