Прочитав Как не сортировать по среднему рейтингу Я подумал, что должен попробовать.
CREATE FUNCTION `mydb`.`LowerBoundWilson95` (pos FLOAT, neg FLOAT)
RETURNS FLOAT DETERMINISTIC
RETURN
IF(
pos + neg <= 0,
0,
(
(pos + 1.9208) / (pos + neg)
-
1.96 * SQRT(
(pos * neg) / (pos + neg) + 0.9604
)
/ (pos + neg)
)
/
(
1 + 3.8416
/ (pos + neg)
)
);
Проведя некоторые тесты, я обнаружил, что объекты с pos=0
и neg>0
имеют очень маленькие, но неотрицательные оценки, тогда как объект с pos=neg=0
имеет нулевую оценку, что означает более низкий рейтинг.
Я придерживаюсь мнения, что объект без рейтинга должен быть указан выше того, у которого нет положительных оценок, но есть отрицательные.
Я рассудил, что «все индивидуальные оценки на самом деле являются выражением отклонения от некоторой базовой линии, поэтому я сдвину базовую линию, я дам каждому объекту «нейтральную» начальную оценку», поэтому я пришел к следующему выводу:
CREATE FUNCTION `mydb`.`AdjustedRating` (pos FLOAT, neg FLOAT)
RETURNS FLOAT DETERMINISTIC
RETURN
(
SELECT `mydb`.`LowerBoundWilson95` (pos+4, neg+4)
);
Вот несколько примеров выходных данных для AdjustedRating
\ pos 0 1 2
neg
0 | 0.215 | 0.188 | 0.168
1 | 0.266 | 0.235 | 0.212
2 | 0.312 | 0.280 | 0.235
Это ближе к тому типу оценок, которые я хочу, и как численный хак, я думаю, это работает, но я не могу математически обосновать это
Есть ли лучший способ, «правильный» способ?
pos=0
иneg>0
я получаю0.0
, т.е. элементы без рейтинга и с пониженным рейтингом равны. Все еще не то, что вы хотите, ваше смещение, кажется, работает хорошо - person Anentropic   schedule 22.01.2014