sqlite如何通过整数值根据概率选择行?

2024-04-25 02:16:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据库中,我有一个乐队列表和一个流行专栏,当用户在网页上分别按下“喜欢”或“不喜欢”按钮时,该栏就会增加或减少。我想根据这个流行专栏来选择乐队。一个波段被选中的概率取决于这个流行度列,它是一个整数值,而不是像0.3,0.1这样的十进制值,如果用概率来计算的话,这应该是有意义的,但在我的例子中,我认为这是不可能的。我的表格示例:

Bands        probability
Led Zeppelin    79
Megadeth         4
Queen           37
Aerosmith       20
Guns N Roses   103

基于此,Guns N'Roses应该有最高的被选中机会,而Megadeth被选中的几率最低,而其他乐队也都有各自被选中的机会。我将从2000个乐队中选出10个乐队。在


Tags: 用户数据库网页列表波段概率按钮机会
1条回答
网友
1楼 · 发布于 2024-04-25 02:16:41

首先,计算每个波段的cumulative probability(排序顺序是任意的;您可以使用一些ID):

SELECT Band, 
       CAST((SELECT sum(probability)
             FROM Bands AS b2
             WHERE b2.Band <= Bands.Band
            ) AS FLOAT) /
       (SELECT sum(probability) FROM Bands)
       AS CumProb
FROM Bands
ORDER BY Band;
^{pr2}$

(只要SQLite还没有窗口函数,用Python进行求和会更有效。但对于2000行,这并不重要。)

然后使用0到1之间的随机数查找其中一行(第一行相等或更大):

WITH CPBands(Band, CumProb) AS (
  SELECT Band, 
         CAST((SELECT sum(probability)
               FROM Bands AS b2
               WHERE b2.Band <= Bands.Band
              ) AS FLOAT) /
         (SELECT sum(probability) FROM Bands)
  FROM Bands
)
SELECT Band
FROM CPBands
WHERE CumProb >= ?
ORDER BY CumProb ASC
LIMIT 1;

根据需要经常重复,忽略重复项。在

相关问题 更多 >