![Обзор новых возможностей Mathematica 11 и языка Wolfram Language - 1 Обзор новых возможностей Mathematica 11 и языка Wolfram Language - 1](https://www.pvsm.ru/images/2016/08/21/obzor-novyh-vozmojnostei-Mathematica-11-i-yazyka-Wolfram-Language.png)
Перевод поста Стивен Вольфрам (Stephen Wolfram) "Today We Launch Version 11!".
Выражаю огромную благодарность Полине Сологуб за помощь в переводе и подготовке публикации
Содержание
— Первое, что вы отметите...
— 3D печать
— Машинное обучение и нейронные сети
— Аудио
— Встроенные данные о чем угодно: от скелетной структуры и продуктов питания до сведений о нашей Вселенной
— Вычисления с реальными объектами
— Передовые возможности географических вычислений и визуализаций
— Не забудем про сложные задачи математического анализа и теоретической физики...
— Образование
— Совмещение всех функций в одно целое
— Визуализация
— От строк к тексту
— Современный подход к программированию систем
— Работа в интернете
— Облачные данные
— Подключайтесь к любым внешним сервисам: Facebook, Twitter, Instagram, ArXiv, Reddit и многим другим...
— WolframScript
— Новое в ядре языка Wolfram Language
— И еще много нового...
Я рад объявить о выходе новой версии системы Mathematica и 11-й версии языка Wolfram Language, доступной как для Desktop-компьютеров, так и в облачном виде. В течение последних двух лет сотни человек упорно трудились над ее созданием, а несколько тысяч часов и я лично. Я очень взволнован; это важный шаг вперед, имеющий важное значение для многих крупнейших технологических областей.
Прошло больше 28 лет с тех пор, как вышла 1-я версия, — и почти 30 лет с тех пор, как я занялся ее разработкой. И все это время я продолжал воплощать дерзкую мечту — строить все больший и больший стек технологий. Большая часть программного обеспечения спустя несколько лет и несколько версий, за исключением мелких доработок, практически не меняется. С системой Mathematica и Wolfram Language сложилась совсем другая история: в течение трех десятилетий мы c каждой новой версией продвигались вперед, завоевывая постепенно огромное количество новых областей.
Это удивительное интеллектуальное путешествие для меня и для всех нас. С самого начала у нас был серьезный набор основополагающих принципов и сильная основная структура, так что в течение трех десятилетий мы могли просто продолжать строить на этом фундаменте все больше, создавая все то, что стало теперь огромной системой, сохраняющей свое единство, элегантность, и, откровенно говоря, современность. В первые годы мы сосредоточились на абстрактных областях вроде математики. Но со временем мы охватывали все больше видов вычислений и знаний.
Каждая новая версия это множество новых идей и много тысяч часов тяжелой работы. Более того — она представляет собой постоянно растущую систему рычагов, созданную с помощью нашей технологии. Это происходит потому, что одним из наших ключевых принципов является автоматизация, и в каждой новой версии мы используем все предыдущие достижения из этой области, — так что, в сущности, у нас появляется все больше и больше строительных блоков, благодаря которым мы можем все быстрее двигаться дальше. В создание и поддержание единой для всей системы структуры в течение многих лет вкладывались огромные усилия, так что в результате все эти строительные блоки из разных областей идеально подходят друг к другу.
При использовании традиционных подходов к разработке программного обеспечения нам потребовалось бы очень много лет для создания того, что мы добавили к 11-й версии. И тот факт, что мы можем представить сейчас новую версию, является прямым отражением эффективности нашей технологии, наших принципов и нашей методологии. Мне очень приятно видеть, что мы так далеко продвинулись не только в плане содержимого системы, но и в том, насколько эффективно мы можем развивать его. Не говоря уже о том, что все эти направления, которыми мы занимались на протяжении многих лет в рамках логического развития нашей системы, оказались сейчас именно тем, что нужно для многих наиболее активно развивающихся технологических областей.
Много лет мы называли нашу основную систему Mathematica. Однако после того, как мы добавили новые направления, а также вышли далеко за пределы вещей, связанных каким-либо образом с «математикой», мы решили ввести понятие Wolfram Language, чтобы передать суть всего того, что мы делаем. И сейчас Wolfram Language определяет работу не только системы Mathematica, но также и Wolfram Development Platform и Wolfram Programming Lab, а также других продуктов и платформ. И благодаря единству нашей разработоки программного обеспечения мы можем сегодня выпустить 11-ю версию всех наших систем, основанных на Wolfram Language.
ОК, так что же такого грандиозного и нового в 11-й версии? Ну, мы подготовили даже не одно большое нововведение, а много. Чтобы вы могли оценить масштаб: мы добавили 555 совершенно новых функций, представляющих огромное количество новых функциональных возможностей (по сравнению с первой версией, в которой была 551 функция в общей сложности). На самом деле, в данное число функций не включены даже углубленные варианты многих существующих функций.
Мы управляем развитием компании таким образом, что у нас всегда есть портфель актуальных проектов — от достаточно мелких до тех, которые могут потребовать на реализацию пять или более лет. 11-я версия включает в себя результаты нескольких пятилетних проектов. Мы заинтересованы в том, чтобы как можно быстрее доносить результаты наших исследований до пользователей, так что с момента выхода 10-й версии у нас было несколько промежуточных релизов; в результате 11-я версия фактически представляет собой сочетание многих совершенно новых разработок, которые мы уже анонсировали в версиях 10.1, 10.2, 10.3 и 10.4 (многие функции, которые были помечены как «экспериментальные» в 10.x выпусках, доступны теперь полностью в версии 11.0).
Первое, что вы отметите...
При первом запуске 11-й версии на рабочем столе первым, что вы заметите, будет новый внешний вид документов с более четкими шрифтами и строгим дизайном. При вводе кода появляется много новых вариантов автозаполнения (становится все труднее набрать что-то неправильно), а также при вводе текста работает новый спеллчекер в режиме реального времени, который мы будем постоянно обновлять, чтобы быть уверенными в том, что в него включены последние слова.
Если на вашем компьютере установлен один из дюжины других языков, кроме английского, вы увидите, что каждая функция автоматически помечается "подписью" на выбранном вами языке:
Когда вы запустите код, то заметите, что сообщения также выглядят по-разному, — и, что очень удобно, они позволяют сразу увидеть, какие функции были вызваны во время создания сообщения.
3D печать
В 11-й версии появилось много новых областей. Давайте перейдем к одной из них: 3D-печати. Впервые я напечатал в 3D еще в 2002 году. В течение многих лет мы экспортировали в STL. Для 11-й версии мы создали полный цикл, который начинается от создания 3D-геометрии и заканчивается в тот момент, когда готовое изделие лежит на вашем 3D-принтере.
Раньше мне хотелось взять чертеж в 3D и просто распечатать его — тоже в 3D. И иногда мне везло и это было легко осуществить. Но в большинстве случаев это неудобно и сложно, поскольку графики, которые высвечиваются на экране, не обязательно соответствуют геометрии, которая может быть напечатана на 3D-принтере. Так что удобно настроить или исправить геометрию так, чтобы она действительно работала на 3D-принтере, оказывается трудной задачей (и да — если вы сделаете это неправильно, из принтера может брызнуть пластик).
В 11-й версии стало возможным взять любой 3D-график и просто напечатать его в 3D. Или вы можете получить структуру молекулы или перепад высот вокруг горы, и тоже просто напечатать их в 3D. За эти годы я много печатал в 3D, и каждый раз это было своего рода маленькое приключение. Но теперь, благодаря 11-й версии, легко распечатать в 3D практически все, что угодно. И теперь, когда я думаю об этом, мне кажется нужна 3D-распечатка того, как рос Wolfram Language по разным областям…
Машинное обучение и нейронные сети
В некотором смысле, Mathematica и Wolfram Language всегда занимались искусственным интеллектом (ИИ). На протяжении многих лет мы были пионерами в решении серии проблем, связанных с ИИ: от математического решения автоматизации эстетики до понимания естественного языка. Но еще в 10-й версии мы сделали большой шаг вперед в отношении машинного обучения — речь идет о разработке максимально автоматизированных главных функций (Classify и Predict).
Должен сказать, что я не понимал, хорошо ли эти функции будут работать на практике. Прекрасно было наблюдать, насколько хорошо они работают, — и очень здорово видеть, что многие из наших пользователей могут внедрить машинное обучение в свою работу исключительно с помощью разработанной нами автоматизации и без консультации у специалистов по машинному обучению.
В 11-й версии мы изрядно продвинулись вперед в области машинного обучения. Теперь у нас есть новые способы осуществлять не только классификацию и прогнозирование, но и операции выделения признаков, уменьшения размера, кластеризации и так далее. И мы также очень много «обучаем» нашу систему, чтобы предоставлять пользователям готовые функции машинного обучения. Машинное обучение — это новое интересное направление разработки. По сути, это процесс курирования. Это как если бы вместо того, чтобы, скажем, собирать данные о различных видео, вы собираете столько изображений различных видов животных, сколько возможно.
В 11-ю версию встроены такие функции, как ImageIdentify, которая идентифицирует более 10000 различных видов объектов. Благодаря общей структуре довольно просто взять уже выделенные характеристики и использовать их для обучения новых классификаторов изображений более эффективно, чем раньше.
Мы много сделали для автоматизации наиболее распространенных из сегодняшних задач машинного обучения. Но только в последние годы стало ясно, что с помощью современных методов машинного обучения (и, в частности, с использованием нейронных сетей) может быть решено множество задач. Это поистине удивительный эпизод из истории науки: та область нейронных сетей, которой я занимался почти 40 лет, из кажущейся почти безнадежной стала одной из самых горячих областей, в которой почти каждую неделю делаются новые открытия.
Ну хорошо — допустим, вы тоже хотите заняться этим. Да, вы можете что-то собирать с помощью целого ряда низкоуровневых библиотек. Но при создании 11-й версии мы поставили перед собой цель создать оптимизированный символьный способ настройки и обучения нейросетей, в которых должно быть автоматизировано как можно больше из того, что они в принципе могут делать. В 11-й версии есть теперь функции вроде NetGraph и NetChain наряду со всевозможными “специальными функциями нейронных сетей” типа DotPlusLayer или ConvolutionLayer. И с помощью этих функций можно взять новейшие сети и быстро настроить их в Wolfram Language (рекуррентные сети в 11-й версии пока не совсем доделаны, однако они появятся в ближайшее время).
Конечно, все это хорошо работает благодаря интеграции с Wolfram Language. Нейронная сеть — это просто Graph объект, как и любой другой. И такие вводимые данные, как изображения или тексты, могут немедленно и автоматически обрабатываться с помощью стандартных возможностей Wolfram Language в формах, подходящих для нейросетевых вычислений.
Из их названия («нейронные сети») кажется, что они связаны с
У нас всегда были функции статистической подгонки данных и интерполяции. Однако у нейронных сетей значительно богаче пространство возможных вычислительных структур для подгонки данных или обучения. Замечательно, что только за последние пару лет столько различных областей претерпели революционные изменения, — и скоро их станет еще больше.
Я надеюсь, что мы сможем ускорить этот процесс с помощью 11-й версии. Нам удалось сделать «нейросетевое программирование» просто еще одной парадигмой программирования, наравне с остальными интегрированной в Wolfram Language. Это очень результативно и позволяет взаимодействовать с огромными обучающими последвательностями. Но в конечном итоге, думаю, самая сильная вещь — это то, что оно сразу же вписывается во все, что делает Wolfram Language. Даже в 11-й версии мы уже использовали его при работе с нашими внутренними алгоритмами в таких областях, обработка изображений, сигналов и текста. История «нейросетевого программирования» еще очень молода, и я рад, что Wolfram Language будет играть центральную роль в ней.
Аудио
Хорошо, давайте обратимся к еще одной новой области 11-й версии: аудио. Наша цель — иметь возможность обрабатывать любые данные непосредственно в Wolfram Language. У нас уже есть такие объекты, как графические примитивы (из которых можно строить сколь угодно сложную векторную 2D и 3D графику), растровые изображения (также 2D и 3D), геометрические вычисляемые объекты, графы и сети, формулы и множество других функций, последовательно представленных в языке в виде символьных структур. И, начиная с 11-й версии, теперь стал доступен еще один тип данных — аудио.
С аудио работать сложно из-за его размера. Однако в 11-й версии можно беспрепятственно обработать, скажем, час аудио непосредственно в Wolfram Language. Безусловно, за этим стоят технологии кэширования, потоковой передачи данных и так далее. Но это все автоматизировано — и в языке это просто объект, задаваемый функцией Audio. Этот Audio-объект можно сразу же подвергнуть крайне сложной обработке и анализу, которые доступны только в Wolfram Language.
Встроенные данные о чем угодно: от скелетной структуры и продуктов питания до сведений о нашей Вселенной
Wolfram Language — язык, основанный на знаниях. А это значит, что в него встроено множество знаний — как о вычислениях, так и обо всем в мире. На сегодняшний день Wolfram Language охватывает тысячи областей знаний реального мира — начиная от стран и фильмов до компаний и планет. Всё новые данные поступают в главную облачную базу знаний Wolfram, и мы тщательно курируем данные о том новом, что появляется в мире (кто знал, например, что в Австрии появились недавно новые административные подразделения?). Многие эти данные доступны в Wolfram|Alpha. Но только в Wolfram Language данные оживают для полноценных вычислений — и тогда становятся очевидными все те усилия, которые мы вкладываем в обеспечение согласованности и последовательности всей системы.
Мы постоянно работаем над тем, чтобы расширить сферу знаний, которые охватываются Wolfram Language. Те несколько направлений, над которыми мы работали на протяжении многих лет, в 11-й версии, наконец, готовы к работе. Особенно сложно было с данными по анатомии. Однако в 11-й версии вы увидите подробные 3D-модели всех значимых структур человеческого тела. Вы сможете увидеть, как сложные кости ноги прилегают друг к другу. И вы сможете сделать расчеты. Или напечатать их в 3D. Вы сможете изучить сеть артерий вокруг сердца. Должен сказать, что, когда я исследовал это, я более чем когда-либо был поражен уровнем морфологической сложности, присущей человеческому телу. Однако теперь мы можем легко делать расчеты в этой области. Для их обслуживания появились новые, и, возможно, неожиданные функции, — такие, как AnatomyPlot3D. Безусловно, с ними еще придется поработать: к примеру, наши анатомические данные — это только данные "среднего взрослого мужчины", а суставы не могут двигаться, и т. д.
Совершенно иная область данных дорабатывается также в настоящее время в Wolfram Language — это еда. В этой области много сложностей. Во-первых, онтологические проблемы. Что такое яблоко? Есть общее понятие — «яблоко», а также существует множество специфических типов яблок. Также встает вопрос определения «количества еды». Чашка клубники. Три яблока. Четверть фунта. Нам потребовалось много лет работы, чтобы получить надежный символьный способ отображения продуктов, с помощью которого мы можем сразу вычислить питательные свойства и много чего еще.
Еще одна долгожданная новинка — исторические данные по странам. У нас имелись данные о странах в новейшее время (как правило, с 1960-х или 1970-х гг.). А что насчет более раннего периода? Что насчет Пруссии? Что можно сказать о Римской империи? В общем, в 11-й версии мы наконец получили по крайней мере приблизительную информацию о границах всех серьезных стран на протяжении всей истории. Таким образом, посредством Wolfram Language можно сделать расчеты относительно подъема и падения империй.
Говоря об истории, хочется отметить небольшое, но очень полезное дополнение к 11-й версии: исторические данные о частоте употребления слов. Просто получите с помощью функции WordFrequencyData временной ряд частот употребления слов, и вы узнаете, как много людей говорили о слове «война» (или «турнепс») в разное время. Почти каждый график — это урок истории.
Еще одна удобная функция из 11-й версии — WikipediaData, которая по запросу выдает любую статью из Википедии (или различные виды данных, которые в ней содержатся). Также есть функция WolframLanguageData, которая позволяет получать вычисляемые данные о самом языке Wolfram: примеры, приведенные в документации, связи между функциями и так далее.
Во многих сферах мы в основном имеем дело со статическими данными ("Какова плотность золота?"; "Каким было население Лондона в 1959 году?"). Но есть и другие сферы, в которых интерес к статическим данным невелик. В 11-й версии есть несколько новых примеров. Например, данные о смертности людей (“Какова вероятность умереть в промежутке между возрастом X и возрастом Y?”), стандартные данные об океанах (“Какое давление на глубине X?”), данные о энергии торможения радиоактивных частиц в веществе (radioactive stopping power) и данные о росте человека — а также сведения о всей Вселенной согласно стандартной космологической модели.
Кроме того, в 11-й версии появляются такие функции, как WeatherForecastData (предсказание погоды в любой точке мира) и MathematicalFunctionData (база данных о математических формулах, содержащая сотни тысяч математических формул, представлений функций и пр.). О, а еще данные о покемонах и много других полезных вещей.
Вычисления с реальными объектами
Одной из самых мощных возможностей Wolfram Language является его способность производить непосредственные вычисления с реальными объектами. США, или Россия, или даже ящерица, — для Wolfram Language это просто объекты, которыми можно манипулировать в качестве символьных конструкций с использованием общей символьной парадигмы языка. Сами объекты не имеют значения; они просто символы. Но их свойства могут иметь значения, скажем, вычисление свойства «Population» у entity [[USA]] даст 322 млн.
Однако давайте предположим, что мы хотим не просто взять некоторый объект (например, США) и найти значение его свойств. Скажем, вместо этого мы хотим найти объекты с определенными свойствами и значениями. Скажем, мы хотим найти 5 крупнейших стран в мире по численности населения. В 11-й версии мы можем сделать это по-новому. Вместо того, чтобы указать конкретный явный объект, мы указываем вычисление, которое неявно определяет класс объектов. Так, например, мы можем получить список 5 крупнейших по численности населения стран вот так:
TakeLargest[5] — операторная форма новой функции, работающий с самыми большими элементами в списке. Неявные объекты в конечном итоге часто используют операторные формы — как в запросах Dataset. И в некотором смысле они используют символьный характер Wolfram Language, потому что они работают с функциями, которые определяют их как данные.
Механизм объектов и свойств и неявных объектов работает для всех различных типов объектов, которые существуют в языке Wolfram. Однако начиная с 11-й версии он не ограничивается встроенными типами объектов. Новая конструкция, которая называется EntityStore, позволяет определять собственные типы объектов, а также указывать их свойства и значения и так далее, а затем использовать их в любых вычислениях.
Подобно тому, как Dataset является мощным иерархическим обобщением типичных понятий баз данных, EntityStore является своего рода символическим обобщением типичной реляционной базы данных. И если вы создали сложный объект EntityStore, вы можете просто использовать функцию CloudDeploy, чтобы развернуть его в облаке и использовать, когда захотите.
Передовые возможности географических вычислений и визуализаций
География — один из аспектов «знаний о реальном мире». Но Wolfram Language не просто имеет доступ к подробным географическим данным (для Земли, Луны, Марса и даже Плутона); он может также осуществлять вычисления с этими данными. В его арсенале — колоссальная коллекция мгновенно вычислимых гео проекций и все настройки для поддержки детальной геодезии. Помните сферическую тригонометрию? Wolfram Language не только знает, что Земля представляет собой сферу, но и, используя фактическую форму Земли, правильно вычисляет расстояния, строит области и так далее на карте с произвольными проекциями.
Если говорить о создании карт, то Wolfram Language теперь имеет доступ не только к карте улиц всего мира, но и к таким вещам, как исторические границы стран, а также к спутниковым снимкам, — с низким разрешением (как минимум). С учетом карт улиц появляется новый важный класс возможных вычислений: туристических направлений (и времени поездки) откуда угодно и куда угодно.
Не забудем про сложные задачи математического анализа и теоретической физики...
В 11-й версии во всех областях Wolfram Language появилось много новых возможностей. Однако они доступны теперь и в сферах, традиционных для Mathematica, — например, математического анализа.
Например, есть функции (вроде DEigenvalues) для работы с собственными числами и функциями дифференциальных операторов для обыкновенных дифференциальных уравнений и уравнений в частных производных. Чтобы сделать это возможным, необходим огромный стек алгоритмических технологий, и мы уже более 25 лет движемся в эту сторону. Важно, что это не тот случай, когда необходимо ставить ту или иную задачу с помощью детально проработанных знаний численного анализа. Здесь вы определяете только уравнения и их граничные условия — и система автоматически выясняет, как их решить.
Еще в 1976 году я написал программу на Fortran, предназначенную для поиска собственных функций уравнения Шредингера для физики элементарных частиц, которую я изучал. В 1981 году я писал программы на C, чтобы сделать то же самое для некоторых уравнений релятивистской квантовой механики. Я терпеливо ждал того дня, когда я смогу просто вбить эти задачи и сразу же получить ответы. И сейчас это стало возможным.
Конечно, в 11-й версии все это носит гораздо более общий характер. Я имел дело с простыми граничными условиями; но в 11-й версии для того, чтобы настроить граничные условия, можно использовать весь геометрический подъязык Wolfram Language — и все данные, которые нам доступны. Так что найти собственные поверхности «барабана» любой формы — например, в форме США, — совсем несложно.
В данном случае у нас нет никакого выбора, кроме как делать все вычисления численно. Тем не менее, в 11-й версии скоро станет возможным искать собственные числа и функции дифференциальных операторов аналитически. В 11-ю версию также добавлены некоторые новые возможности для решения в общем виде (аналитически) дифференциальных уравнений в частных производных. В частности, у нас был большой проект R&D, который подвел нас теперь к той точке, в которой мы можем найти символьное решение практически для любого дифференциального уравнения в частных производных, которое может появиться в любой научной работе или учебнике (если оно вообще имеет аналитическое решение).
Еще в 1979 году, когда я создал предшественника системы Mathematica (см. пост на Хабре "Краткая история появления Mathematica"), я составил список вещей, которые, как я надеялся, мы бы в конце концов в состоянии были бы осуществить. Один из пунктов этого списка — решение интегральных уравнений. Что ж — рад сообщить, что 37 лет спустя, мы, наконец, получили стек алгоритмических технологий, позволяющий сделать это возможным, и в 11-й версии представлены решения многих классов интегро-дифференциальных уравнений.
Есть и еще кое-что — например, построение функций Грина для дифференциальных уравнений. И, наконец, долгожданная (по крайней мере, для меня) функция интегрального преобразования Меллина (оно было моим фаворитом с тех пор, как стало центром моей статьи по физике частиц в 1977 году).
Мы вложили много сил в то, что можно назвать "современным матанализом" — те его аспекты, которые необходимы для поддержки областей вроде машинного обучения. Теперь у нас есть более эффективные и надежные методы минимизации, а также сложная байесовская минимизация, предназначенная для неконтролируемого машинного обучения.
Образование
Дифференциальные уравнения в частных производных — сложные с математической точки зрения, что отражается на применении их на практике в физике и технике и так далее. Но как насчет базовой математики, соответствующей уровню школьного образования? Что ж — в течение длительного времени Mathematica вполне охватывала этот уровень. Но, поскольку наш стек алгоритмических технологий расширился, даже для более элементарной математики стали возможны некоторые новые вещи.
В качестве одного из примеров можно привести автоматическую обработку разрывов, асимптот и т. д. на графиках функций. Так что теперь, к примеру, функция Tan[х] строится идеальным «школьным» способом, без разрывов от –∞ к +∞. В случае с функцией Tan[х] все довольно просто. Однако внутри есть некоторые серьезные алгоритмические технологии, предназначенные для работы с намного более сложными функциями.
И, кстати, в новой версии есть кое-что еще более масштабное — это функция MathematicalFunctionData: доступ к сотням тысяч отношений и свойств математических функций — в каком-то смысле это инкапсуляции многих веков математических исследований (см. пост на Хабре "Вычисляемые знания и будущее чистой математики") с целью сделать их легкодоступными для вычислений.
В последнее время мы используем Wolfram Language как способ обучения алгоритмическому
И — отчасти как дань уважения наследию языка Logo, — мы создали функцию AnglePath — своего рода промышленный масштаб “черепашьей графики (turtle graphics)”, которая может быть полезна не только для начального образования, но и для серьезного моделирования — к примеру, случайных блужданий.
Совмещение всех функций в одно целое
Одна из главных целей языка Wolfram Language — сделать так, чтобы всё легко работало совместно. А в 11-й версии есть некоторые новые примеры ее достижения.
Временные ряды, например, в настоящее время работают непосредственно с арифметикой. Таким образом, вы можете взять два временных ряда, скажем, давления воздуха, а потом просто вычесть их. Конечно, было бы проще, если бы все временные точки в серии выстроились, однако в 11-й версии это и не нужно: Wolfram Language автоматически обрабатывает нерегулярные временные ряды.
Другой пример касается единиц измерения. В новой версии статистические распределения на сегодняшний день беспрепятственно работают с единицами измерения. Таким образом, нормальное распределение может иметь не только дисперсию 2,5, но и дисперсию 2,5 метра. Все расчеты, и преобразование единиц измерения обрабатываются полностью в автоматическом режиме.
Геометрия также была интегрирована в более крупные части системы. Те вычислители, которые раньше просто брали переменные, могут теперь оперировать произвольными областями. Еще одна новая функция — ImageMesh — связывает изображения с областями: создает геометрическую сетку из любого изображения. Так, например, если вы хотите, можете сделать серьезные геометрические вычисления вашей любимой картинки с котиком.
Еще один пример: случайные объекты. RandomInteger и RandomReal — это старые функции. В 8-й версии была представлена функция RandomVariate для того, чтобы создать набор чисел, которые имеют заданное вероятностное распределение. Затем в 9-й версии появилась функция RandomFunction, предназначенная для генерации функций из случайных процессов. В 11-й версии появилось еще больше функций для работы со случайностью — я говорю о функции RandomPoint, которая создает набор точек, случайно распределенных в любой области (одно-, двух-, трехмерных и многомерных). Также появилась функция RandomEntity, которая выбирает случайный объект из встроенной базы курируемых данных, а также функция RandomWord, необходимая для исследований естественного языка; а еще это хороший способ проверить ваш словарный запас — можно выбрать слова из большого списка языков… И, наконец, в 11-й версии появилась важная новая область случайные матрицы — реализованная со всей глубиной и полнотой, которые мы сделали визитной карточкой системы Mathematica и Wolfram Language.
Визуализация
Одним из серьезных достижений Mathematica и языка Wolfram стало включение визуализации в повседневную работу. Нашей целью всегда было максимально автоматизировать и визуализировать как можно больше. И в 11-й версии представлена теперь целая коллекция новых функций автоматической визуализации.
Есть очень гибкая функция WordCloud для построения облаков из слов, которые позволяют визуализировать текст и строки. Есть функция TimelinePlot для визуализации событий во времени. Есть AudioPlot, которые могут визуализировать аудио различной длины. Есть функция Dendrogram, которая использует методы машинного обучения для демонстрации иерархической кластеризации изображений, текста или любого другого вида данных. Есть GeoHistogram для построения географических гистограмм. Функция TextStructure графически изображает грамматику английских предложений. И есть функция AnatomyPlot3D, демонстрирующая элементы человеческого тела (используя символические спецификации, поскольку нет никаких явных координат).
Что еще можно визуализировать? Есть одна вещь, которую я много визуализировал (особенно в моих работах в области фундаментальной науки) — это правила для простых программ вроде клеточных автоматов, машин Тьюринга, правил подстановки и пр. А в 11-ю версию мы добавили функцию RulePlot для автоматической визуализации правил в самых разных стилях.
Еще одна давняя проблема визуализации заключалась в автоматизации 3D распределения данных. Основная сложность заключается в том, чтобы «увидеть» объем в 3D. Но в новой версии у нас есть теперь куча функций, которые решают это по-разному, часто — делая срезы в местах, которые определяются нашей системой вычисляемой геометрии.
Еще одно важное направление автоматизации в области визуализации — маркировка. В 11-й версии доступна функция Callout, указывающая выноски для точек, линий и областей (у нас уже есть функции подписи, подсказки и так далее). Есть такой способ делать сноски — всегда помещать их, например, слева. Однако на практике это не очень удобно, потому что они начинают рано или поздно путаться. Вместо этого в 11-й версии мы сделали нечто гораздо более сложное, включающее в себя алгоритмическую выкладку сносок для достижения эстетических и коммуникационных целей.
От строк к тексту
С помощью системы Mathematica и Wolfram Language всегда можно было обрабатывать строки символов. В 10-й версии мы сделали огромный шаг вперед с введением функции Interpreter: мы использовали свои достижения в понимании естественного языка и применили их к интерпретации строк в сотнях различных областей. Ну, а в 11-й версии мы пошли еще дальше, обеспечивая разнообразие функций для масштабной обработки естественного языка и работы с текстом.
Для разбивки текста на слова и предложения есть функции TextWords и TextSentences (это позволит избежать конфузов вроде ошибок в написании «Св.Иоанн» (в оригинале — “St. John’s St.”)). Также есть функции вроде TextCases, которые позволяют автоматически выбирать различные классы естественного языка, — такие, как страны, или даты, или даже существительные или глаголы.
Довольно интересно рассматривать слова как данные: например, функция WordList дает списки различных видов слов, а WordDefinition — определения.
Есть также мультиязычные возможности. Благодаря функции Alphabet доступны почти любые алфавиты; Transliterate транслитерирует между различными системами письма. И, наконец, функция WordTranslation может переводить слова на 200 языков — прекрасный материал для любых лингвистических исследований.
Современный подход к программированию систем
Wolfram Language — язык сверхвысокого уровня. Однако в 11-ю версию мы добавили кучу возможностей для охвата низкоуровневых компьютерных систем. В первую очередь это функция ByteArray, которая может хранить и обрабатывать «сырые» последовательности байтов. Также существуют функции, которые имеют дело с сетями, — это PingTime и SocketConnect.
Также появился новый фреймворк для каналов публикации-подписки. Вы можете создать канал, а дальше Wolfram Language или внешняя система будет посылать ему данные, и вы сможете создать «приемник», который будет осуществлять какие-то действия посредством Wolfram Language, когда данные поступят. Много чего еще можно сделать с помощью этой настройки: будь то подключение к внешним сервисам или устройствам, обработка e-mail или сторонняя проверка подлинности, или даже создание своего собственного чата.
Еще одна новинка — встроенная криптография. Это исключительно символьный фреймворк, который позволяет настроить почти любой протокол, используя публичные или частные системы ключей.
Но как насчет взаимодействия с веб? Здесь также мощно проявляется символьный характер языка Wolfram Language. Так, например, он позволяет взаимодействовать с HTTPRequest и HTTPResponse как с символьными структурами. Есть еще функция URLSubmit для работы с символьно определенными функциями обработчика для обратной связи от асинхронного выполнения URL. Появилась даже функция CookieFunction, отвечающая за символьную обработку cookie.
Можно заниматься программированием систем практически на любом языке, или даже, например, в командной строке. Однако я нашел, что делать это в Wolfram Language гораздо действеннее. Скажем, вы исследуете производительность (см. пост на Хабре "Поиск ошибок в облаке с научной точки зрения: нежданное приключение CEO") компьютерной системы. Все, что вы делаете, красиво сохраняется в документе, куда вы можете добавлять комментарии и т. д. И дальше все, что вы делаете, может быть немедленно визуализировано. Или вы можете применять машинное обучение, или что угодно еще. Хотите проверить производительность сети? Используйте функцию PingTime для создания списка задержек при передаче данных; затем сделайте гистограмму, коррелирующую с другими данными.
Функция FileSystemMap, — еще одна новинка, — в состоянии обработать файловую систему как набор вложенных списков (или ассоциаций), а затем применить какую-либо функцию над ним. Так, например, вы можете взять целый каталог изображений и воспользоваться FileSystemMap, применив функции обработки изображений сразу для всех изображений.
Да, и еще одно: в 11-ю версию также включены (хотя по-прежнему помечены как экспериментальные), системы промышленного уровня для поиска текстовых документов как локально, так и в облаке.
Работа в интернете
Невероятной особенностью языка Wolfram является то, что он работает не только на desktop, но и в облаке. А в 11-ю версию мы добавили много новых облачных возможностей для работы в Интернете.
Давайте начнем с простого. Функция CloudDeploy[FormFunction[...]] позволяет немедленно создать приложение на основе форм непосредственно в Интернете. Но теперь можно сделать форму еще более сложной. Появляется много новых «умных полей», которые автоматически используют естественное понимание языка для интерпретации введенных данных. Есть также новые конструкции вроде RepeatingElement и CompoundElement, которые автоматически устанавливают поля для получения данных для списков и ассоциаций. И есть новый программируемый лингвистический интерфейс, который позволяет определить вашу собственную грамматику для того, чтобы расширить понимание естественного языка, уже встроенного в Wolfram Language.
Те формы, которые вы символьно обозначаете в Wolfram Language, могут быть довольно сложными — на несколько страниц с большим количеством взаимозависимостей и форматирования. Но в конечном счете они остаются все теми же формами, для которых вы устанавливаете свои входные данные, а затем отправляете их. В 11-й версии представлен новый фреймворк — AskFunction, который позволяет создавать более сложные взаимодействия: например, диалоговые окна, в которых вы «интервьюируете» пользователя, чтобы получить данные. В Wolfram Language весь процесс определяется символьной структурой, которая затем с помощью функции CloudDeploy сразу же становится активной в Интернете.
Цель Wolfram Language — иметь возможность легко делать сложные вещи в интернете. В 11-ю версию мы включили функцию FormPage (как в wolframalpha.com), а также GalleryView, которая позволяет создавать список изображений в Wolfram Language, а затем разворачивать его в интернете как «галерею» (как в demonstrations.wolfram.com).
Если вы хотите работать на более низком уровне — для этого есть функции URLDispatcher и GenerateHTTPResponse, которые позволяют точно определить, как веб-запросы будут обрабатываться в зависимости от ваших облачных настроек.
Кроме того, в новой версии появились такие функции, как CloudPublish и CloudShare, которые позволяют контролировать доступ к тому, что вы поместили в облако. Еще одна небольшая, но важная функция, — SourceLink, которая позволяет автоматически связывать, скажем, графическое изображение, которое вы размещаете в облаке, с документом (также в облаке), в котором оно было создано. Я думаю, что это отличный инструмент, с помощью которого каждое изображение, которое вы видите в документе, содержит ссылку на того, кто его создал. Я настаиваю на том, чтобы внутри нашей компании автоматизированные отчеты писались на Wolfram Language, и, конечно, включали бы в себя исходные ссылки, так чтобы я всегда мог получить исходные данные и анализировать их сам.
Облачные данные
Вы могли воспользоваться Wolfram Data Drop уже в 10-й версии, но теперь доступна расширенная версия, которая позволяет накапливать данные в Wolfram Cloud. Должен сказать, что я недооценивал возможности Wolfram Data Drop. Я думал (см. пост на Хабре "Wolfram Data Drop — новый сервис Wolfram Research"), что он будет использоваться в первую очередь для хранения данных от датчиков и т.п.. И, действительно, по этим направлениям продумано много приложений. Однако для Data Drop можно найти применение исключительно внутри Wolfram Language. Скажем, у вас есть веб-форма, которая работает на Wolfram Language. Вы можете обрабатывать каждый запрос, а затем забросить результат в формате Databin в Wolfram Data Drop, чтобы проанализировать все сразу.
Wolfram Data Drop создан преимущественно для накопления временных рядов данных. В 11-й версии появился и другой способ хранения данных в облаке — CloudExpression. Вы можете поместить любое выражение на Wolfram Language в облако, и оно будет там храниться, причем каждую его часть можно можно извлекать или настраивать с помощью обычных функций (например, Part или AppendTo). CloudExpression — это отличный способ хранения структурированных данных, в которых постоянно меняются детали, но сами данные при этом остаются в облаке неизменными.
То, что вы помещаете в облако, остается неизменным. В 11-й версии появилась также функция LocalObject — локальный аналог функции CloudObject, которая обеспечивает постоянное локальное хранилище на вашем компьютере, и LocalCache, которая используется для кэширования в локальном хранилище объектов.
Подключайтесь к любым внешним сервисам: Facebook, Twitter, Instagram, ArXiv, Reddit и многим другим...
С помощью Wolfram Language мы курируем множество данных, которые помещаем напрямую в Базу знаний; также мы ищем способы дополнительного получения данных — таких, как внешние API. В 11-й версии появилось много новых связей — с Flickr, Reddit, MailChimp, SurveyMonkey, SeatGeek, ArXiv и так далее.
Wolfram Language — мощное средство для развертывания собственных API. А в новой версии есть ряд механизмов аутентификации, которые поддерживаются для API: например, PermissionsKey для присвоения AppID. CloudLoggingData предоставляет максимально подробные данные о том, как обеспечивается доступ к любому API или любому другому облачному объекту.
Тот API, посредством которого вы осуществляете вызов различных сервисов в Интернете, получает данные, переданные ему через заданный URL. В 11-й версии доступен теперь новый вид API, который работает через электронную почту, а не через интернет и URL-адреса. Функция MailReceiverFunction подобна APIFunction за исключением того, что сначала она определяет адрес электронной почты, а затем любая отправленная на этот адрес почта передается в код функции MailReceiverFunction. MailReceiverFunction позволяет разделять различные части почтовых сообщений и их заголовков, а затем с помощью Wolfram Language проводить автоматизацию обработки электронной почты практически любого уровня сложности. И для людей вроде меня, которые получают огромное количество электронных писем как от людей, так и от автоматизированных систем, это довольно удобно.
WolframScript
Вы можете получить доступ к языку Wolfram через ноутбук, десктоп или облако. Вы можете получить доступ к нему с помощью отсроченных задач в облаке или через API или функцию MailReceiverFunction. Wolfram Language всегда можно было запустить из командной строки, но в новой версии стало возможным делать это, используя WolframScript.
Идея WolframScript заключается в создании очень простого, но гибкого интерфейса к Wolfram Language. WolframScript позволяет запускать на компьютере Wolfram Engine, что, в свою очередь, дает возможность запускать код из файла или непосредственно из командной строки. Это позволяет получать обратную связь в любом формате — включая текст, изображения, звуки, PDF, CDF и др. Если вы имеете дело с Unix, то вы можете использовать #!wolframscript для создания сценария, который можно назвать автономным и который будет работать с WolframScript.
Есть и еще кое-что. Вы можете настроить работу WolframScript подобно FormFunction, чтобы вытаскивать аргументы любого обозначенного вами типа (и интерпретировать, когда это необходимо). И вы также можете использовать WolframScript для вызова API, уже созданного вами в облаке.
В нашей компании мы часто используем Wolfram Language, как часть большой и распределенной системы. WolframScript обеспечивает прямой способ размещения компонент в Wolfram Language.
Новое в ядре языка Wolfram Language
Я уже рассказал обо всех видах нововведений, которые расширяют и углубляют алгоритмические возможности Mathematica и Wolfram Language. Но как насчет структуры ядра самого Wolfram Language? Конечно, мы стремимся поддерживать совместимость (хотя это несложно, учитывая тот факт, что мы и так все время сосредоточены на разработке). Но мы также хотим постепенно укреплять и шлифовать язык.
Процесс эволюции естественных языков предполагает в том числе построение новых слов из идиом. По сути, мы делаем то же самое в Wolfram Language. Мы изучаем, какие «скопления» повторных расчетов чаще всего появляются в коде Wolfram Language. Тогда мы придумываем хорошее название для этого конкретного набора вычислений и создаем новую функцию.
В начале работы над системой Mathematica я считал, что было бы классно, если бы существовали функции, которые позволяют сделать что-то с помощью идиом. Я понял, что если идиома сжимается до одной функции, из названия которой ясно, для чего она нужна, то мы получаем код, который легче читать. А тот факт, что идиомы не придется реконструировать много раз, оправдывает введение новой функции.
В течение последних нескольких лет в нашей компании активно развиваются два направления: Развитие языка (Incremental Language Development — ILD), и Согласованность & Полнота языка (Language Consistency & Completeness — LCC). Основная идея ILD — введение функций, эквивалентных идиомам. Основная идея LCC — убедиться, что и шаблонные выражения, и единицы измерений, и символьные URL поддерживаются везде, где это имеет смысл.
Так, например, стандартное дополнение ILD в 11-й версии — функция MinMax, которая возвращает минимальное и максимальное значения для данного списка (удивительно, от скольких сложностей при использовании Map она уберегает). Стандартное дополнение LCC — поддержка поиска по шаблону в ассоциациях.
В 11-й версии появилось много дополнений к основному языку. Функции вроде Cases были распространены и появились SequenceCases — поиск последовательностей вместо отдельных элементов в списке. Есть еще функция SequenceFoldList, которая похожа на FoldList за исключением того, что может вернуться к последовательности элементов любой длины. Есть еще подобная функция FoldPairList, которая обобщает FoldList и возвращает на каждом шаге результат, который отличается от достигнутого ранее. Это может показаться абстрактным, но это очень полезная операция в том случае, когда вы хотите поддерживать отдельное внутреннее состояние, продолжая принимать данные.
Еще одна новинка, которая может на первый взгляд показаться странной, — функция Nothing. Несмотря на свое название, Nothing кое-что делает: всякий раз, когда она появляется в списке, то немедленно удаляется. Это означает, что, если вы хотите избавиться от элемента списка, вы должны заменить его на Nothing.
Благодаря некоторым нововведениям пользоваться 11-й версией стало удобнее. К примеру, для функции First есть теперь второй аргумент, который говорит, что делать в том случае, если нет первого элемента, и избавляет от необходимости включать в этом случае If. Функция UpTo предназначена для отображения определенного числа объектов — вы можете задать: Take[список, UpTo[4]], чтобы получить до 4-х элементов списка, (если их меньше — то столько, сколько будет). UpTo много где поддерживается, и это сильно упрощает код.
Echo — еще одна удобная функция. Когда вы пытаетесь проследить, что происходит внутри куска кода, вам может понадобиться напечатать некоторый промежуточный результат. Echo — это функция, которая печатает, а затем возвращает напечатанное, так что вы можете использовать ее в вашем коде, не изменяя того, что делает этот код.
Трудно поверить, что можно добавить еще что-то к этому списку, однако это еще не все. Subdivide — функция, аналогичная Range за исключением того, что подразделяет диапазон на равные части. TakeLargest и связанные с ней функции обобщают функции Max и подобные, чтобы брать не только наибольшие, а n наибольших элементов списка.
Есть еще функция Groupings, структуру которой я продумывал много лет: она генерирует все возможные деревья, формируемые бинарными или другими сумматорами («Какие числа вы можете получить, расставляя в списке единиц всеми возможными способами знаки сложения Plus и умножения Times?»).
Функция Table удобна тем, что вы теперь можете задать Table[х, n], а не Table[х, {n}]. А вообще есть еще множество вещей, которые делают ядро 11-й версии Wolfram Language более элегантным и удобным в использовании.
И еще много нового...
Это был длинный пост. Однако я даже близко не описал все то новое, что появилось в 11-й версии. В интернете больше информации. Проверьте страницу Новое в системе Wolfram Language 11, или просмотрите информацию для пользователей или краткое описание новых возможностей. Смотрите также список новых функций начиная с версии 10.4 и до 11.0.
Но самое главное — начинайте пользоваться новой версией! Если вы хотите быстро (и бесплатно) повзаимодействовать с ней, запустите ее через Wolfram Open Cloud. Или просто начните пользоваться системой Mathematica 11 или 11-й версией любых других продуктов на основе Wolfram Language.
Уже некоторое время я пользуюсь тестовыми версиями, и 10-я версия для меня выглядит и ощущается как очень „старомодная“ — мне не хватает этих замечательных новых функций интерфейса, новых функциональных возможностей и маленьких удобств. Я очень доволен тем, какой получилась 11-я версия. Это еще один большой шаг на нашем 30-летнем пути развития системы Mathematica и Wolfram Language. И я рад, что самые разные люди по всему миру смогут впервые делать удивительные вещи с Mathematica 11 и другими продуктами 11-й версии Wolfram Language.
По вопросам о технологиях Wolfram пишите на info-russia@wolfram.com
Автор: Wolfram Research