2017-01-31 23 views
2

Я немного играю с языком программирования J, и я попытался создать глагол для вычисления энтропии из списка вероятностей (результаты события, формула будет подобна этому в python/pesudocode: -sum([p*log(p,2) for p in ps])).Формула энтропии в J-языке

версии Я попытался с помощью композиции (@:) работает, но один на основе крючка & вилок, кажется, делать что-то еще, и я забочусь о , почему он делает то, что он делает. Я пытаюсь работать с крюком и fork, и этот случай действительно доказывает, что мои интуиции ошибочны.

Вот код:

probs =: 0.75 0.25 NB. probabilties 
    entropy =: +/ @: (- * 2&^.) 
    entropyWrong =: +/ (- * 2&^.) 
    entropy probs   NB. this is correct 
0.811278 
    entropyWrong probs NB. this is wrong! 
1.06128 1.25 
0.561278 0.75 
    NB. shouldn't the following be the same as above (wrong)? 
    +/ (- * 2&^.) probs 
0.811278 

Суть моего вопроса не «как вычислить энтропию вероятностей в JS», но «почему же entropyWrong выше делает то, что он делает и почему это не так же, как «это содержание», который делает правильную вещь, по-видимому.

ответ

4

определение entropyWrong является крюк, который вы используете monadically.

entropyWrong =: +/ (- * 2&^.) 

Если monadic hook представлен как (u v) y, то в вашем случае +/ is u и (- * 2&^.) is v; v является fork. y, конечно, это probs, аргумент существительного.

J определяет действия монадического крючка как эквивалентные y u v y, так что u становится двоичным с y в качестве его левого аргумента и v y в качестве его правого аргумента. Это согласуется с правом права J на ​​левый порядок исполнения.

Кстати, вилки определены (f g h) y где f, g и h - глаголы, а результат - (f y) g h y. Каждый глагол может быть описан как зубья вилки, а средний зуб g является диадическим, а f и h являются монадическими, если fork применяется монодично.

entropy =: +/ @: (- * 2&^.) делает что-то другое. Энтропия в форме u @: v и принимает результаты вилки против и применяя их monadically к глаголу у

Если вы хотите, чтобы избавиться от использования @: энтропии, вы можете сделать это с помощью глагола [: , При использовании в качестве левого края вилки [: не возвращает результат, и вместо диадического создается монадический центр.

entropy2=: [: +/ (- * 2&^.) NB. with three verbs this is now a fork 
    probs =: 0.75 0.25 
    entropy2 probs 
0.811278 
+0

спасибо! великое и недвусмысленное объяснение. но теперь у меня остается вопрос: что делает «двоичный' +/'»? Я думал, что глагол, полученный в результате применения «/» наречия к диадическому глаголу, автоматически монодичен (для меня нет никакого смысла, поскольку я думаю об этом как «foldl +» в таких языках, как ML/Haskell). Кажется, я не нашел для него документацию, и из результатов выражений типа '1 2 +/100 200' я не могу вывести логику для этого ... – NeuronQ

+2

Нет проблем. Диадическая форма +/называется таблицей и лучше всего объясняется в разделе лексики J Dictionary. http://www.jsoftware.com/help/dictionary/d420.htm По сути, он берет каждый элемент левого аргумента (элементы могут быть или не быть атомами) и применяет их к элементам правильного аргумента. J для программистов C имеет хороший раздел о таких вещах в обсуждении рейтинга глагола http://www.jsoftware.com/help/jforc/loopless_code_i_verbs_have_r.htm – bob