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