Wolfram Computation Meets Knowledge

What Is a Computational Essay? (Russian)

Высокоэффективный способ выражения идей

Люди привыкли к созданию прозы, а иногда изображений, для самовыражения. Но в современную эпоху вычислений появилось нечто новое, что я хотел бы назвать вычислительным эссе.

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

Вот очень простой пример вычислительного эссе:

Simple computational essay example

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

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

Но на самом деле, то, что позволяет этому работать – это язык Wolfram Language – предоставляя исчерпывающее изложение высокоуровневых идей, и определяя уникальное объединение человеческого вычислительного мышления и реальных вычислений и знаний, которые дает нам компьютер.

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

Для всего этого важно чтобы язык Wolfram Language содержал наибольшее количество встроенных знаний – как о мире, так и о том, как вычислять вещи в нем. Именно это позволяет ему немедленно говорить не только об абстрактных вычислениях, но также и о реальных вещах, существующих и происходящих в мире – и в конечном итоге обеспечить истинный язык вычислений связывающий возможности людей и компьютеров.

Пример

Давайте используем вычислительное эссе для объяснения вычислительных эссе.

Допустим, мы хотим поговорить о структуре человеческого языка, такого как английский. Английский в основном состоит из слов. Давайте составим список самых распространённых.

Создаём список общих слов на английском языке:

WordList[]

WordList[]

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

Составим гистограмму длин слов:

Histogram[StringLength[WordList[]]]

Histogram[StringLength[WordList[]]]

Сделаем то же самое для французского языка:

Histogram[StringLength[WordList[Language -> "French"]]]

Histogram[StringLength[WordList[Language -> "French"]]]

Обратите внимание, что длина слова, как правило, длиннее во французском языке. Мы могли бы выяснить, почему документы на французском языке длиннее, чем на английском, или как это связано с такими величинами, как энтропия для текста. (Разумеется, поскольку это вычислительное эссе, читатель может повторить вычисления в нём сам, скажем, попробовав русский вместо французского.)

Но для разнообразия, давайте сравним языки, сравнив их переводы, скажем, для слова “компьютер”.

Найдём переводы для слова “компьютер” на 10 самых распространённых языках:

Take[WordTranslation["computer", All], 10]

Take[WordTranslation["computer", All], 10]

Возьмём первый перевод в каждом случае:

First /@ Take[WordTranslation["computer", All], 10]

First /@ Take[WordTranslation["computer", All], 10]

Организуем распространённые языки в “пространстве характеристик” на основе их переводов для слова “компьютер”:

FeatureSpacePlot[First /@ Take[WordTranslation["computer", All], 40]]

FeatureSpacePlot[First /@ Take[WordTranslation["computer", All], 40]]

Из этого графика мы можем начать исследовать все виды структурных и исторических отношений между языками. Но с точки зрения вычислительного эссе здесь важно то, что мы делимся объяснением как с обычным текстом, так и с входными и выходными данными.

В тексте говорится о том, в чём состоит основной смысл. Затем ввод данных даёт точное определение того, что мы хотим. А выходные показывают результат запроса. Но взгляните на входные данные. Даже просто взглянув на названия функций языка Wolfram Language, можно довольно хорошо понять, о чём идёт речь. И хотя имена функций основаны на английском языке, можно использовать “описания кода” чтобы понять их на другом языке, например, японском:

FeatureSpacePlot[First/@Take[WordTranslation["computer",All],40]]

FeatureSpacePlot[First /@ Take[WordTranslation["computer", All], 40]]

Но допустим, никто не знает, что означает FeatureSpacePlot. Что это? Если бы это было просто слово или фраза на английском языке, мы могли бы посмотреть его определение в словаре, но мы бы не получили точного ответа. Функция в языке Wolfram Language всегда определена с точностью. И чтобы узнать, что она делает, мы можем начать с просмотра документации. Конечно же, лучше нам самим попробовать выполнить функцию, чтобы точно увидеть, что она делает.

FeatureSpacePlot page

Это самая важная часть того, что является замечательным в вычислительных эссе. Если вы читаете обычное эссе и не понимаете какой-то момент, то, в результате, вам придётся попросить авторов разъяснения о том, что они имели в виду. По сравнению с простым эссе, вычислительное эссе даёт вам возможность ввода запросов на языке Wolfram Language, который точно и однозначно определяет всё. Причем к этому, если вы хотите знать значение входных данных, вы можете просто запустить командную строку и изучить любую деталь на своем компьютере автоматически и не прибегая к какому-либо обсуждению с автором.

Практические аспекты

Так как же создать вычислительное эссе? Со стеком технологий, имеющимся в нашей компании, создание эссе очень просто – благодаря идее блокнотов для работы с Wolfram Mathematica, которые были уже доступны в первой версии системы ещё в 1988 году. Блокнот Wolfram – это структурированный документ, в котором совмещаются элементы текста с элементами ввода и вывода языка Wolfram Language, включая графику, изображения, звуки и интерактивный контент:

A typical notebook

В современное время одной замечательной (и очень трудной для достижения!) возможностью является то, что полнофункциональные Wolfram блокноты работают без никаких проблем на настольных компьютерах, в облаке и на мобильных устройствах. Вы можете создавать блокнот собственно в Wolfram Desktop (Mac, Windows, Linux), в Интернете через любой веб-браузер, или на мобильном телефоне через приложение Wolfram Cloud. Затем вы можете поделиться им или опубликовать его на Wolfram Cloud, к которому можно получить доступ через Интернет, либо загрузить его на настольный компьютер или устройство iOS.

Notebook environments

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

Новая форма учёбы студентов

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

Вычислительное эссе по сути является интеллектуальной историей, рассказанной в сотрудничестве между человеком и компьютером. Компьютер выступает как своеобразный интеллектуальный каркас, позволяя вам сразу же использовать огромные вычислительные возможности и знания. Но это также и средство для улучшения понимания задания, потому что, чтобы показать компьютеру правильную траекторию вашей работы, вы должны понимать её сами.

Когда студенты пишут обычные эссе, они обычно пишут содержание, которое в некотором смысле «уже существует»(«обсудите этот отрывок»; «объясните этот момент истории»; …). Но, при выполнении вычислений с помощью языка Wolfram Language обнаружить новые вещи настолько легко, что вычислительные эссе в конечном итоге предлагают нам неисчерпаемый источник нового, раньше не существующего контента. Студенты смогут успешно проводить исследования, делать новые открытия и также легко понимать и объяснять задачи и идеи.

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

Какая должна быть методика для студентов, создающих вычислительные эссе? В летней школе Wolfram Summer School мы провели эксперимент, попросив всех наших студентов написать вычислительное эссе на самую знакомую им тему. В итоге мы получили 72 интересных эссе, посвященных довольно широкому кругу интересов.

В более обычной образовательной среде “указание” для вычислительного эссе может быть что-то вроде “Какова типичная длина английского слова” или “Исследуйте длину английского слова”.

Я пробовал еще один рабочий процесс. В качестве образовательного компонента “лекции”, используйте livecoding (или живое кодирование). Следуя вычислениям вашего студента, создайте или изучите тему подробнее. В конце урока у каждого студента будет свой созданный блокнот. Затем их “домашним заданием” будет превращение этого блокнота в вычислительное эссе, объясняющее построенный процесс вычислений.

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

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

Однако, с вычислительным эссе суть состоит в том, что код для реализации задачи уже существует и готов к вашим новым запросам.

Любая тема, по вашему запросу

О чём могут быть вычислительные эссе? Практически о чём угодно! Я часто говорю о том, что для любой области изучения X (от археологии до зоологии) либо сейчас, либо в скором будущем, будет “вычислительный X”. И любой “вычислительный X” может быть немедленно исследован и объяснен с помощью вычислительных эссе.

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

Как насчёт существующей учебной дисциплины? Представьте, что вы изучаете историю – скажем, Английскую революцию. Удобно, что в языке Wolfram Language есть много встроенных знаний об истории (как и о многих других вещах). Таким образом, вы можете изучать Английскую революцию через своего рода диалог. Например, вы можете попросить географию сражений:

GeoListPlot[\!\(\*
NamespaceBox["LinguisticAssistant",
DynamicModuleBox[{Typeset`query$$ = "English Civil War", 
      Typeset`boxes$$ = TemplateBox[{"\"English Civil War\"", 
RowBox[{"Entity", "[", 
RowBox[{"\"MilitaryConflict\"", ",", "\"EnglishCivilWar\""}], "]"}], 
        "\"Entity[\\\"MilitaryConflict\\\", \
\\\"EnglishCivilWar\\\"]\"", "\"military conflict\""}, "Entity"], 
      Typeset`allassumptions$$ = {{
       "type" -> "Clash", "word" -> "English Civil War", 
        "template" -> "Assuming \"${word}\" is ${desc1}. Use as \
${desc2} instead", "count" -> "3", 
        "Values" -> {{
          "name" -> "MilitaryConflict", 
           "desc" -> "a military conflict", 
           "input" -> "*C.English+Civil+War-_*MilitaryConflict-"}, {
          "name" -> "Word", "desc" -> "a word", 
           "input" -> "*C.English+Civil+War-_*Word-"}, {
          "name" -> "HistoricalEvent", "desc" -> "a historical event",
            "input" -> "*C.English+Civil+War-_*HistoricalEvent-"}}}, {
       "type" -> "SubCategory", "word" -> "English Civil War", 
        "template" -> "Assuming ${desc1}. Use ${desc2} instead", 
        "count" -> "4", 
        "Values" -> {{
          "name" -> "EnglishCivilWar", 
           "desc" -> "English Civil War (1642 - 1651)", 
           "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_*\
EnglishCivilWar-"}, {
          "name" -> "FirstEnglishCivilWar", 
           "desc" -> "English Civil War (1642 - 1646)", 
           "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_*\
FirstEnglishCivilWar-"}, {
          "name" -> "SecondEnglishCivilWar", 
           "desc" -> "Second English Civil War", 
           "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_*\
SecondEnglishCivilWar-"}, {
          "name" -> "ThirdEnglishCivilWar", 
           "desc" -> "Third English Civil War", 
           "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_*\
ThirdEnglishCivilWar-"}}}}, Typeset`assumptions$$ = {}, 
      Typeset`open$$ = {1, 2}, Typeset`querystate$$ = {
      "Online" -> True, "Allowed" -> True, 
       "mparse.jsp" -> 1.305362`6.5672759594240935, 
       "Messages" -> {}}}, 
DynamicBox[ToBoxes[
AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, 
Dynamic[Typeset`query$$], 
Dynamic[Typeset`boxes$$], 
Dynamic[Typeset`allassumptions$$], 
Dynamic[Typeset`assumptions$$], 
Dynamic[Typeset`open$$], 
Dynamic[Typeset`querystate$$]], StandardForm],
ImageSizeCache->{265., {7., 17.}},
TrackedSymbols:>{
        Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, 
         Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}],
DynamicModuleValues:>{},
UndoTrackedVariables:>{Typeset`open$$}],
BaseStyle->{"Deploy"},
DeleteWithContents->True,
Editable->False,
SelectWithContents->True]\)["Battles"]]

Вы могли бы запросить хронологию событий начала революции (вам не нужно просить “первые 15 сражений”, потому что, если кто-то этим интересуется, то информацию об этом можно просто прочитать из кода языка Wolfram Language):

TimelinePlot[Take[\!\(\*
NamespaceBox["LinguisticAssistant",
DynamicModuleBox[{Typeset`query$$ = "English Civil War", 
       Typeset`boxes$$ = TemplateBox[{"\"English Civil War\"", 
RowBox[{"Entity", "[", 
RowBox[{"\"MilitaryConflict\"", ",", "\"EnglishCivilWar\""}], "]"}], 
         "\"Entity[\\\"MilitaryConflict\\\", \\\"EnglishCivilWar\\\"]\
\"", "\"military conflict\""}, "Entity"], 
       Typeset`allassumptions$$ = {{
        "type" -> "Clash", "word" -> "English Civil War", 
         "template" -> "Assuming \"${word}\" is ${desc1}. Use as \
${desc2} instead", "count" -> "3", 
         "Values" -> {{
           "name" -> "MilitaryConflict", 
            "desc" -> "a military conflict", 
            "input" -> "*C.English+Civil+War-_*MilitaryConflict-"}, {
           "name" -> "Word", "desc" -> "a word", 
            "input" -> "*C.English+Civil+War-_*Word-"}, {
           "name" -> "HistoricalEvent", 
            "desc" -> "a historical event", 
            "input" -> "*C.English+Civil+War-_*HistoricalEvent-"}}}, {
        "type" -> "SubCategory", "word" -> "English Civil War", 
         "template" -> "Assuming ${desc1}. Use ${desc2} instead", 
         "count" -> "4", 
         "Values" -> {{
           "name" -> "EnglishCivilWar", 
            "desc" -> "English Civil War (1642 - 1651)", 
            "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_\
*EnglishCivilWar-"}, {
           "name" -> "FirstEnglishCivilWar", 
            "desc" -> "English Civil War (1642 - 1646)", 
            "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_\
*FirstEnglishCivilWar-"}, {
           "name" -> "SecondEnglishCivilWar", 
            "desc" -> "Second English Civil War", 
            "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_\
*SecondEnglishCivilWar-"}, {
           "name" -> "ThirdEnglishCivilWar", 
            "desc" -> "Third English Civil War", 
            "input" -> "*DPClash.MilitaryConflictE.English+Civil+War-_\
*ThirdEnglishCivilWar-"}}}}, Typeset`assumptions$$ = {}, 
       Typeset`open$$ = {1, 2}, Typeset`querystate$$ = {
       "Online" -> True, "Allowed" -> True, 
        "mparse.jsp" -> 1.305362`6.5672759594240935, 
        "Messages" -> {}}}, 
DynamicBox[ToBoxes[
AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, 
Dynamic[Typeset`query$$], 
Dynamic[Typeset`boxes$$], 
Dynamic[Typeset`allassumptions$$], 
Dynamic[Typeset`assumptions$$], 
Dynamic[Typeset`open$$], 
Dynamic[Typeset`querystate$$]], StandardForm],
ImageSizeCache->{275., {7., 17.}},
TrackedSymbols:>{
         Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, 
          Typeset`assumptions$$, Typeset`open$$, 
          Typeset`querystate$$}],
DynamicModuleValues:>{},
UndoTrackedVariables:>{Typeset`open$$}],
BaseStyle->{"Deploy"},
DeleteWithContents->True,
Editable->False,
SelectWithContents->True]\)["Battles"], 15]]

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

Можете ли вы сделать “вычислительное эссе” об искусстве? Безусловно. Давайте попробуем искусствознание. Запросим 10 случайных картин Ван Гога:




van Gogh paintings output

EntityValue[RandomSample[\!\(\*
NamespaceBox["LinguisticAssistant",
DynamicModuleBox[{Typeset`query$$ = "van gogh", Typeset`boxes$$ = 
       TemplateBox[{"\"Vincent van Gogh\"", 
RowBox[{"Entity", "[", 
RowBox[{"\"Person\"", ",", "\"VincentVanGogh::9vq62\""}], "]"}], 
         "\"Entity[\\\"Person\\\", \\\"VincentVanGogh::9vq62\\\"]\"", 
         "\"person\""}, "Entity"], 
       Typeset`allassumptions$$ = {{
        "type" -> "Clash", "word" -> "van gogh", 
         "template" -> "Assuming \"${word}\" is ${desc1}. Use as \
${desc2} instead", "count" -> "4", 
         "Values" -> {{
           "name" -> "Person", "desc" -> "a person", 
            "input" -> "*C.van+gogh-_*Person-"}, {
           "name" -> "Movie", "desc" -> "a movie", 
            "input" -> "*C.van+gogh-_*Movie-"}, {
           "name" -> "SolarSystemFeature", 
            "desc" -> "a solar system feature", 
            "input" -> "*C.van+gogh-_*SolarSystemFeature-"}, {
           "name" -> "Word", "desc" -> "a word", 
            "input" -> "*C.van+gogh-_*Word-"}}}}, 
       Typeset`assumptions$$ = {}, Typeset`open$$ = {1, 2}, 
       Typeset`querystate$$ = {
       "Online" -> True, "Allowed" -> True, 
        "mparse.jsp" -> 0.472412`6.125865914333281, 
        "Messages" -> {}}}, 
DynamicBox[ToBoxes[
AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, 
Dynamic[Typeset`query$$], 
Dynamic[Typeset`boxes$$], 
Dynamic[Typeset`allassumptions$$], 
Dynamic[Typeset`assumptions$$], 
Dynamic[Typeset`open$$], 
Dynamic[Typeset`querystate$$]], StandardForm],
ImageSizeCache->{227., {7., 17.}},
TrackedSymbols:>{
         Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, 
          Typeset`assumptions$$, Typeset`open$$, 
          Typeset`querystate$$}],
DynamicModuleValues:>{},
UndoTrackedVariables:>{Typeset`open$$}],
BaseStyle->{"Deploy"},
DeleteWithContents->True,
Editable->False,
SelectWithContents->True]\)["NotableArtworks"], 10], "Image"]

Затем посмотрим, какие цвета они используют (удивительно ограниченный выбор):

ChromaticityPlot[%]

ChromaticityPlot[%]

Или, может быть, можно написать вычислительное эссе о том, как на самом деле создавать искусство или музыку.

А как насчет науки? Вы можете заново открыть законы Кеплера, посмотрев на характеристики планет:

\!\(\*
NamespaceBox["LinguisticAssistant",
DynamicModuleBox[{Typeset`query$$ = "planets", Typeset`boxes$$ = 
     TemplateBox[{"\"planets\"", 
RowBox[{"EntityClass", "[", 
RowBox[{"\"Planet\"", ",", "All"}], "]"}], 
       "\"EntityClass[\\\"Planet\\\", All]\"", "\"planets\""}, 
      "EntityClass"], 
     Typeset`allassumptions$$ = {{
      "type" -> "Clash", "word" -> "planets", 
       "template" -> "Assuming \"${word}\" is ${desc1}. Use as \
${desc2} instead", "count" -> "4", 
       "Values" -> {{
         "name" -> "PlanetClass", "desc" -> " referring to planets", 
          "input" -> "*C.planets-_*PlanetClass-"}, {
         "name" -> "ExoplanetClass", 
          "desc" -> " referring to exoplanets", 
          "input" -> "*C.planets-_*ExoplanetClass-"}, {
         "name" -> "MinorPlanetClass", 
          "desc" -> " referring to minor planets", 
          "input" -> "*C.planets-_*MinorPlanetClass-"}, {
         "name" -> "Word", "desc" -> "a word", 
          "input" -> "*C.planets-_*Word-"}}}}, 
     Typeset`assumptions$$ = {}, Typeset`open$$ = {1, 2}, 
     Typeset`querystate$$ = {
     "Online" -> True, "Allowed" -> True, 
      "mparse.jsp" -> 0.400862`6.054539882441674, "Messages" -> {}}}, 
DynamicBox[ToBoxes[
AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, 
Dynamic[Typeset`query$$], 
Dynamic[Typeset`boxes$$], 
Dynamic[Typeset`allassumptions$$], 
Dynamic[Typeset`assumptions$$], 
Dynamic[Typeset`open$$], 
Dynamic[Typeset`querystate$$]], StandardForm],
ImageSizeCache->{171., {7., 17.}},
TrackedSymbols:>{
       Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, 
        Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}],
DynamicModuleValues:>{},
UndoTrackedVariables:>{Typeset`open$$}],
BaseStyle->{"Deploy"},
DeleteWithContents->True,
Editable->False,
SelectWithContents->True]\)[{"DistanceFromSun", "OrbitPeriod"}]

ListLogLogPlot[%]

ListLogLogPlot[%]

Также, вы могли бы продолжить и проверить это для экзопланет. Или могли бы начать решать уравнения движения для планет.

Давайте посмотрим на биологию. Вот первое начало контрольной последовательности для митохондрий человека:

GenomeData[{"Mitochondrion", {1, 150}}]

GenomeData[{"Mitochondrion", {1, 150}}]

Вы можете начать разбивать его на возможные кодоны:

StringPartition[%, 3]

StringPartition[%, 3]

Существует огромное количество данных о всевозможных вещах, встроенных в язык Wolfram Language. Но есть также репозиторий данных Wolfram Data Repository, который содержит различные виды определённых наборов данных. Например, вот карта всех выставочных площадок в США:

GeoListPlot[  ResourceData["U.S. State Fairgrounds"][All, "GeoPosition"]]

GeoListPlot[
 ResourceData["U.S. State Fairgrounds"][All, "GeoPosition"]]

А здесь облако слов из конституций стран, которые вступили в силу с 2010 года:

WordCloud[
 StringJoin[
  Normal[ResourceData["World Constitutions"][
    Select[#YearEnacted > \!\(\*
NamespaceBox["LinguisticAssistant",
DynamicModuleBox[{Typeset`query$$ = "year 2010", Typeset`boxes$$ = 
           RowBox[{"DateObject", "[", 
RowBox[{"{", "2010", "}"}], "]"}], 
           Typeset`allassumptions$$ = {{
            "type" -> "MultiClash", "word" -> "", 
             "template" -> "Assuming ${word1} is referring to \
${desc1}. Use \"${word2}\" as ${desc2}.", "count" -> "2", 
             "Values" -> {{
               "name" -> "PseudoTokenYear", "word" -> "year 2010", 
                "desc" -> "a year", 
                "input" -> "*MC.year+2010-_*PseudoTokenYear-"}, {
               "name" -> "Unit", "word" -> "year", "desc" -> "a unit",
                 "input" -> "*MC.year+2010-_*Unit-"}}}}, 
           Typeset`assumptions$$ = {}, Typeset`open$$ = {1}, 
           Typeset`querystate$$ = {
           "Online" -> True, "Allowed" -> True, 
            "mparse.jsp" -> 0.542662`6.186074404594303, 
            "Messages" -> {}}}, 
DynamicBox[ToBoxes[
AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, 
Dynamic[Typeset`query$$], 
Dynamic[Typeset`boxes$$], 
Dynamic[Typeset`allassumptions$$], 
Dynamic[Typeset`assumptions$$], 
Dynamic[Typeset`open$$], 
Dynamic[Typeset`querystate$$]], StandardForm],
ImageSizeCache->{86., {7., 18.}},
TrackedSymbols:>{
             Typeset`query$$, Typeset`boxes$$, 
              Typeset`allassumptions$$, Typeset`assumptions$$, 
              Typeset`open$$, Typeset`querystate$$}],
DynamicModuleValues:>{},
UndoTrackedVariables:>{Typeset`open$$}],
BaseStyle->{"Deploy"},
DeleteWithContents->True,
Editable->False,
SelectWithContents->True]\) &], "Text"]]]]

Довольно часто мы интересуемся не общедоступными данными, а какими-то внутренними данными. Одним из удобных источников для таких данных является Wolfram Data Drop. В образовательной среде определённые базы данных (или облачные объекты в целом) могут быть сформированы так, чтобы они могли быть прочитаны (и/или добавлены) какой-либо конкретной группой пользователей. К примеру, вот база данных, которую я аккумулирую для себя, показывающая моё сердцебиение в течение дня. Вот сегодняшние данные:

DataListPlot[TimeSeries[Databin[

DateListPlot[TimeSeries[YourDatabinHere]]

А теперь строим гистограмму:

Histogram[TimeSeries[Databin[

Histogram[TimeSeries[YourDatabinHere]]

Как насчёт математики? Ключевой вопрос в математике – понять, почему всё так. Традиционный подход к этому состоит в предоставлении доказательств. Но вычислительные эссе предоставляют альтернативу. Природа шагов в них различна – но цель одна и та же: показать, что истинно и почему.

В качестве очень простого примера давайте рассмотрим простые числа. Вот первые 50:

Table[Prime[n], {n, 50}]

Table[Prime[n], {n, 50}]

Давайте найдем остаток от деления на 6 для всех этих простых чисел:

Mod[Table[Prime[n], {n, 50}], 6]

Mod[Table[Prime[n], {n, 50}], 6]

Но почему встречаются только 1 и 5 (после тривиальных случаев простых чисел 2 и 3)? Мы можем видеть это по вычислениям. Любое число может быть записано как 6n+k для некоторых n и k:

Table[6 n + k, {k, 0, 5}]

Table[6 n + k, {k, 0, 5}]

Но если мы разложим числа, записанные в этой форме, мы увидим, что 6n+1 и 6n+5 – единственные, которые не должны быть кратными:

Factor[%]

Factor[%]

А как насчёт информатики? Можно, например, написать вычислительное эссе о реализации алгоритма Евклида, изучении его времени выполнения и так далее.

Определяем функцию, чтобы дать все шаги в алгоритме Евклида:

gcdlist[a_, b_] :=   NestWhileList[{Last[#], Apply[Mod, #]} &, {a, b}, Last[#] != 0 &, 1]

gcdlist[a_, b_] := 
 NestWhileList[{Last[#], Apply[Mod, #]} &, {a, b}, Last[#] != 0 &, 1]

Найти распределение длин шагов по алгоритму для чисел до 200:

Histogram[Flatten[Table[Length[gcdlist[i, j]], {i, 200}, {j, 200}]]]

Histogram[Flatten[Table[Length[gcdlist[i, j]], {i, 200}, {j, 200}]]]

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

FeatureSpacePlot[RandomSample[Keys[ResourceData["MNIST"]], 50]]

FeatureSpacePlot[RandomSample[Keys[ResourceData["MNIST"]], 50]]

Если вы хотите углубиться в разработку программного обеспечения, вы можете написать вычислительное эссе о протоколе HTTP. Это получает HTTP-ответ с сайта:

URLRead["https://www.wolframalpha.com"]

URLRead["https://www.wolfram.com"]

И это показывает древовидную структуру элементов на веб-странице по этому URL-адресу:

TreeForm[Import["http://www.wolframalpha.com", {"HTML", "XMLObject"}],   VertexLabeling -> False, AspectRatio -> 1/2]

TreeForm[Import["http://www.wolframalpha.com", {"HTML", "XMLObject"}],
  VertexLabeling -> False, AspectRatio -> 1/2]

Или – в совершенно другом направлении – Вы могли бы поговорить об анатомии:

AnatomyPlot3D[left foot]

AnatomyPlot3D[Entity["AnatomicalStructure", "LeftFoot"]]

Что делает хорошее вычислительное эссе?

Насколько я понимаю, для того, чтобы вычислительное эссе было хорошим, оно должно быть максимально простым для понимания. Формат, конечно, очень помогает. Потому что вычислительное эссе полно выходных данных (часто графических), которые легко просмотреть, и которые сразу дают некоторое представление о том, что эссе пытается сказать. Также помогает, что вычислительные эссе являются структурированными документами, которые доставляют информацию в хорошо инкапсулированных частях.

Но в конечном итоге это зависит от автора вычислительного эссе, чтобы сделать его понятным. Но еще одна вещь, которая помогает, заключается в том, что сущность вычислительного эссе заключается в том, что она должна иметь “вычислительный нарратив”- последовательность фрагментов кода, которые компьютер может выполнить, чтобы сделать то, что обсуждается в эссе. И хотя можно написать обычное эссе, которое не имеет особого смысла, но все же звучит хорошо, в конечном итоге нельзя сделать что-то подобное в вычислительном эссе. Потому что в конце концов код – это код, и на самом деле он должен работать и делать что-то.

Так что же может пойти не так? Ну, как и английская проза, код языка Wolfram Language может быть излишне сложным и трудным для понимания. В хорошем вычислительном эссе как обычный текст, так и код должны быть максимально простыми и понятными. Я пытаюсь применять это для себя, говоря, что каждая часть ввода должна быть длиной не более одной или, возможно, двух строк – и что заголовок для ввода всегда должен быть только одной строкой. Если я пытаюсь сделать что-то, где его ядро (возможно, исключая такие вещи, как параметры отображения) занимает больше, чем строка кода, то я разбиваю его, объясняя каждую строку отдельно.

Ещё один важный принцип, на мой взгляд, это: явность. Не иметь какой-либо переменной, которая, скажем, не соответствует для хранения списка слов. Необходимо показать хотя бы часть списка, чтобы люди могли четко видеть, что это такое. А когда выходные данные получаются сложными, найдите какую-нибудь таблицу или визуализацию, которая делает интересующие вас характеристики очевидными. Не давайте “ключевому результату” быть скрытым и оставаться в тени; убедитесь, что способ, которым вы настраиваете, выводит результат на первый план.

Используйте структурированный характер блокнотов. Разделяйте вычислительные эссе с заголовками разделов, таким образом помогая облегчить их просмотр. Я придерживаюсь стиля “заголовочные строки” перед каждым вводом данных. Не волнуйтесь, если это несколько повторяет сказанное в абзаце текста; это для того, чтобы если кто-то просто “смотрит на картинки” смог прочитать и понять о чём эти картинки, прежде чем он действительно погрузится в полное текстовое повествование.

Технология Wolfram блокнотов позволяет легко вставлять интерактивные элементы, такие как Manipulate, в вычислительные эссе. И иногда это очень полезно, и, возможно, даже необходимо. Но не следует злоупотреблять интерактивными элементами. Потому что всякий раз, когда есть элемент, требующий взаимодействия, это уменьшает возможность просмотра эссе.

Иногда существует достаточное количество данных – или кода – это необходимо для создания определенного вычислительного эссе. Облако очень полезно для обработки этого. Просто разверните данные (или код) в Wolfram Cloud и установите соответствующие разрешения, чтобы их можно было автоматически читать при выполнении кода в эссе.

Блокноты также позволяют “обратное закрытие” ячеек, что позволяет сразу же увидеть выходную ячейку, даже если входная ячейка, которая сгенерировала ее, изначально закрыта. Такого рода сокрытия кода, как правило, следует избегать в основной части вычислительного эссе, но иногда это полезно в начале или в конце эссе, чтобы указать на то, что происходит, или включить что-то более продвинутое, где вы не хотите подробно рассказывать, как это делается.

Итак, если компьютерное эссе сделано, скажем, как домашнее задание, как его можно оценить? Первый простой вопрос: работает ли код? И это можно определить почти автоматически. Затем, после этого, процесс оценки очень похож на обычный эссе. Конечно, это приятно и легко добавлять ячейки в блокнот, чтобы дать комментарии о том, что там есть. И эти ячейки могут содержать исполняемый код – который, например, может принимать результаты в эссе и обрабатывать или проверять их.

Существуют ли принципы хороших вычислительных эссе? Вот несколько кандидатов:

0. Понимайте, о чём вы говорите (!)

1. Найдите самый простой и прямой способ представить свою тему

2. Держите ядро каждого элемента ввода языка Wolfram Language в одной строке или двух

3. Используйте явную визуализацию или представление другой информации как можно больше

4. Попробуй сделать каждый ввод + подпись независимо понятным

5. Разбевайте разные темы или направления на разные подразделы

Изучение языка

В основе компьютерных эссе лежит идея выражения вычислительных мыслей с использованием языка Wolfram Language. Но для этого нужно знать язык. Теперь, в отличие от человеческих языков, язык Wolfram Language явно разработан (и, да, это то, чем я занимался последние 30 с лишним лет), чтобы следовать определенным принципам и быть максимально простым в изучении. Но всё ещё предолжаем учиться делать.

Одной из особенностей языка Wolfram Language является то, что, как и в случае с человеческими языками, его обычно легче читать, чем писать. И это означает, что хороший способ узнать, что нужно людям для написания вычислительных эссе – это сначала прочитать несколько эссе. Возможно, тогда они смогут начать изменять эти эссе. Или они могут начать создавать “эссе заметок”, на основе кода, сгенерированного в режиме livecoding или других занятиях в классе.

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

Когда я писал Элементарное введение в язык Wolfram Language (которoe самo по себе написанo в значительной степени как последовательность вычислительных эссе) у меня был интересный опыт. В начале книги было довольно легко объяснить вычислительные упражнения на английском языке (“Постройте таблицу из первых 10 квадратов”). Но чуть позже в книге это стало разочаровывающим процессом.

Было легко выразить то, что я хотел, на языке Wolfram Language. Но выразить это по-английски было долго и затруднительно (и имело тенденцию звучать как что-то юридическое). В этом и заключается весь смысл использования языка Wolfram Language, и причина, по которой я потратил более 30 лет на его создание: он обеспечивает лучший, более чёткий способ выражения вычислительных мыслей.

Иногда говорят о человеческих языках, что язык, который вы используете, определяет, как вы думаете. Не ясно, насколько это верно для человеческих языков. Но это абсолютно верно для компьютерных языков. И одна из самых сильных сторон языка Wolfram Language – это то, что он помогает сформулировать ясное вычислительное мышление.

Традиционные компьютерные языки – это написание кода, который описывает детали того, что должен делать компьютер. Смысл языка Wolfram Language заключается в предоставлении чего-то гораздо более высокого уровня – что может сразу же говорить о вещах в мире, и что позволяет людям как можно более непосредственно использовать его в качестве средства вычислительного мышления. И в некотором смысле это то, что делает возможным хорошее вычислительное эссе.

Долгий путь к вычислительным эссе

Теперь, когда у нас есть полноценные вычислительные эссе, я понимаю, что был на пути к ним на протяжении почти 40 лет. В первое время я брал интерактивные компьютерные выходные данные и скотчем приклеивал их в документе:

Interactive computer output sketch

К 1981 году, когда я создавал SMP (Symbolic Manipulation Program), я обычно писал документы, в которых содержался код и пояснения:

Code interspersed with explanations

Но только в 1986 году, когда я начал документировать то, что впоследствии стало системой Mathematica и языком Wolfram Language, я начал серьезно разрабатывать стиль, близкий к тому, что я сейчас использую для вычислительных эссе:

Wolfram Language Version 1 documentation

А с выпуском Mathematica 1.0 в 1988 году появился еще один важный элемент: изобретение Wolfram блокнотов. Блокноты появились в форме, по крайней мере, внешне очень похожей на актуальную версию (и уже во многих отношениях более изощрённой, чем имитации, появившиеся спустя 25 с лишним лет!): коллекции ячеек, организованные в группы и способные содержать текст, исполняемый код, графика и т. д.

Early Mac notebooks

Сначала блокноты были возможны только на компьютерах Mac и NeXT. Но спустя несколько лет они были расширены до Microsoft Windows и X Windows (а позже и Linux). Пользователи сразу же начали использовать блокноты, как для предоставления отчетов их работы и деятельности, так и для создания богатых пояснительных и учебных материалов. Менее чем через пару лет стали появляться курсы на основе блокнотах и книг, напечатанных из блокнотов, с интерактивными версиями, доступными на CD-ROM, на обложке:

Notebook publication example

Таким образом, в некотором смысле исходный материал для вычислительных эссе уже существовал к началу 1990-х годов. Но чтобы действительно сделать вычислительные эссе своими собственными, потребовалось развитие облака, а также весь широкий спектр вычислительных знаний, которые теперь являются частью языка Wolfram Language.

К 1990 году появилась прекрасная возможность создать блокнот с повествованием, и пользователи делали это, особенно по таким темам, как математика. Но если речь шла о реальных данных, всё становилось запутанным. Нужно было убедиться, что всё необходимое было соответствующим образом доступно с CD-ROM или чего-то ещё. Мы создали Player для блокнотов заблаговременно, который иногда распространялся вместе с блокнотами.

Но за последние несколько лет, особенно с развитием облака Wolfram Cloud, всё стало намного более оптимизированным. Потому что теперь вы можете легко хранить всё в облаке и использовать это где угодно. Также вы можете работать непосредственно с блокнотами в облаке, просто используя веб-браузер. Кроме того, благодаря множеству инноваций для помощи пользователю (включая ввод на естественном языке), стало ещё проще писать на языке Wolfram Language – и благодаря этому можно достичь ещё большего.

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

Образование: кануть в прошлое

Идея создания студентами вычислительных эссе-это нечто новое для современного времени, ставшее возможным благодаря целому набору современных технологий. Но есть любопытный резонанс с чем-то из далекого прошлого. Видите ли, если бы вы изучали такой предмет, как математика в США, пару сотен лет назад, вы бы сделали большую работу по созданию так называемой книги арифметического расчёта, в которую в течение нескольких лет вы тщательно записывали решения целого ряда проблем, объединяя объяснения с вычислениями. И в этом случае вы бы хранили свою книгу вычислений до конца своей жизни, обращаясь к ней всякий раз, когда вам нужно было решить проблемы, подобные тем, что были включены в эту книгу.

Что ж, теперь с вычислительными эссе вы можете сделать тоже самое быстрее и больше. Вы можете решить более сложные и масштабные проблемы, чем могли бы решить с вычислениями вручную. Но, как и в случае книг арифметического расчёта, вы можете писать вычислительные эссе, чтобы они были полезны для вас в будущем – хотя теперь вам не придется имитировать вычисления вручную; вместо этого вы просто отредактируете свой блокнот вычислительных эссе и сразу же повторно запустите в нем вводные данные Wolfram Language.

На самом деле я только недавно узнал о книгах арифметического расчёта. В течение примерно 20 лет у меня, по сути, в качестве художественного произведения была любопытная рукописная тетрадь (созданная в 1818 году, как говорится, неким Джорджем Леманом, по-видимому, из Орвигсбурга, штат Пенсильвания), со страницами, подобными этим:

Ciphering book

Теперь я знаю, что это книга арифметического расчёта, которая на этой странице описывает, как найти “высоту перпендикулярного объекта… по заданной длине тени”. И конечно, я не могу устоять перед современным аналогом вычислительного эссе, который, само собой разумеется, может быть немного более сложным.

Найти текущее положение Солнца по азимуту и высоте:

SunPosition[]

SunPosition[]

Найдите длину тени для объекта единичной высоты:

1/Tan[SunPosition[][[2]]]

1/Tan[SunPosition[][[2]]]

Учитывая 10-футовую тень, найдите высоту объекта, который ее создал:

Tan[SunPosition[][[2]]]10ft

Tan[SunPosition[][[2]]]10ft

Путь вперед

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

Когда я написал большую книгу Новый вид науки (с 1991 по 2002 год), ни наша технология, ни мир не были достаточно готовы к вычислительным очеркам в том виде, в каком они сейчас возможны. My research for the book filled thousands of Wolfram Notebooks. Мои исследования для этой книги заполнили тысячи блокнотов Wolfram. Но когда дело действительно дошло до составления книги, я просто показал результаты этих блокнотов-включая небольшую часть кода из них, в заметках в конце книги.

Но теперь история этой книги может быть рассказана в вычислительных эссе, которые я начал создавать. (Просто для удовольствия, я транслировал некоторые из работ, которые я делаю, чтобы создать эссе.)  И что очень радует так это то, насколько ясно и четко идеи, изложенные в книге, могут быть изложены в вычислительных эссе.

В вычислительных эссе заложен огромный потенциал. И действительно, сейчас мы начинаем проект по сбору “тематических исследований”, в которых используются вычислительные эссе для изучения широкого спектра тем, ранее не встречавшимися четкими и прямыми способами. Это будет что-то вроде нашего проекта Wolfram Demonstrations Project (сейчас в нем более 11 000 демонстраций Wolfram Language–powered Demonstrations). Вот типичный пример, который я написал:

The Central Limit Theorem

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

Есть что-то приятное как в написании – так и в чтении – вычислительных эссе. Как будто в обмене идеями мы наконец-то можем выйти за рамки чисто человеческих усилий – и фактически использовать силу вычислений. И для меня, построив язык Wolfram Language как компьютерный язык общения, удивительно видеть, как его можно использовать для эффективного общения в вычислительных эссе.

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

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


Чтобы прокомментировать этот пост, пожалуйста, посетите страницу в блоге Стивена Вольфрама »

Comments

Join the discussion

!Please enter your comment (at least 5 characters).

!Please enter your name.

!Please enter a valid email address.