Предложить алгоритм ранжирования для многопользовательских сортируемых списков - PullRequest
0 голосов
/ 13 января 2012

Я создаю сайт, на котором я даю пользователям возможность перетаскивать и упорядочивать список элементов, чтобы ранжировать их для их «личного просмотра».При желании они могут удалить элемент, чтобы скрыть его от «личного представления».

Мой вопрос заключается в том, как правильно реализовать алгоритм ранжирования для определения порядка элементов в общем представлении, которое не наказывает новых.items.

Также было бы полезно, если бы это можно было использовать для ранжирования, где новые элементы будут отображаться в личном списке пользователей.

Так что, если появляется новый элемент, который высоко оцениваетсядругие пользователи, мы могли бы отобразить его там, где, как мы предсказываем, пользователь будет оценивать его по отношению к их другим рейтингам.

Мои первоначальные мысли - давать баллы каждому элементу, ранжированному пользователем = на позицию в списке ранжированных пользователей.(например, если имеется 10 предметов, присвойте ранг 1 10 баллов, 2 9 баллов и т. д. с отрицательными баллами, присуждаемыми за предметы, спрятанные пользователем).И общий вид сортируется на основе общего количества баллов.Но это не будет работать хорошо для новых предметов, которые в основном не были оценены, и не будет легко двигаться вверх по лестнице.

Так есть ли какие-нибудь мысли о справедливом алгоритме, который может быть прогнозирующим для новых предметов?

Ответы [ 4 ]

1 голос
/ 16 января 2012

Так что я думаю, что у меня есть рабочее решение. Комбинируя подход, который я упомянул в комментарии к вопросу, с нижней границей доверительного интервала оценки Уилсона для параметра Бернулли оценка, кажется, соответствует моим ожиданиям.

Итак, чтобы перефразировать подход из моего комментария: оценка элементов пользователя = количество элементов + 1 - рейтинг в списке / количество элементов. (1 из 3 = 1, 2 из 3 = .667, 2 из 5 = .8).

чтобы получить общий балл предмета, который я включил в формулу Уилсона: (phat + z * z / (2 * n) - z * Math.sqrt ((phat * (1-phat) + z * z / (4 * n)) / n)) / (1 + z * z / п)

Где phat = среднее количество баллов, n - количество рейтингов, z = 1,96 (для доверительного рейтинга 95%).

Я смоделировал некоторые данные в Excel и поиграл с разными сценариями, и результаты мне понравились. Перейдем к реализации. Спасибо за помощь

0 голосов
/ 27 августа 2014

вот доверительный интервал моего Вильсона для параметра Бернулли в node.js

wilson.normaldist = function(qn) {
    var b = [1.570796288, 0.03706987906, -0.0008364353589, -0.0002250947176, 0.000006841218299, 0.000005824238515, -0.00000104527497, 0.00000008360937017, -0.000000003231081277, 0.00000000003657763036, 0.0000000000006936233982];
    if (qn < 0.0 || 1.0 < qn) return 0;
    if (qn == 0.5) return 0;
    var w1 = qn;
    if (qn > 0.5) w1 = 1.0 - w1;
    var w3 = -Math.log(4.0 * w1 * (1.0 - w1));
    w1 = b[0];

    function loop(i) {
        w1 += b[i] * Math.pow(w3, i);
        if (i < b.length - 1) loop(++i);
    };
    loop(1);
    if (qn > 0.5) return Math.sqrt(w1 * w3);
    else return -Math.sqrt(w1 * w3);
}

wilson.rank = function(up_votes, down_votes) {
    var confidence = 0.95;
    var pos = up_votes;
    var n = up_votes + down_votes;
    if (n == 0) return 0;
    var z = this.normaldist(1 - (1 - confidence) / 2);
    var phat = 1.0 * pos / n;
    return ((phat + z * z / (2 * n) - z * Math.sqrt((phat * (1 - phat) + z * z / (4 * n)) / n)) / (1 + z * z / n)) * 10000;
}
0 голосов
/ 13 января 2012

Я думаю, что важным моментом здесь является рассмотрение рейтинга других пользователей по отношению к другим элементам.

«Этот предмет часто занимает 3-е место», как мне кажется, бесполезен, тогда как «рассматриваемый предмет (который мы назовем А) оценивается лучше, чем пункт В большую часть времени», так как это позволяет вам создать (возможно, нечеткое) упорядочение списка рассматриваемых вами предметов.

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

0 голосов
/ 13 января 2012

Как насчет реализации чего-то похожего на 9gag систему ранжирования.Вы можете иметь общую страницу, где отображаются элементы с наивысшим рейтингом, и страницу голосования, где пользователи могут видеть новые элементы и оценивать их соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...