Как выбрать строки на основе вероятности через целочисленное значение? - PullRequest
0 голосов
/ 25 мая 2018

В моей базе данных у меня есть список полос вместе со столбцом популярности, который увеличивается или уменьшается, когда пользователь на веб-странице нажимает кнопку «Нравится» или «Не нравится» соответственно.Я хочу выбрать группы на основе этого столбца популярности.Вероятность того, что полоса выбрана, зависит от этого столбца популярности, который является целочисленным значением, а не десятичным значением, таким как 0,3, 0,1, что должно иметь смысл, если вы работаете с вероятностью, но в моем случае я не думаю, чтовозможно.Пример моей таблицы:

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

Исходя из этого, Guns N 'Roses должны иметь наибольший шанс быть выбранным, в то время как Megadeth имеет наименьший шанс быть выбранным, в то время как другие группы также имеют свои шансы.быть выбранным.Я выберу 10 групп из списка 2000 года.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Сначала вычислите совокупную вероятность для каждой полосы (порядок сортировки произвольный; вы также можете использовать некоторый идентификатор):

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;
Band             CumProb       
---------------  ---------------
Aerosmith        0.0823045267489
Guns N Roses     0.5061728395061
Led Zeppelin     0.8312757201646
Megadeth         0.8477366255144
Queen            1.0            

(Покапоскольку в 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;

Повторяйте столько раз, сколько необходимо, игнорируя дубликаты.

0 голосов
/ 25 мая 2018

Если я правильно понимаю ваш вопрос и проблему, вы хотите выбрать 10 полос с самыми высокими значениями популярности / вероятности, верно?

в SQL вы можете сделать:

Выбрать* FROM table_name ORDER BY популярность DESC LIMIT 10

Выбирает все столбцы в таблице, сортирует по популярности в порядке убывания (от наибольшего к наименьшему) и останавливается после первых 10 записей.

...