вход
Матрица M
представлена в виде двух разделенных пробелами целых чисел. Каждая строка будет иметь такое же количество целых чисел , и каждое целое число будет либо -1 , либо 1. Число целых чисел в каждой строке будет не более 20. M
Поэтому будут 2
по n
которой n
это количество целых чисел на каждой из двух линий.
Ваш код должен быть законченной программой. и примите входные данные в стандартном файле или из файла (это ваш выбор). Вы можете принять ввод из стандартного входа, из файла или просто в качестве параметра. Однако, если вы сделаете последнее, приведите явный пример того, как должен работать ваш код, и помните, что это должна быть законченная программа и как матрица M
будет представлена во входных данных. Другими словами, вам, скорее всего, придется делать какой-то анализ.
Выход
Двоичная энтропия Шеннона распределения , M*x
где элементы x
равномерно и независимо друг от друга выбраны из {-1,1}. x
является n
-мерным вектором столбца.
Энтропия дискретного распределения вероятностей
- sum p_i log_2(p_i)
В этом случае p_i
вероятность является i
единственно возможной M*x
.
Пример и полезные советы
В качестве рабочего примера, пусть матрица M
будет
-1 1
-1 -1
Теперь посмотрим на все 2^2
возможные векторы x
. Для каждого мы вычисляем M*x
и помещаем все результаты в массив (4-элементный массив 2-компонентных векторов). Хотя для каждого из 4 векторов вероятность его появления равна 1/2^2 = 1/4
, нас интересует только количество раз, когда каждый уникальный результирующий вектор M*x
встречается, и поэтому мы суммируем отдельные вероятности конфигураций, ведущих к одним и тем же уникальным векторам. Другими словами, возможные уникальные M*x
векторы описывают результаты распределения, которое мы исследуем, и мы должны определить вероятность каждого из этих результатов (который, по построению, всегда будет целым кратным 1/2^2
или 1/2^n
вообще) для вычислить энтропию.
В общем n
случае, в зависимости от M
возможных результатов, M*x
может варьироваться от «все разные» (в этом случае у нас есть n
значения i
в p_i
, и каждый p_i
равен 1/2^n
), до «все одинаковые» (в этом случае есть один возможный результат и p_1 = 1
).
В частности, для приведенной выше 2x2
матрицы M
мы можем найти, умножив ее на четыре возможные конфигурации ( [+-1; +-1]
), каждый результирующий вектор отличается. Так что в данном случае имеется четыре результата, и , следовательно p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4
. Напоминая, log_2(1/4) = -2
что имеем:
- sum p_i log_2(p_i) = -(4*(-2)/4) = 2
Таким образом, окончательный результат для этой матрицы равен 2.
Контрольные примеры
Входные данные:
-1 -1
-1 -1
Выход:
1.5
Входные данные:
-1 -1 -1 -1
-1 -1 -1 -1
Выход:
2.03063906223
Входные данные:
-1 -1 -1 1
1 -1 -1 -1
Выход:
3
x
? 2. Как сделать вопрос автономным, как определяется бинарная энтропия ШеннонаMx
?Ответы:
Mathematica,
4868 байтРедактировать: добавлен препроцесс для принятия строки в качестве параметра.
С помощью
Tuples
иEntropy
, реализация становится краткой и удобочитаемой.где
Tuples[{-1,1},n]
дает все возможныеn
кортежи{-1,1}
, иEntropy[2,list]
дает базу-2 информационной энтропии.Одна из замечательных вещей заключается в том, что Mathematica на самом деле возвращает точное выражение:
Приблизительный результат может быть достигнут с дополнительным
.
добавлением (Entropy[2., ...
).источник
Perl,
160159141 байтвключает +1 для
-p
начиная с 141 байта обновленияВвод ожидается в
STDIN
виде 2 строк, состоящих из пробела1
или-1
.Запустить как
perl -p 140.pl < inputfile
.Он не выиграет никаких призов, но я думал, что поделюсь своими усилиями.
Разъяснение:
ДАННЫЕ
()
, используя**
вместо<<
.$.
и-p
.источник
Pyth, 37 байт
Тестирование
Это несколько сложнее, когда вам нужно реализовать умножение матриц вручную.
Объяснение:
источник
MATLAB,
196194187184126154 байта(Дополнительные 28 байтов от 126 до 154 обусловлены синтаксическим анализом ввода: теперь код принимает ввод как две строки чисел, разделенных пробелами.)
Безголовая версия:
Я мог бы покончить с 6 байтами, если "
ans = ...
разрешался тип вывода "", я никогда не уверен в этом.Мне жаль говорить, что мое оригинальное и, конечно, остроумное решение было слишком безрассудным по сравнению с моим текущим решением. Это также первый раз, когда я использую
accumarray
. Приложение с шестью входными параметрами все еще должно ждать, хотя :)Выходы (следующие
format long
):Выходы по умолчанию
format short g
:источник