请问有没有概率不均等的随机数生成算法?

2022-12-07 20:40:53 +08:00
 LeeReamond

在做相似商品推荐,给定用户的特征后后台会回一个向量串,里面分别是

[
A 对象和输入的相似度为 99.5%,
B 对象相似度为 99.2%,
C 对象相似度为 80%
] 

等等等等以此类推 由于推荐列表很长,实际能展示的只有几个,如果只取相似度最高的几个的话还好,但如果想随机选几个的话,有一定随机性,有没有一种随机数可以让相似度高的更多被选中,相似度少的更少被选中?

===

题外话,不是很严格的相似推荐,要求没有那么高,目前的系统满足需求挺好的,暂时不考虑从推荐系统方面整个改。。。

1197 次点击
所在节点    程序员
9 条回复
huangsijun17
2022-12-07 20:46:09 +08:00
加个总和,在综合内生成随机数。再按照发布来决定结果。
sblid
2022-12-07 20:49:12 +08:00
举个例子,a=3, b=2, c=1,
先做归一化,a=1/2, b=1/3, c=1/6,
使用 [0,1) 均匀分布抽样,k 属于[0, 1/2),选 a ; k 属于[1/2, 1/2+1/3), 选 b ; k 属于[1/2+1/3, 1),选 c 。
LeeReamond
2022-12-07 21:32:04 +08:00
@sblid
@huangsijun17 感觉需要进行一定的线性变换,毕竟按这个算法 100%关联度的也只比 10%关联度的容易出现 10 倍而已,而且如果列表比较长的话感觉这个计算挺耗时间的啊。。
smdbh
2022-12-07 21:36:36 +08:00
正态分布,平均分布随机数 ,两个组合用,
luckykong
2022-12-07 21:42:58 +08:00
一个客户应该不会高频查询的。
服务器直接生成 10w 个不均等的抽样方法,每次随机选一个去跟全部相似商品列表匹配,然后再传出去喽
menc
2022-12-07 22:03:56 +08:00
经典带权随机。
线上最节省时间的解决方案:预生成大数组,infer 时 random integer ,以随机的整数为数组下标取数组值。

如 a, b, c, d 四个样本权重为 [1, 2, 2, 3], 生成 size 为 8 的数组,内容为[a, b, b, c, c, d, d, d],然后 random int 即可。

一般加一个 id -> int 的映射,实际申请空间是个 int 数组,使用下来并没有很消耗内存,很经济。
Tanix2
2022-12-07 22:05:54 +08:00
如果是 python ,直接用库函数

import random

items = ["apple", "banana", "orange", "strawberry"]

weights = [0.995, 0.992, 0.8, 1]

# Select a random item with weighted probabilities
chosen_item = random.choices(items, weights)[0]

print(chosen_item) # Prints one of the items from the list
ccagml
2022-12-07 22:08:12 +08:00
按照一二楼的说法,如果你的列表是有序的,你可以 1-100 ,权重 1000000 ,101-999 ,权重 10000 ,1000-9999 权重 10 ,然后从( 1000000+10000+10 )中随机一个数出来,这个数就可以计算本次是选中哪一个
ccagml
2022-12-07 22:12:47 +08:00
应该也可以避免 100%只比 10%多 10 倍,还有数组太长循环计算和的情况

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/900886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX