Вычисление энтропии


13

вход

Матрица 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

7
1. Каковы размеры x? 2. Как сделать вопрос автономным, как определяется бинарная энтропия Шеннона Mx?
Питер Тейлор

4
@ Комментарий Питера точно объясняет отрицательные стороны. Я просмотрел статью об энтропии и не могу сразу выяснить, что реализовать. Вы должны точно указать, что формула / алгоритм для вычисления энтропии Шеннона.
Линн

5
В любом случае, вопросы должны быть автономными; Маловероятно, что Википедия внезапно выйдет из сети, но было бы идеально, если бы вам не пришлось переходить на другую страницу, чтобы понять полную спецификацию задачи.
Дверная ручка

2
По умолчанию функции являются допустимой альтернативой программам. Вы можете отменить это, но это сделает некоторые языки очень грустными, потому что для ввода файлов или ввода в стандартный поток данных требуется много шаблонов. В более широком смысле, я рекомендую не использовать такой ограничительный формат ввода для математической задачи. Разрешение на использование естественного списка языков сделает людей счастливее участвовать.
xnor

3
@ запомните, что «log_2 (0) для удобства не 0», а «lim_ {p-> 0} p * log (p) == 0». Таким образом, «log_2 (0)» по-прежнему -inf.
Андрас Дик

Ответы:


3

Mathematica, 48 68 байт

Редактировать: добавлен препроцесс для принятия строки в качестве параметра.

С помощью Tuplesи Entropy, реализация становится краткой и удобочитаемой.

Entropy[2,{-1,1}~Tuples~Length@#.#]&@Thread@ImportString[#,"Table"]&

где Tuples[{-1,1},n]дает все возможные nкортежи {-1,1}, иEntropy[2,list] дает базу-2 информационной энтропии.

Одна из замечательных вещей заключается в том, что Mathematica на самом деле возвращает точное выражение:

%["-1 -1 \n -1 -1"]
(* 3/2 *)

Приблизительный результат может быть достигнут с дополнительным .добавлением ( Entropy[2., ...).


Mathematica смешная :) Однако ваш ответ не совсем соответствует спецификации. Ввод разделен пробелом, поэтому потребуется некоторый анализ. Смотрите последнее обновление.
Дороти

3

Perl, 160 159 141 байт

включает +1 для -pначиная с 141 байта обновления

@y=(@z=/\S+/g)x 2**@z;@{$.}=map{evals/.1/"+".$&*pop@y/egr}glob"{-1,+1}"x@z}{$H{$_.$2[$i++]}++for@1;$\-=$_*log($_/=1<<@z)/log 2 for values%H;

Ввод ожидается в STDINвиде 2 строк, состоящих из пробела 1или -1.
Запустить как perl -p 140.pl < inputfile.

Он не выиграет никаких призов, но я думал, что поделюсь своими усилиями.
Разъяснение:

    @y=                             # @y is (@z) x (1<<$n)
       (@z = /\S+/g)                # construct a matrix row from non-WS
       x 2**@z;                     # repeat @z 2^$n times
    @{$.} = map {                   # $.=$INPUT_LINE_NUMBER: set @1 or @2
      eval s/.1/"+".$&*pop@y/egr    # multiply matrix row with vector
    } glob "{-1,+1}" x @z           # produce all possible vectors

}{                                  # `-p` trick: end `while(<>)`, reset `$_`

$H{ $_ . $2[$i++] }++               # count unique M*x columns
    for @1;

$\ -= $_ * log($_/=1<<@z) / log 2   # sum entropy distribution
        for values %H;

ДАННЫЕ

  • Обновление 159: сохранить 1, исключив (), используя **вместо <<.
  • Обновление 141: сохранить 18 с помощью $.и -p.

1
Спасибо! У нас недостаточно ответов на Perl для PPCG Imho
Дороти

@dorothy Это потому, что игроки в коде ненавидят Perl, по большей части.
Эддисон Крамп

@FlagAsSpam Но, но .. Perl непостижим, лаконичен и безумен пограничный. Как это может быть более подходящим для код-гольфа?
Дороти

@dorothy ¯ \ _ (ツ) _ / ¯ Мы избегаем этого, как чума. Не знаю почему, правда.
Эддисон Крамп

2

Pyth, 37 байт

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

Тестирование

Это несколько сложнее, когда вам нужно реализовать умножение матриц вручную.

Объяснение:

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8
       JrR7.z                            Parse input into matrix, assign to J.
  _B1                                    [1, -1]
K^   lhJ                                 All +-1 vectors of length n, assign to K.
                           m       K     Map over K
                            m     J      Map over the rows of J
                             s*Vdk       Sum of vector product of vector and row.
                          S              Sort
                         r          8    Run length encode.
                       hM                Take just occurrence counts.
                   cRlK                  Divide by len(K) to get probabilities.
               *Lld                      Multiply each probabiliity by its log.
              s                          Sum.
             _                           Negate. Print implicitly.

Вот это да! :) Это похоже на большую работу. Теперь, где люди cjam .....?
Дороти

1

MATLAB, 196 194 187 184 126 154 байта

(Дополнительные 28 байтов от 126 до 154 обусловлены синтаксическим анализом ввода: теперь код принимает ввод как две строки чисел, разделенных пробелами.)

f=@()str2num(input('','s'));M=[f();f()];n=size(M,2);x=(dec2bin(0:n^2-1,n)-48.5)*2*M';[~,~,c]=unique(x,'rows');p=accumarray(c,1)/2^n;disp(-sum(p.*log2(p)))

Безголовая версия:

f=@()str2num(input('','s'));        % shorthand for "read a line as vector"
M=[f();f()];                        % read matrix
n=size(M,2);                        % get lenght of vectors

x=(dec2bin(0:n^2-1,n)-48.5)*2*M';   % generate every configuration
                                    %    using binary encoding
[~,~,c]=unique(x,'rows');           % get unique rows of (Mx)^T
p=accumarray(c,1)/2^n;              % count multiplicities and normalize
disp(-sum(p.*log2(p)))              % use definition of entropy

Я мог бы покончить с 6 байтами, если "ans = ... разрешался тип вывода "", я никогда не уверен в этом.

Мне жаль говорить, что мое оригинальное и, конечно, остроумное решение было слишком безрассудным по сравнению с моим текущим решением. Это также первый раз, когда я использую accumarray. Приложение с шестью входными параметрами все еще должно ждать, хотя :)

Выходы (следующие format long):

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
   1.500000000000000

[-1 -1 -1 -1
-1 -1 -1 -1]
   2.030639062229566

[-1  -1  -1  1
1  -1  -1  -1]
     3

Выходы по умолчанию format short g:

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
          1.5

[-1 -1 -1 -1
-1 -1 -1 -1]
       2.0306

[-1  -1  -1  1
1  -1  -1  -1]
     3
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.