Вступление
В этом задании вам предоставляется список неотрицательных чисел с плавающей запятой, составленных независимо от некоторого распределения вероятностей. Ваша задача - вывести это распределение из чисел. Чтобы задача выполнилась, у вас есть только пять дистрибутивов на выбор.
U
, То равномерное распределение на интервале [0,1].T
, То треугольное распределение на интервале [0,1] с режимом с = 1/2.B
, То распределение беты на интервале [0,1] с параметрами α = β = 1/2.E
, экспоненциальное распределение на интервале [0, ∞) со скоростью λ = 2.G
, То гамма - распределение на интервале [0, ∞) с параметрами к = 3 и θ = 1/6.
Обратите внимание, что все вышеприведенные распределения имеют среднее значение ровно 1/2.
Задание
Ваш ввод представляет собой массив неотрицательных чисел с плавающей запятой длиной от 75 до 100 включительно. Ваш вывод должен состоять из одной буквы UTBEG
, в зависимости от того, из каких вышеупомянутых дистрибутивов вы предполагаете цифры.
Правила и оценки
Вы можете дать либо полную программу, либо функцию. Стандартные лазейки запрещены.
В этом хранилище есть пять текстовых файлов, по одному для каждого дистрибутива, каждый ровно по 100 строк. Каждая строка содержит разделенный запятыми список от 75 до 100 чисел с плавающей запятой, взятых независимо от распределения и усеченных до 7 цифр после десятичной точки. Вы можете изменить разделители в соответствии с форматом массива вашего языка. Чтобы квалифицироваться как ответ, ваша программа должна правильно классифицировать не менее 50 списков из каждого файла . Оценка правильного ответа - количество байтов + общее количество ошибочно классифицированных списков . Самый низкий балл побеждает.
Ответы:
Юлия,
6062 байта +252 ошибки =8264Это довольно просто. Дисперсия для распределений в основном различна - 1/4 для экспоненциального, 1/8 для бета, 1/12 для гаммы и униформы и 1/24 для треугольного. Таким образом, если мы используем дисперсию (здесь используется
std
стандартное отклонение, квадратный корень дисперсии) для определения вероятного распределения, нам нужно только сделать больше, чтобы отличить гамму от равномерной; для этого мы ищем значение больше 1 (используяany(k.>1)
) - при этом мы проверяем как экспоненциальную, так и гамму, поскольку это улучшает общую производительность.Чтобы сохранить байт, индексация строки
"EGTBU"
выполняется вместо прямой оценки строки в условных выражениях.Для тестирования сохраните txt-файлы в каталог (сохраняя имена как есть) и запустите Julia REPL в этом каталоге. Затем прикрепите функцию к имени как
и используйте следующий код для автоматизации тестирования (он будет считывать из файла, преобразовывать в массив массивов, использовать функцию и выводить для каждого несоответствия):
Вывод будет состоять из строк, содержащих несовпадающий регистр, правильное распределение -> определенное распределение и вычисленную дисперсию (например,
13 G->E 0.35008999281668357
означает, что 13-я строка в G.txt, которая должна быть гамма-распределением, определена как экспоненциальная). распределение со стандартным отклонением 0.35008999 ...)После каждого файла он также выводит количество несоответствий для этого файла, а затем в конце также отображает общее количество несоответствий (и при запуске, как указано выше, должно отображаться значение 2). Между прочим, он должен иметь 1 несоответствие для G.txt и 1 несоответствие для U.txt
источник
R,
202 192 184 182 162154 байта + 0 ошибокЭто основано на байесовской формуле P (D = d | X = x) = P (X = x | D = d) * P (D = d) / P (X = x), где D - распределение, а X случайная выборка Выберем d так, чтобы P (D = d | X = x) было наибольшим из 5.
Я предполагаю, что плоский априор (т.е. P (D = di) = 1/5 для i в [1,5]), что означает, что P (D = d) в числителе одинаков во всех случаях (и знаменатель будет в любом случае одинаковы во всех случаях), поэтому мы можем убрать все, кроме P (x = X | D = d), которое (кроме треугольного распределения) упрощается до нативных функций в R.
ungolfed:
Обратите внимание, что версия без гольфа не совсем эквивалентна версии в гольфе, потому что избавление от знаменателя позволяет избежать случая Inf / Inf, который возникает, если вы разрешаете бета-распределению находиться на закрытом интервале [0,1] вместо (0, 1) - как пример данных. Дополнительный оператор if справился бы с этим, но, поскольку он предназначен только для иллюстративных целей, вероятно, не стоит добавлять сложность, которая не лежит в основе алгоритма.
Спасибо @Alex A. за дополнительные сокращения кода. Специально для чего .max!
источник
{
и один перед закрытием}
, а также наложение псевдонимовprod
, напримерP=prod
, выполнениеP(dunif(x))
и т. Д. Функция не нуждается в имени, чтобы быть действительной отправкой, поэтому вы можете удалитьp=
, Также отличная работа. :)which.max(c(u,r,b,e,g))
вместоc(u,r,b,e,g)==max(c(u,r,b,e,g))
.function(x){c("U","T","B","E","G")[which.max(lapply(list(dunif(x),sapply(x,function(y)max(0,2-4*abs(.5-y))),dbeta(x,.5,.5),dexp(x,2),dgamma(x,3,6)),prod))]}
CJam, 76
Исходный код имеет длину 43 байта и неправильно классифицирует 33 списка.
верификация
идея
Отличить экспоненциальное и гамма-распределение от остальных очень легко, поскольку они являются единственными, которые принимают значения больше 1 .
Чтобы выбрать гамму , экспоненту и другие, мы посмотрим на второе по величине значение выборки.
Если оно лежит в [1.5, ∞) , мы предполагаем гамму .
Если оно лежит в [1, 1.5) , мы предполагаем экспоненциальный .
Если оно лежит в [0, 1) , у нас есть три оставшиеся возможности.
Остальные распределения могут быть дифференцированы по проценту значений выборки, которые лежат близко к среднему значению ( 0,5 ).
Мы делим длину выборки на количество значений, попадающих в (0,3, 0,7), и посмотрим на полученный коэффициент.
Если оно лежит в (1, 2] , мы предполагаем треугольное .
Если оно лежит в (2, 3] , мы предполагаем равномерное .
Если оно лежит в (3, ∞) , мы предполагаем бета .
Код
источник
Матлаб,
428328 байтов + 33 неправильно классифицированыЭта программа в основном сравнивает реальный CDF с оценочным с учетом данных, а затем вычисляет среднее расстояние между этими двумя: я думаю, что изображение объясняет больше:
Данные, показанные на этом рисунке, довольно ясно показывают, что он относится к бирюзовому дистрибутиву, так как он довольно близок к этому, так что это в основном то, что делает моя программа. Это, вероятно, может быть несколько больше в гольфе. Для меня это был прежде всего концептуальный вызов, а не игра в гольф.
Этот подход также не зависит от выбранных PDF-файлов, он будет работать для любого набора дистрибутивов.
Следующий (ungolfed) код должен показать, как это делается. Версия для гольфа ниже.
Полностью гольф-версия:
источник
Perl, 119 байт + 8 неправильных классификаций = 127
Я принял крошечное дерево решений по трем функциям:
Вызывается с
perl -F, -lane -e '...'
. Я не уверен, стоит ли добавлять штраф за нестандартные параметры. Если бы запятые были пробелами, я думаю, я мог бы обойтись без -F,Слегка отформатированный вывод (без флага -l):
источник
Python, 318 байт + 35 ошибочных классификаций
Идея: распределение угадывается по p-значению критерия Колмогорова-Смирнова.
Тестовое задание
источник