Обчислення ентропії


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-елементний масив двокомпонентних векторів). Хоча для кожного з 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
За замовчуванням функції є дійсною альтернативою програмам. Вам дозволяється перекрити це, але це зробить деякі мови дуже сумними, тому що для введення файлів або stdin потрібно багато аркушів. Загалом, я рекомендую не мати такого обмежувального формату введення для математичного завдання. Дозволення природного типу списку мови зробить людей щасливішими для участі.
xnor

3
@dorothy зауважте, що справа не в тому, що "log_2 (0) є 0 для зручності", а скоріше "lim_ {p-> 0} p * log (p) == 0". Отже, "log_2 (0)" все ще є -inf.
Андрас Деак

Відповіді:


3

Математика, 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
Дякую! Ми не маємо достатньо перл відповіді на ppcg имхо
Dorothy

@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.