machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Думать о функциях

Дата публикации Oct 3, 2019

Один из постоянных вопросов на уроках математики по всей стране - «для чего это хорошо?», Например, «когда мне это понадобится?».

По крайней мере, один ответ очевиден: все эти функциональные обозначения и концептуализация, при которых вы передаете аргументы из области, получая результаты в некотором диапазоне, - это довольно здоровая диета или хорошая тренировка, в зависимости от выбранной вами метафоры.

«Почему?» - спросите вы. «Почему меня волнуют функции и обозначения функций?».

калькулятор завтрашнего дня

Я написал об этом «калькуляторе завтрашнего дня» (изображенном выше) более подробно в другом месте. Моя цель в том, чтобы поделиться этим экспонатом, чтобы просто признать, что написание компьютерных языков часто влечет за собой определение вещей, называемых «функциями», которые в старых языках назывались «подпроцедурами» или «подпрограммами».

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

Что вы изучаете на уроке математики, и ваш учитель не лжет, так это то, что «реальная» (как в добросовестной) функция всегда дает один и тот же результат для одного и того же ввода. Метафора часто метафора карты со стрелками, указывающими откуда вы начинаете в некоторой области, и где вы в конечном итоге получаете некоторый диапазон возможных результатов. Функция - это то, что доставит вас туда.

Если все эти «домены и дальности» напоминают вам о баллистике и стрельбе из пушечных ядер, это, безусловно, относится к территории, с точки зрения нашей истории. У солдат были таблицы поиска, и идея заключалась в том, что если вы наберете соответствующие настройки, не пренебрегая скоростью ветра, у вас может быть приличный шанс поразить цель. Функции были (и есть) все о: если я дам вам это, я вернусь это: работа, которую вы должны были выполнить.

Выстрел и снаряд свалили под стенами крепости Монро (Еженедельник Харпера, 29 июня 1861 г., общественное достояние)

Подумайте о посадке в самолет. Вы прочитали соответствующую вывеску и знаете, куда она идет. То, где вы оказались, - это не случайный результат, не удивительное совпадение. Это не в мире математики. В реальном мире мы с большей вероятностью назначаем вероятности, потому что реальный мир менее предсказуем, чем чисто логический. Вы могли заметить.

Самое замечательное в математической функции - если я дам вам все входные данные и ничего не оставлю на волю случая, я гарантирую конкретный результат. То, что «ничего не оставлено на волю случая», может показаться неловким. Есть ли пределы нашей способности контролировать? Иногда эти ограничения кажутся неочевидными, даже после того, как мы их обнаружили.

Что ж, оказывается, что «функция» в данном компьютерном языке, можетневполне соблюдайте все эти правила, потому что сам язык допускает своего рода «небрежность» - по замыслу. Значение функции наследуется от других контекстов, и у информатики есть понятие «сфера действия». Изменения в глобальной области видимости могут повлиять на вывод функции, но эти изменения не отражаются во входных параметрах.

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

Почему компьютерные языки допускают такую ​​«неряшливость», спросите вы? Многие из них этого не делают, по крайней мере, на бумаге. Они предотвращают загрязнение программистом локального пространства, где всегда работает один и тот же механизм, без вмешательства «посторонних идей» (или «скрытых глобалов»), которые не могут быть учтены (отслежены, легко отслеживаются) в недрах этого конкретного функция. Мы часто говорим, что такие «загрязненные» программы «трудно рассуждать», и это действительно так.

Другими словами, если вся логика, в которой вы нуждаетесь, чтобы узнать результаты функции, учитывая конкретные входные данные, не находится прямо перед вами, тогда ее нельзя легко доверить как «настоящую» функцию. Функциональное программирование обещает прозрачность и способность рассуждать о программах, как если бы они были формальными математическими доказательствами.

За исключением непредвиденных обстоятельств, не зависящих от способности компьютерного языка диктовать (например, процессорного времени, выделяемого операционной системой), чисто функциональная программа может быть достоверно корректной и, следовательно, идеально подходящей для конкретных обстоятельств. Верно.

Вот реальный пример того, что может произойти в Codesters, платформе кодирования: вы напишите небольшую песню с stage.wait (0,3) секунды между каждой музыкальной нотой; но затем, прокручивая окно вверх и вниз во время воспроизведения партитуры, вы замечаете ускорение и замедление производительности.

Ноты не такие метрономические, как раньше. Скорость меняется, таким образом, «математическая музыка» никогда не должна Что-то «экологическое» заставляет наши функции изменять выход в ответ на один и тот же ввод.

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

Скорее, скорость ЦП или количество времени, которое ЦП имеет для этой программы, не контролируется грамматикой языка. Даже функционально чистый язык должен иметь дело со «средой», которую сам компьютерный язык не определяет. Особенно с музыкой, производительность в реальном времени имеет значение. Мы слышим различия довольно отчетливо.

В итоге: да, материал о функциях, которые вы изучаете на уроке математики, пригодится вам позже.

Вы будете думать об этих правилах, о том, как сопоставить домен с элементами диапазона, и соответствуют ли они критериям, изложенным в математическом классе, для того, чтобы они (эти правила) были действительными функциями, а не просто «отношениями» - другой формой отображения , надмножество функций которого являются частью. Отношения могут быть менее предсказуемыми и детерминированными.

{{1,2}, {2,1}, {1,1}, {0,0}} могут интерпретироваться различными способами, например, как набор множеств. Вот что он говорит в Python (на самом деле не совсем, см. Ниже).

Хитрость: хорошо, поэтому, если наборы содержат только уникальные значения, без дубликатов, и если {1,2} и {2,1} считаются «синонимичными наборами», то не должен ли вышеупомянутый набор быть неграмотным в Python? Наборы не содержат дубликатов, помните. Порядок расположения элементов слева направо не должен учитываться при их выделении.

Действительно, то, что я написал выше, не может быть прочитано как чистый Python. {0,0} для начинающих, содержит повторяющиеся значения. Мало того, что наборы не могут быть членами наборов; они слишком изменчивы

В [8]: {{1,2}, {2,1}, {1,1}, {0,0}}

Traceback (последний вызов был последним):

Файл "», Строка 1, в

{{1,2}, {2,1}, {1,1}, {0,0}}

TypeError: unhashable тип: ‘set’

К счастью, у Python есть тип «неизменяемого набора», frozenset… Итак, вырезание и вставка (снова) из некоторой I-Python IDE (Spyder в данном случае):

В [9]: it = map (frozenset, ({1,2}, {2,1}, {1,1}, {0,0}))

В [10]: {это для него в этом} # возможно не лучшая практика, но это работает

Выход [10]: {frozenset ({1}), frozenset ({0}), frozenset ({1, 2})}

Это примерно так близко, как мы, и да, {1,2} и {2,1} были объединены в один элемент.

В [10] я излишне злоупотреблял «этим», отсюда мой комментарий.

Более читабельно:

В [11]: it = map (frozenset, ({1,2}, {2,1}, {1,1}, {0,0}))

В [12]: {elem для elem в нем} # лучше

Выход [12]: {frozenset ({1}), frozenset ({0}), frozenset ({1, 2})}

Вернитесь к {{1,2}, {2,1}, {1,1}, {0,0}} и забудьте на данный момент Python: если мы рассмотрим левое числокаждая параэлемент домена, и каждое правильное число соответствует соответствующему элементу диапазона, тогда это вызывает сомнения относительно правильности «функциональности»?

Наше картирование стало слишком непредсказуемым. Если я буду использовать 1 для моего ввода, что это даст мне? Знаю ли я точно?

Вы видите проблему? Элемент 1 домена отображается на элемент 2 диапазона в самой левой паре {1, 2}, но 1 отображается в 1 в 1-м из последних {1, 1}.

Это не могло быть функцией тогда. Мы могли бы назвать это отношением.

Однако в Python мы игнорируем порядок в отображениях, поэтому {1,2} и {2,1} по существу являются синонимами.

Все вышеперечисленные полезные мысли играют в изучение Python или практически любого языка программирования. JavaScript это все о функциях.

Вы могли бы однажды узнать об «объектно-ориентированных» языках и обнаружить, что они явно заперты в смертельной схватке с более «функциональными» языками (в зависимости от того, кто рассказывает историю). Можно сказать, что все языки учатся друг у друга. Мы постепенно учим себя тому, что работает лучше всего.

Математика во многом похожа. Мы развиваем и / или трансформируем наши идеи, чтобы помочь нам выполнить работу независимо от ее работы. Иногда задача состоит в том, чтобы просто решить ноющую проблему, независимо от того, видим ли мы в этом практическую ценность.

Если у вашего учителя математики есть время показать вам кодировщиков, например, вместо калькулятора или в дополнение к нему, вы увидите больше этих связей.

Очень важно, чтобы учитель математики объяснил вам функции независимо от языка программирования.

Рад, что ты получаешь это сейчас, на уроке математики

Тем не менее, не бойтесь взглянуть на компьютерные языки, которые могут появиться. Я слышал, Фаро выглядит довольно интересно. Или посмотрите на J.

из марсианской математики

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map