Гауссовский алгоритм с кривой Белла (Python и / или C #) - PullRequest
2 голосов
/ 30 декабря 2010

Вот несколько упрощенный пример того, что я пытаюсь сделать.Предположим, у меня есть формула, которая вычисляет кредитные баллы, но в формуле нет ограничений (например, оценка может быть от 1 до 5000).И счет присваивается 100 человек.

Теперь я хочу назначить «нормализованную» оценку от 200 до 800 каждому человеку на основе кривой колокола.Так, например, если у одного парня есть 5000 очков, он может получить 800 по новой шкале.Люди с серединой моего диапазона очков получат оценку около 500. Другими словами, 500 - это медиана?

Подобным примером может быть старый сценарий «оценки по кривой», когда большая часть студентов, возможно, получает C или C +.

Я не прошу код, библиотеку, книгу алгоритмов или веб-сайт, на который можно сослаться .... Я, вероятно, напишу это на Python (но C # также представляет некоторый интерес).Нет необходимости составлять график кривой колокола.Мои данные, вероятно, будут в базе данных, и у меня может быть даже миллион человек, которым можно назначить эту оценку, поэтому масштабируемость является проблемой.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 декабря 2010

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

1 голос
/ 24 марта 2016

Ссылка: https://en.wikipedia.org/wiki/Grading_on_a_curve https://en.wikipedia.org/wiki/Percentile (см. также: гауссовская функция)

Я думаю, что подход, который я бы попробовал, заключался в вычислении среднего (среднего) и стандартного отклонения (среднего расстояния от среднего). Затем я бы выбрал параметры, соответствующие моему целевому диапазону. В частности, я бы выбрал, чтобы среднее значение входных значений соответствовало значению 500, и я бы выбрал, чтобы 6 стандартных отклонений потребляли 99,7% моего целевого диапазона. Или одно стандартное отклонение займет около 16,6% моего целевого диапазона.

Поскольку целевой диапазон составляет 600 (от 200 до 800), одно стандартное отклонение будет охватывать 99,7 единиц. Таким образом, человек, который получает входную кредитную оценку, которая на одно стандартное отклонение выше среднего значения, получит нормализованную кредитную оценку 599,7.

Так что теперь:

# mean and standard deviation of the input values has been computed.
for score in input_scores:
  distance_from_mean = score - mean
  distance_from_mean_in_standard_deviations = distance_from_mean / stddev
  target = 500 + distance_from_mean_in_standard_deviations * 99.7
  if target < 200:
    target = 200
  if target > 800:
    target = 800

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

Второй подход - просто отобразить ваш входной диапазон в наш выходной диапазон:

for score in input_scores:
  value = (score - 1.0) / (5000 - 1)
  target = value * (800 - 200) + 200

Это сохранит форму вашего ввода, но в вашем новом диапазоне.

Третий подход состоит в том, чтобы ваш целевой диапазон представлял процентили вместо того, чтобы пытаться представлять нормальное распределение. 1% людей будут набирать от 200 до 205 баллов; 1% оценил бы между 794 и 800. Здесь вы оценили бы свои входные оценки и преобразовали бы ранги в значение в диапазоне 200..600. Это в полной мере использует ваш целевой диапазон и упрощает понимание.

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