在做相似商品推荐,给定用户的特征后后台会回一个向量串,里面分别是
[
A 对象和输入的相似度为 99.5%,
B 对象相似度为 99.2%,
C 对象相似度为 80%
]
等等等等以此类推 由于推荐列表很长,实际能展示的只有几个,如果只取相似度最高的几个的话还好,但如果想随机选几个的话,有一定随机性,有没有一种随机数可以让相似度高的更多被选中,相似度少的更少被选中?
===
题外话,不是很严格的相似推荐,要求没有那么高,目前的系统满足需求挺好的,暂时不考虑从推荐系统方面整个改。。。
1
huangsijun17 2022-12-07 20:46:09 +08:00
加个总和,在综合内生成随机数。再按照发布来决定结果。
|
2
sblid 2022-12-07 20:49:12 +08:00 1
举个例子,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 。 |
3
LeeReamond OP |
4
smdbh 2022-12-07 21:36:36 +08:00
正态分布,平均分布随机数 ,两个组合用,
|
5
luckykong 2022-12-07 21:42:58 +08:00
一个客户应该不会高频查询的。
服务器直接生成 10w 个不均等的抽样方法,每次随机选一个去跟全部相似商品列表匹配,然后再传出去喽 |
6
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 数组,使用下来并没有很消耗内存,很经济。 |
7
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 |
8
ccagml 2022-12-07 22:08:12 +08:00 via Android
按照一二楼的说法,如果你的列表是有序的,你可以 1-100 ,权重 1000000 ,101-999 ,权重 10000 ,1000-9999 权重 10 ,然后从( 1000000+10000+10 )中随机一个数出来,这个数就可以计算本次是选中哪一个
|
9
ccagml 2022-12-07 22:12:47 +08:00 via Android
应该也可以避免 100%只比 10%多 10 倍,还有数组太长循环计算和的情况
|