Рассчитать среднюю цифру до 10 - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу написать систему оценки (аналогичную imdb mov ie rate), максимальный результат равен 10, это означает, что выходной результат может быть числом от 0 до 10. Он должен отображаться следующим образом (2/10)

Пользователь может оценивать от 1 до 5 (запуски), каждый пользователь может использовать его один раз.

Итак, учтите, что этот массив рассчитан на все пользовательские тарифы.

let rate = ['4', '5', '1', '2', '5', '5', '2', '1', '3', '3', '4']; // all users rates
let result = 0;

for (i = 0; rate.length > i; i++) {
  result += parseInt(rate[i]);
}

let av = result / 10;

Работает хорошо , но проблема в том, что этот вывод никогда не достигнет большой скорости, например 9 или 10. Так что я должен сделать цель, верно?, моя цель ceil равна 1250, это значит, что если общий рейтинг всех пользователей равен 1250, то пользователь должен получить оценку 10 /10.

let av = 1250 / 10;

Но это возврат 125 ofcourse.

Цель: показать все пользовательские скорости, как это, 5/10 или 7/10, как скорость IMDB.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2020

Вам нужно получить правильное среднее значение и умножить на два, потому что 10 (желаемое) делится на 5 (ваша пятизвездочная система) и получить среднее значение для системы с десятью.

let rate = ['4', '5', '1', '2', '5', '5', '2', '1', '3', '3', '4']; // all users rates
let result = 0;

for (i = 0; rate.length > i; i++) {
    result += parseInt(rate[i], 10);
}

let av = result / rate.length;

console.log('average', av);
console.log((av * 2).toFixed(2), 'of 10');
1 голос
/ 22 февраля 2020

Поскольку вы уже разделены на 2 ожидаемая рейтинговая система от 10 до 5 звездочек - вам нужно вернуть , умножить звездочек на 2, чтобы вернуться к 10 система.

// Convert 1-5 rating stars to 1-10 rating
const stars_to_ten = stars =>
   Math.round(stars.reduce((ten, star) => (ten += star * 2, ten), 0) / stars.length);

let result1 = stars_to_ten(['4', '5', '1', '2', '5', '5', '2', '1', '3', '3', '4']);
let result2 = stars_to_ten(['5', '5', '5', '5', '5']); 


console.log(result1); // 6
console.log(result2); // 10

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

Взвешенный рейтинг по истинной байесовской оценке

(WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

Где:
R = среднее значение для Mov ie (среднее) = (рейтинг)
v = количество голосов за MOV ie = (голосов)
m = минимальное количество голосов, необходимых для включения в список 250 лучших (в настоящее время 25000)
C = среднее количество голосов по всему отчету (в настоящее время 7,0)

const bayesianWeighted = (avg, totVotes, minVotesTop = 10, mean = 7.0) =>
  (avg * totVotes + mean * minVotesTop) / (totVotes + minVotesTop);
  
const calcRating = stars => {
  const avg = stars.reduce((a, v) => (a += +v * 2, a), 0) / stars.length;
  return Number(bayesianWeighted(avg, stars.length).toFixed(1));
};



// TEST
[
  [4, 5, 1, 2, 5, 5, 2, 1, 3, 3, 4], // 6.7
  [1, 1, 1, 1, 1],                   // 5.3
  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],    // 4.5
  [5, 5, 5, 5, 5],                   // 8
  [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],    // 8.5
].forEach(r => console.log(calcRating(r)));
0 голосов
/ 22 февраля 2020

let rate = ['4', '5', '1', '2', '5', '5', '2', '1', '3', '3', '4']; // all users rates
let result = 0;

for (i = 0; rate.length > i; i++) {
  result += parseInt(rate[i]);
}

result = (result/rate.length)*2;
result = result.toFixed(2);

let rating = result+"/"+10;

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