Реализация счета Wilson в SQL

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

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

я не вижу много COTS atomic-decay– основанные генераторы, но существует несколько планов там относительно них при реальной необходимости в большом количестве случайных данных. Один сайт, который всегда имеет интересные вещи посмотреть на, включая HotBits, Fourmilab John Walker.

12
задан Glorfindel 17 May 2019 в 16:06
поделиться

2 ответа

Вместо того, чтобы пытаться манипулировать алгоритмом Уилсона, нужно создать 5-звездочную систему оценки. Почему бы вам не изучить другой алгоритм? Вот что imdb использует для своих 250 лучших: Байесовская оценка

Что касается объяснения математики в алгоритме Вильсона, то ссылка ниже была размещена по ссылке в вашем первом посте. Он написан на Ruby.

require 'statistics2'

def ci_lower_bound(pos, n, power)
    if n == 0
        return 0
    end
    z = Statistics2.pnormaldist(1-power/2)
    phat = 1.0*pos/n
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end

Если вам нужен другой пример, вот он на PHP: http://www.derivante.com/2009/09/01/php-content-rating-confidence/

Редактировать: Похоже, что Derivante.com больше не существует. Вы можете увидеть исходную статью на archive.org - https://web.archive.org/web/20121018032822/http://derivante.com/2009/09/01/php-content-rating-confidence/ и я добавил код из статьи ниже.

class Rating
{
  public static function ratingAverage($positive, $total, $power = '0.05')
  {
    if ($total == 0)
      return 0;
    $z = Rating::pnormaldist(1-$power/2,0,1);
    $p = 1.0 * $positive / $total;
    $s = ($p + $z*$z/(2*$total) - $z * sqrt(($p*(1-$p)+$z*$z/(4*$total))/$total))/(1+$z*$z/$total);
    return $s;
  }
  public static function pnormaldist($qn)
  {
    $b = array(
      1.570796288, 0.03706987906, -0.8364353589e-3,
      -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
      -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
      0.3657763036e-10, 0.6936233982e-12);
    if ($qn < 0.0 || 1.0 < $qn)
      return 0.0;
    if ($qn == 0.5)
      return 0.0;
    $w1 = $qn;
    if ($qn > 0.5)
      $w1 = 1.0 - $w1;
    $w3 = - log(4.0 * $w1 * (1.0 - $w1));
    $w1 = $b[0];
    for ($i = 1;$i <= 10; $i++)
      $w1 += $b[$i] * pow($w3,$i);
    if ($qn > 0.5)
      return sqrt($w1 * $w3);
    return - sqrt($w1 * $w3);
  }
}

Что касается выполнения этого в SQL, SQL уже содержит все эти математические функции в своей библиотеке. Хотя на вашем месте я бы сделал это в вашем приложении. Сделайте так, чтобы ваше приложение обновляло вашу базу данных так часто (часы? Дни?) Вместо того, чтобы делать это на лету, иначе ваше приложение станет очень медленным.

7
ответ дан 2 December 2019 в 21:03
поделиться

Взяв ссылку Вильямса на решение php http://www.derivante.com/2009/09/01/php-content-rating-confidence/ и сделав свой система так, чтобы она была положительной и отрицательной (5 звезд могут быть 2 положениями, 1 начало может быть 2 отрицательными), тогда было бы довольно легко преобразовать ее в T-SQL, но вам было бы намного лучше сделать это в логика на стороне сервера.

2
ответ дан 2 December 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: