Ссылка:
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. Это в полной мере использует ваш целевой диапазон и упрощает понимание.