Русский
Русский
English
Статистика
Реклама

Блог компании skillfactory

Перевод Абстракция ключ к простому коду

29.06.2020 12:20:00 | Автор: admin
image


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

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

Да! Есть!

Но даже если я поделюсь им с вами даже если я подробно изложу его для вас вам может потребоваться 10 лет, чтобы вырасти и полностью оценить его простоту.

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

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

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

Секрет того, чтобы быть в 10 раз более продуктивным, заключается в овладении абстракцией. Многие разработчики относятся к абстракции как к грязному слову. Вы можете услышать совет, например, не абстрагируйтесь слишком рано или знаменитое в Zen Python явное лучше, чем неявное, подразумевая, что конкретное лучше, чем абстрактное. И все это хорошие советы в зависимости от контекста.

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

Абстракция ключ к простому коду


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

Простота это вычитание очевидного и добавление значимого.
Джон Маэда: The Laws of Simplicity


Абстракция это не улица с односторонним движением. Она сформирована двумя дополнительными понятиями:

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


Рассмотрим следующий код:

const doubleList = list => {  const newList = [];  for (var i = 0; i < list.length; i++) {    newList[i] = list[i] * 2;  }  return newList;};


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

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


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

Если вы трогаете одну вещь с глубоким осознанием, вы касаетесь всего.
Тхих Нхат Хань


Используя операцию map, мы можем сократить код до однострочного, убрав очевидное (части, которые мы, вероятно, повторим в аналогичном коде), и сосредоточившись на значимом (только том, что должно отличаться для нашего использования). Пример:

const doubleList = list => list.map(x => x * 2);


Джуниор разработчики думают, что им нужно написать много кода, чтобы получить большую ценность.

Старшие разработчики понимают ценность кода, который никому не нужно было писать.

Представьте себя программистом, который популяризировал использование операции map в таких языках программирования, как JavaScript. Map абстрагируется от таких деталей, как тип данных, которые вы сопоставляете, тип структуры данных, содержащей данные, и логики итерации, необходимой для перечисления каждого узла данных в структуре данных. Это повысило эффективность каждого приложения, созданного мной за последнее десятилетие.

Джереми Ашкенас сделал несколько таких операций популярными в JavaScript и проложил путь для многих великолепных синтаксических ярлыков, которые мы теперь считаем само собой разумеющимся в JavaScript, впервые применив их в CoffeeScript. Он создал Underscore, которая породила Lodash (все еще самый популярный инструмент для функционального программирования в JavaScript) и Backbone, который популяризировал архитектуру MVC в JavaScript и заложил основу для Angular и React.

Джон Резиг сделал jQuery, который был настолько популярным и влиятельным, что он сформировал самую большую коллекцию повторно инкапсулированных модулей JavaScript (плагинов jQuery), пока через несколько лет не появились стандартные модули Node и модули ES6. API селектора jQuery был настолько влиятельным, что стал основой современного API DOM. Я почти ежедневно получаю пользу от этого API, когда я тестирую компоненты React.

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

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

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


Ключ к простоте: секрет, который мы ищем, это как уменьшить объем кода, который мы создаем, как сделать намного больше с гораздо меньшим количеством. Когда вы овладеете этим, вы станете программистом в 10 раз лучше. Я гарантирую это.



image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Учебный проект на Python интерфейс в 40 строк кода (часть 2)

03.07.2020 08:04:12 | Автор: admin
image

Демонстрация проекта Python с пользовательским интерфейсом никогда не была такой простой. С помощью Streamlit Framework вы можете создавать браузерный пользовательский интерфейс, используя только код Python. В этой статье мы будем создавать пользовательский интерфейс для программы лабиринта, подробно описанной в предыдущей статье.

Streamlit


Streamlit это веб-фреймворк, предназначенный для исследователей данных для простого развертывания моделей и визуализаций с использованием Python. Это быстро и минималистично, а также красиво и удобно. Есть встроенные виджеты для пользовательского ввода, такие как загрузка изображений, ползунки, ввод текста и другие знакомые элементы HTML, такие как флажки и переключатели. Всякий раз, когда пользователь взаимодействует с потоковым приложением, сценарий python перезапускается сверху вниз, что важно учитывать при рассмотрении различных состояний вашего приложения.
Вы можете установить Streamlit с помощью pip:

pip install streamlit


И запустите streamlit в скрипте Python:

streamlit run app.py


Варианты использования


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

Во-первых, давайте создадим пользовательский интерфейс для загрузчика изображений и возможность использовать изображение по умолчанию. Мы можем добавить вывод текста, используя такие функции, как st.write() или st.title(). Мы храним динамически загруженный файл, используя функцию st.file_uploader(). Наконец, st.checkbox() вернет логическое значение в зависимости от того, установил ли пользователь флажок.

import streamlit as stimport cv2import matplotlib.pyplot as pltimport numpy as npimport mazest.title('Maze Solver')uploaded_file = st.file_uploader("Choose an image", ["jpg","jpeg","png"]) #image uploaderst.write('Or')use_default_image = st.checkbox('Use default maze')


Результат:

image

Затем мы можем вывести наше изображение по умолчанию или загруженное изображение в пригодный для использования формат изображения OpenCV.

if use_default_image:    opencv_image = cv2.imread('maze5.jpg')elif uploaded_file is not None:    file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)    opencv_image = cv2.imdecode(file_bytes, 1)


Как только изображение загружено, мы хотим показать изображение, размеченное с начальной и конечной точками. Мы будем использовать ползунки, чтобы позволить пользователю переместить эти точки. Функция st.sidebar() добавляет боковую панель на страницу, а st.slider() принимает числово в пределах определенного минимума и максимума. Мы можем определить минимальное и максимальное значения слайдера динамически в зависимости от размера нашего изображения лабиринта.

if opencv_image is not None:    st.subheader('Use the sliders on the left to position the start and end points')    start_x = st.sidebar.slider("Start X", value= 24 if use_default_image  else 50, min_value=0, max_value=opencv_image.shape[1], key='sx')    start_y = st.sidebar.slider("Start Y", value= 332 if use_default_image  else 100, min_value=0, max_value=opencv_image.shape[0], key='sy')    finish_x = st.sidebar.slider("Finish X", value= 309 if use_default_image  else 100, min_value=0, max_value=opencv_image.shape[1], key='fx')    finish_y = st.sidebar.slider("Finish Y", value= 330 if use_default_image  else 100, min_value=0, max_value=opencv_image.shape[0], key='fy')    marked_image = opencv_image.copy()    circle_thickness=(marked_image.shape[0]+marked_image.shape[0])//2//100 #circle thickness based on img size    cv2.circle(marked_image, (start_x, start_y), circle_thickness, (0,255,0),-1)    cv2.circle(marked_image, (finish_x, finish_y), circle_thickness, (255,0,0),-1)    st.image(marked_image, channels="RGB", width=800)


image

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

После того, как пользователь определил начальную и конечную позиции, мы хотим кнопку, чтобы решить лабиринт и отобразить решение. Элемент st.spinner () отображается только во время работы его дочернего процесса, а вызов st.image () используется для отображения изображения.

if marked_image is not None:    if st.button('Solve Maze'):        with st.spinner('Solving your maze'):            path = maze.find_shortest_path(opencv_image,(start_x, start_y),(finish_x, finish_y))        pathed_image = opencv_image.copy()        path_thickness = (pathed_image.shape[0]+pathed_image.shape[0])//200        maze.drawPath(pathed_image, path, path_thickness)        st.image(pathed_image, channels="RGB", width=800)


image

Кнопка

image

Вывод решения

Вывод


Менее чем в 40 строк кода мы создали простой пользовательский интерфейс для приложения обработки изображений Python. Нам не нужно было писать какой-либо традиционный интерфейсный код. Помимо способности Streamlit переваривать простой код Python, Streamlit интеллектуально перезапускает необходимые части вашего скрипта сверху вниз при каждом взаимодействии пользователя со страницей или при изменении скрипта. Это обеспечивает прямой поток данных и быструю разработку.

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

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Практическое функциональное программирование

25.06.2020 22:10:00 | Автор: admin
image


Текст статьи взят из презентации, которую я показывал в LinkedIn в2016 году. В презентации была предпринята попытка объяснить функциональное программирование без использования таких понятий, как монады, неизменность или побочные эффекты. Вместо этого она фокусируется на том, как размышления о композиции могут сделать вас лучшим программистом, независимо от того, какой язык вы используете.

40 лет назад, 17 октября 1977 года, премия Тьюринга была вручена Джону Бакусу за его вклад в разработку систем программирования высокого уровня, прежде всего языка программирования Fortran. Всем лауреатам премии Тьюринга предоставляется возможность выступить с лекцией по выбранной ими теме в течение года, в котором они получили премию. Как создатель языка программирования Фортран, можно было ожидать, что Бакус выступит с лекцией о преимуществах Фортрана и будущих разработках в этом языке. Вместо этого он прочитал лекцию под названием Можно ли освободить программирование от стиля фон Неймана? в котором он критиковал некоторые из основных языков того времени, включая Фортран, за их недостатки. Он также предложил альтернативу: функциональный стиль программирования.

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

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

Давайте начнем с рассмотрения функции, которая действительно хорошо скомпонована:

String addFooter(String message) {  return message.concat(" - Sent from LinkedIn");}

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

boolean validMessage(String message) {  return characterCount(addFooter(message)) <= 140;}


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

Теперь давайте взглянем на функцию, которая не так хорошо скомпонована:

String firstWord(String message) {  String[] words = message.split(' ');  if (words.length > 0) {    return words[0];  } else {    return null;  }}


А затем попробуйте скомпоновать ее с другой функции:

// Hello world -> HelloHelloduplicate(firstWord(message));


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

String duplicateBad(String word) {  if (word == null) {    return null;  } else {    return word.concat(word);  }}

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

Нулевые объекты плохо компонуются.


Давайте рассмотрим альтернативную реализацию, в которой используется тип Java 8 Optional (также называемый Option или Maybe на других языках):

Optional<String> firstWord(String message) {  String[] words = message.split(' ');  if (words.length > 0) {    return Optional.of(words[0]);  } else {    return Optional.empty();  }}


Теперь мы попытаемся скомпоновать ее с неизмененной функцией dublicate:

// "Hello World" -> Optional.of("HelloHello")firstWord(input).map(this::duplicate)


Оно работает! Опциональный тип заботится о том, что firstWord иногда не возвращает значение. Если Optional.empty() возвращается из firstWord, то функция .map просто пропустит запуск функции dublicate. Мы смогли легко объединить функции без необходимости модифицировать dublicate. Сравните это с null случаем, когда нам нужно было создать функцию duplicateBad. Другими словами: нулевые объекты плохо компонуются, а опционалы хорошо.

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

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

getData(function(a) {      getMoreData(a, function(b) {        getMoreData(b, function(c) {             getMoreData(c, function(d) {                 getMoreData(d, function(e) {                     // ...                });            });        });    });});


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

Значения легче компоновать вместе, чем функции


Давайте посмотрим на инструментарий функционального программиста чтобы найти альтернативу: Promise (иногда называемое Future на других языках). Вот как выглядит код сейчас:

getData()  .then(getMoreData)  .then(getMoreData)  .then(getMoreData)  .catch(errorHandler)


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

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

// ["hello", "world"] -> ["hello!", "world!"]List<String> addExcitement(List<String> words) {  List<String> output = new LinkedList<>();  for (int i = 0; i < words.size(); i++) {    output.add(words.get(i) + !);  }  return output;}// ["hello", "world"] -> ["hello!!", "world!!"]List<String> addMoreExcitement(List<String> words) {  return addExcitement(addExcitement(words));}


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

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

При императивном программировании вы можете получить только модульность или только производительность. С функциональным программированием вы можете иметь и то, и другое.


Ответ функционального программиста (по крайней мере, в Java 8) это Stream. Stream по умолчанию ленив, что означает, что он проходит через данные только тогда, когда это необходимо. Другими словами, ленивая функция: она начинает выполнять работу только тогда, когда ее просят о результате (функциональный язык программирования Haskell построен на концепции лени). Давайте перепишем приведенный выше пример, используя вместо этого Stream:

String addExcitement(String word) {  return word + "!";}list.toStream()  .map(this::addExcitement)  .map(this::addExcitement)  .collect(Collectors.toList())


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

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

Ответ в том, что составные примеры имеют четкое разделение между тем, что вы хотите сделать, и тем, как вы на самом деле это делаете.

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

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

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


Именно таково мое практическое определение функционального программирования. Мы хотим иметь четкое разделение проблем в наших программах. Часть что вы хотите" хороша и композиционна и позволяет легко создавать большие вещи из меньших. В какой-то момент требуется часть как вы это делаете, но, отделяя ее, мы убираем материал, который не так композиционен, от материала, который более композиционен.

Мы можем видеть это в реальных примерах:

  • API Apache Spark для выполнения вычислений на больших наборах данных абстрагирует детали того, на каких машинах он будет работать и где хранятся данные
  • React.js описывает представление и делает преобразование DOM эффективным алгоритмом

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

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод 8 трюков в Python, используемых опытными программистами

30.06.2020 18:10:31 | Автор: admin
image

Вот восемь изящных приемов Python, которые, я уверен, вы еще не видели. Примените эти приемы в своем коде на Python, чтобы сделать его более лаконичным и производительным!

1. Сортировка объектов по нескольким ключам


Предположим, мы хотим отсортировать следующий список словарей:

people = [{ 'name': 'John', "age": 64 },{ 'name': 'Janet', "age": 34 },{ 'name': 'Ed', "age": 24 },{ 'name': 'Sara', "age": 64 },{ 'name': 'John', "age": 32 },{ 'name': 'Jane', "age": 34 },{ 'name': 'John', "age": 99 },]


Но мы не просто хотим сортировать их по имени или возрасту, мы хотим отсортировать их по обоим полям. В SQL это будет такой запрос:

SELECT * FROM people ORDER by name, age


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

Чтобы добиться сортировки по имени и возрасту, мы можем сделать это:

import operatorpeople.sort(key=operator.itemgetter('age'))people.sort(key=operator.itemgetter('name'))


Обратите внимание, как я изменил порядок. Сначала сортируем по возрасту, а потом по имени. С помощью operator.itemgetter() мы получаем поля возраста и имени из каждого словаря в списке.

Это дает нам результат, который мы хотели:

[ {'name': 'Ed',   'age': 24}, {'name': 'Jane', 'age': 34}, {'name': 'Janet','age': 34}, {'name': 'John', 'age': 32}, {'name': 'John', 'age': 64}, {'name': 'John', 'age': 99}, {'name': 'Sara', 'age': 64}]


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

Источник вдохновения вопрос со StackOverflow.

2. Списковые включения (Генератор списка)


Списковые включения могут заменить уродливые циклы, используемые для заполнения списка. Основной синтаксис для списковых включений:

[ expression for item in list if conditional ]


Очень простой пример для заполнения списка последовательностью чисел:

mylist = [i for i in range(10)]print(mylist)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


И поскольку вы можете использовать выражение, вы также можете сделать некоторую математику:

squares = [x**2 for x in range(10)]print(squares)# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


Или даже вызвать внешнюю функцию:

def some_function(a):    return (a + 5) / 2    my_formula = [some_function(i) for i in range(10)]print(my_formula)# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]


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

filtered = [i for i in range(20) if i%2==0]print(filtered)# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


3. Проверьте использование памяти ваших объектов


С помощью sys.getsizeof() вы можете проверить использование памяти объектом:

import sysmylist = range(0, 10000)print(sys.getsizeof(mylist))# 48


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

import sysmyreallist = [x for x in range(0, 10000)]print(sys.getsizeof(myreallist))# 87632


Итак, поиграв с sys.getsizeof(), вы можете больше узнать о Python и использовании вашей памяти.

4. Классы данных


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

  • класс данных требует минимального количества кода
  • вы можете сравнить классы данных, потому что существует __eq__
  • вы можете легко вывести класс данных для отладки, потому что существует __repr__
  • классы данных требуют тайп хинты, что уменьшает шанс ошибок


Вот пример класса данных в работе:

from dataclasses import dataclass@dataclassclass Card:    rank: str    suit: str    card = Card("Q", "hearts")print(card == card)# Trueprint(card.rank)# 'Q'print(card)Card(rank='Q', suit='hearts')


Подробное руководство можно найти здесь.

5. Пакет attrs


Вместо классов данных вы можете использовать attrs. Есть две причины, чтобы выбрать attrs:

  • Вы используете версию Python старше 3.7
  • Вы хотите больше возможностей


Пакет attrs поддерживает все основные версии Python, включая CPython 2.7 и PyPy. Некоторые из дополнительных атрибутов, предлагаемых attrs по сравнению с обычными классами данных, являются валидаторами и конвертерами. Давайте посмотрим на пример кода:

@attrsclass Person(object):    name = attrib(default='John')    surname = attrib(default='Doe')    age = attrib(init=False)    p = Person()print(p)p = Person('Bill', 'Gates')p.age = 60print(p)# Output: #   Person(name='John', surname='Doe', age=NOTHING)#   Person(name='Bill', surname='Gates', age=60)


Авторы attrs фактически работали в PEP, которые ввели классы данных. Классы данных намеренно хранятся проще (легче для понимания), в то время как attrs предлагает полный набор функций, которые вам могут понадобиться!

Дополнительные примеры можно найти на странице примеров attrs.

6. Объединение словарей (Python 3.5+)


Начиная с Python 3.5, легче объединять словари:

dict1 = { 'a': 1, 'b': 2 }dict2 = { 'b': 3, 'c': 4 }merged = { **dict1, **dict2 }print (merged)# {'a': 1, 'b': 3, 'c': 4}


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

В Python 3.9 объединение словарей становится еще чище. Вышеупомянутое слияние в Python 3.9 может быть переписано как:

merged = dict1 | dict2


7. Поиск наиболее часто встречающегося значение


Чтобы найти наиболее часто встречающееся значение в списке или строке:

test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]print(max(set(test), key = test.count))# 4


Вы понимаете, почему это работает? Попробуйте разобраться в этом сами, прежде чем читать дальше.

Вы даже попытались, не так ли? Я все равно скажу вам:

  • max() вернет самое большое значение в списке. Аргумент key принимает функцию единственного аргумента для настройки порядка сортировки, в данном случае это test.count. Функция применяется к каждому элементу итерируемого.
  • test.count встроенная функция списка. Она принимает аргумент и будет подсчитывать количество вхождений для этого аргумента. Таким образом, test.count(1) вернет 2, а test.count(4) вернет 4.
  • set(test) возвращает все уникальные значения из test, поэтому {1, 2, 3, 4}


Итак, в этой единственной строке кода мы принимаем все уникальные значения теста, который равен {1, 2, 3, 4}. Далее max применит к ним функцию list.count и вернет максимальное значение.
И нет я не изобрел этот однострочник.

Обновление: ряд комментаторов справедливо отметили, что есть гораздо более эффективный способ сделать это:

from collections import CounterCounter(test).most_common(1)# [4: 4]


8. Возврат нескольких значений


Функции в Python могут возвращать более одной переменной без словаря, списка или класса. Это работает так:

def get_user(id):    # fetch user from database    # ....    return name, birthdatename, birthdate = get_user(4)


Это нормально для ограниченного числа возвращаемых значений. Но все, что превышает 3 значения, должно быть помещено в (data) класс.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Отмазки программистов и что они на самом деле имеют в виду

30.06.2020 18:10:31 | Автор: admin
Работа в стрессовой обстановке, несомненно, учит нас придумывать хорошие оправдания

image

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

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

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

Я не прикасался к этому коду уже несколько недель.

Да, а еще я внес несколько изменений, и теперь он не работает.

Это странная проблема. Вероятно, она больше не повторится.

А еще не прошло ни дня с момента, как я это сказал.

Это работает, но не тестировалось.

Конечно, это не работает. Ожидайте кучу багов, которые я назову аппаратными проблемами.

Я забыл закоммитить код с исправлениями.

Я до сих пор не реализовал эту функцию. Скоро вы сможете увидеть WIP-коммит.

На моей машине работает.

Черт, продакшн-код ссылается на мой локалхост. И я не прогонял специфические тест-кейсы целевой среды.

Код самодокументируемый.

Я слишком ленив, чтобы писать комментарии. Берегись, ты можешь увидеть спагетти.

Это не баг, это фича.

Вы, ребята, все это время игнорировали эту проблему. Так что теперь это фича.

Это всего лишь временное решение.

Костыль, который я написал, ужасен. И он останется навсегда. Пока опять не сломается.

Это не проблема с кодом. Необходимо дообучать наших пользователей.

Я забил на UX.

Нам нужно переписать этот код.

Здесь много легаси. И мы не понимаем как оно работает.

Это проблема с твоим кэшем.

Я понятия не имею, что такое политика no-cache.

Наверное, у вас не та версия.

Я еще не настроил непрерывную интеграцию. Сейчас быстро добавлю хотфиксы во все версии.

Это проблемы с сетью.

Дело точно не в сети. Мне нужно время, чтобы исправить эту проблему.

Проект все еще билдится.

Он билдился несколько минут назад. Оставь меня в покое, мне нужен перекур.

Этот код нарушает принципы дяди Боба...

Это не мой код. Так что, позвольте мне рассказать о нескольких принципах чистого кода, которым я никогда не следовал.

Заключение


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

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод - recovery mode Учебный проект на Python алгоритм Дейкстры, OpenCV и UI ( часть 1)

02.07.2020 20:17:59 | Автор: admin
Лабиринты это распространенная головоломка для людей, но они представляют из себя интересную задачу для программирования, которую мы можем решить, используя методы кратчайшего пути, такие как алгоритм Дейкстры.

Вспоминаем алгоритм Дейкстры


Алгоритм Дейкстры один из наиболее популярных алгоритмов теории графов. Он используется для поиска кратчайшего пути между узлами на ориентированном графе. Мы начнем с исходного узла и известных длин ребер между узлами.

Сначала мы присваиваем значение расстояния от источника всем узлам. Узел s получает значение 0, потому что это источник; остальные получают значения для начала.

image

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

image

Узел s теперь завершен (черный), а его соседи a и b приняли новые значения. Новый интересующий узел b, поэтому мы повторяем процесс ослабления соседних узлов b и финализации значения кратчайшего пути для b.

image

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

image

image

image

Наша финальная диаграмма после запуска алгоритма Дейкстры. Числа в каждом узле представляют кратчайшее возможное расстояние от исходного узла.

Концептуализация изображений лабиринта


image

Мы можем представить себе изображение как матрицу пикселей. Каждый пиксель (для простоты) имеет значение RGB 0,0,0 (черный) или 255,255,255 (белый). Наша цель создать кратчайший путь, который начинается на белом и не переходит на чёрные границы. Чтобы представить эту цель, мы можем рассматривать каждый пиксель как узел и рисовать ребра между соседними пикселями с длиной ребер, основанной на разнице значений RGB. Мы будем использовать формулу евклидова квадратного расстояния и добавим 0,1, чтобы гарантировать отсутствие длины пути 0 (требование для алгоритма Дейкстры):

image

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

image

Реализация


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

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread('maze.png') # read an image from a file usingcv2.circle(img,(5,220), 3, (255,0,0), -1) # add a circle at (5, 220)cv2.circle(img, (25,5), 3, (0,0,255), -1) # add a circle at (5,5)plt.figure(figsize=(7,7))plt.imshow(img) # show the imageplt.show()


image


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

class Vertex:    def __init__(self,x_coord,y_coord):        self.x=x_coord        self.y=y_coord        self.d=float('inf') #current distance from source node        self.parent_x=None        self.parent_y=None        self.processed=False        self.index_in_queue=None


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

def find_shortest_path(img,src,dst):    pq=[] #min-heap priority queue    imagerows,imagecols=img.shape[0],img.shape[1]    matrix = np.full((imagerows, imagecols), None)     #access matrix elements by matrix[row][col]    #fill matrix with vertices    for r in range(imagerows):        for c in range(imagecols):            matrix[r][c]=Vertex(c,r)            matrix[r][c].index_in_queue=len(pq)            pq.append(matrix[r][c])    #set source distance value to 0    matrix[source_y][source_x].d=0    #maintain min-heap invariant (minimum d Vertex at list index 0)    pq = bubble_up(pq, matrix[source_y][source_x].index_in_queue)


Нам нужно несколько вспомогательных функций, чтобы помочь найти ребра и длину ребер между вершинами:

#Implement euclidean squared distance formuladef get_distance(img,u,v):    return 0.1 + (float(img[v][0])-float(img[u][0]))**2+(float(img[v][1])-float(img[u][1]))**2+(float(img[v][2])-float(img[u][2]))**2#Return neighbor directly above, below, right, and leftdef get_neighbors(mat,r,c):    shape=mat.shape    neighbors=[]    #ensure neighbors are within image boundaries    if r > 0 and not mat[r-1][c].processed:         neighbors.append(mat[r-1][c])    if r < shape[0] - 1 and not mat[r+1][c].processed:            neighbors.append(mat[r+1][c])    if c > 0 and not mat[r][c-1].processed:        neighbors.append(mat[r][c-1])    if c < shape[1] - 1 and not mat[r][c+1].processed:            neighbors.append(mat[r][c+1])    return neighbors


Теперь мы можем реализовать алгоритм Дейкстры и присвоить значения расстояния (d) всем вершинам пикселей в изображении лабиринта:

while len(pq) > 0:    u=pq[0] #smallest-value unprocessed node    #remove node of interest from the queue    pq[0]=pq[-1]     pq[0].index_in_queue=0    pq.pop()    pq=bubble_down(pq,0) #min-heap function, see source code         u.processed=True    neighbors = get_neighbors(matrix,u.y,u.x)    for v in neighbors:        dist=get_distance(img,(u.y,u.x),(v.y,v.x))        if u.d + dist < v.d:            v.d = u.d+dist            v.parent_x=u.x #keep track of the shortest path            v.parent_y=u.y            idx=v.index_in_queue            pq=bubble_down(pq,idx)             pq=bubble_up(pq,idx)


Теперь мы можем вызвать функцию кратчайшего пути и нарисовать решение в нашем лабиринте:

img = cv2.imread('maze.png') # read an image from a file using opencv (cv2) libraryp = find_shortest_path(img, (25,5), (5,220))drawPath(img,p)plt.figure(figsize=(7,7))plt.imshow(img) # show the image on the screen plt.show()


image

image

Давайте попробуем другие лабиринты со всего Интернета.

image

image

image

image

Полный исходный код доступен на GitHub здесь.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Чеклист для проекта по машинному обучению

07.07.2020 12:09:02 | Автор: admin
image

В этом посте я собрал чеклист, на который я постоянно ссылаюсь, работая над комплексным проектом по машинному обучению.

Зачем мне вообще нужен чеклист?

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

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

Рекомендуется, чтобы каждая часть проекта проходила парадигму проверок.

Как говорит Атул Гаванде в своей книге The Checklist Manifesto,
объем и сложность того, что мы знаем, превзошли нашу индивидуальную способность правильно, безопасно и надежно предоставлять свои преимущества.
Итак, позвольте мне провести вас по этому четкому и краткому списку действий, которые уменьшат вашу рабочую нагрузку и улучшат ваши результаты

Чеклист проектов по машинному обучению


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

1. Определите проблему с точки зрения высокого уровня


Это чтобы понять и сформулировать бизнес-логику проблемы. Это должно сказать вам:

  • характер проблемы (контролируемая/неконтролируемая, классификационная/регрессионная),
  • тип решений, которые вы можете разработать
  • какие показатели вы должны использовать для измерения производительности?
  • является ли машинное обучение правильным подходом к решению этой проблемы?
  • ручной подход к решению проблемы.
  • неотъемлемые предпосылки проблемы

2. Определите источники данных и получите данные


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

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

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

3. Первоначальная разведка данных


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

Шаги:

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

4. Исследовательский анализ данных для подготовки данных


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

  • Написание функций для преобразования данных и автоматизации процесса для предстоящих пакетов данных.
  • Напишите функции для очистки данных (вменяя пропущенные значения и обрабатывая резко отличающиеся значения)
  • Напишите функции для выбора и проектирования особенностей удалите избыточные особенности, отформатируйте преобразование объектов, и другие математические преобразования.
  • Масштабирование особенностей (features) стандартизация особенностей (features) .

5. Разработайте базовую модель, а затем изучите другие модели, чтобы отобрать лучшие


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

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

6. Точно настройте свои модели из шорт-листа и проверьте наличие методов ансамбля


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

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

7. Документируйте код и сообщайте свое решение


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

  • Документируйте код, а также ваш подход ко всему проекту.
  • Создайте информационную панель, например, voila, или проницательную презентацию с визуализацией, которая не требует пояснений.
  • Напишите блог/отчет о том, как вы анализировали особенности, тестировали различные преобразования и т. д. Опишите свое обучение (неудачи и методы, которые сработали)
  • Закончите с основным результатом и будущим объемом (если таковые имеются)

8. Разверните свою модель в продакшен, мониторинг


Если ваш проект требует тестирования развертывания на реальных данных, вы должны создать веб-приложение или REST API для использования на всех платформах (web, Android, iOS). Основные пункты (будут варьироваться в зависимости от проекта) включают в себя:

  • Сохраните вашу окончательную обученную модель в файл h5 или pickle.
  • Обслуживайте свою модель с помощью веб-сервисов, Вы можете использовать Flask для разработки этих веб-сервисов.
  • Подключите источники входных данных и настройте конвейеры ETL.
  • Управляйте зависимостями с помощью pipenv, docker/Kubernetes (на основе требований масштабирования)
  • Вы можете использовать AWS, Azure или Google Cloud Platform для развертывания своего сервиса.
  • Делайте мониторинг производительности на реальных данных или просто для людей, чтобы они могли использовать вашу модель со своими данными.

Примечание. Чеклист может быть адаптирован в зависимости от сложности вашего проекта.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Интерактивная визуализация данных при помощи Plotly строим красивые графики с Express и Cufflinks

25.06.2020 22:10:00 | Автор: admin
image


Если Вы все еще используете Matplotlib для создания графиков в Python, самое время взглянуть на мир с высоты альтернативной библиотеки интерактивной визуализации.

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

Вот камни преткновения, которые могут появиться на пути авантюристов, решивших покорить эту гору:

  • непонятная начальная настройка для работы оффлайн без аккаунта;
  • неимоверное количество строк кода;
  • устаревшая документация;
  • множество различных инструментов Plotly, в которых можно заблудиться (Dash, Express, Chart Studio и Cufflinks).

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

Plotly


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

Plotly.py основывается на JavaScript-библиотеке D3.js. Также в Plotly есть API-обертки для R, Julia и многих других языков программирования. Стоит отметить, что документация представлена не на всех языках.

image

Примеры библиотек от Plotly

В этой статье мы остановимся на опциях, которые используют Python. Я использую Python 3.7 и последующие версии библиотеки в данном руководстве.

cufflinks                0.15jupyterlab             0.35.5plotly                   3.8.1     plotly-express       0.1.7


Убедитесь, что используется cufflinks 0.15 (0.13 не очень дружит с последними обновлениями Plotly).
ПРАВКА (май 2020): самая свежая версия Plotly 4.7.1. Большая часть представленных ниже инструкций все так же применима к последней версии программы. Обратите внимание, что экспресс-модуль импортируется как часть пакета Plotly.

plotly.py


Несмотря на то что написано в некоторых инструкциях, создавать аккаунт для пользования Plotly не нужно, как и не нужно работать в онлайн-режиме.

Установите простой модуль plotly.py с conda или воспользуйтесь pip install plotly.

Импортируйте модуль и сконфигурируйте его для использования в оффлайн-режиме:

import plotly.offline as pypy.init_notebook_mode(connected=False)


Теперь программа не будет требовать у Вас создать аккаунт. Так мы и преодолели первую преграду на пути к вершине горы Plotly.

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

image

Ниже представлено объемное описание кода, адаптированного из документации, необходимой для создания такого витиеватого графика.

import pandas as pdimport numpy as npimport plotly.offline as pyimport plotly.graph_objs as goimport jsonpy.init_notebook_mode(connected=False)izip = zipdf = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/globe_contours.csv')df.head()contours = []scl = ['rgb(213,62,79)','rgb(244,109,67)','rgb(253,174,97)',\       'rgb(254,224,139)','rgb(255,255,191)','rgb(230,245,152)',\       'rgb(171,221,164)','rgb(102,194,165)','rgb(50,136,189)']def pairwise(iterable):    a = iter(iterable)    return izip(a, a)i=0for lat, lon in pairwise(df.columns):    contours.append( dict(        type = 'scattergeo',        lon = df[lon],        lat = df[lat],        mode = 'lines',        line = dict(            width = 2,            color = scl[i]        )    ) )    i = 0 if i+1 >= len(df.columns)/4 else i+1    layout = dict(        margin = dict( t = 0, l = 0, r = 0, b = 0 ),        showlegend = False,                 geo = dict(            showland = True,            showlakes = True,            showcountries = True,            showocean = True,            countrywidth = 0.5,            landcolor = 'rgb(230, 145, 56)',            lakecolor = 'rgb(0, 255, 255)',            oceancolor = 'rgb(0, 255, 255)',            projection = dict(                 type = 'orthographic',                rotation = dict(lon = 0, lat = 0, roll = 0 )                        ),            lonaxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            ),            lataxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            )        )    )sliders = []lon_range = np.arange(-180, 180, 10)lat_range = np.arange(-90, 90, 10)sliders.append(     dict(        active = len(lon_range)/2,        currentvalue = {"prefix": "Longitude: "},        pad = {"t": 0},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lon', i]} for i in lon_range]    )      )sliders.append(     dict(        active = len(lat_range)/2,        currentvalue = {"prefix": "Latitude: "},        pad = {"t": 100},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lat', i]} for i in lat_range]    )      )projections = [ "equirectangular", "mercator", "orthographic", "natural earth","kavrayskiy7",                "miller", "robinson", "eckert4", "azimuthal equal area","azimuthal equidistant",                "conic equal area", "conic conformal", "conic equidistant", "gnomonic", "stereographic",                "mollweide", "hammer", "transverse mercator", "albers usa", "winkel tripel" ]buttons = [ dict( args=['geo.projection.type', p], label=p, method='relayout' ) for p in projections ]annot = list([ dict( x=0.1, y=0.8, text='Projection', yanchor='bottom',                     xref='paper', xanchor='right', showarrow=False )])# Update Layout Objectlayout[ 'updatemenus' ] = list([ dict( x=0.1, y=0.8, buttons=buttons, yanchor='top' )])layout[ 'annotations' ] = annotlayout[ 'sliders' ] = slidersfig = dict( data=contours, layout=layout )py.iplot( fig)

Не уверена, как этот пример сюда запихнуть, не размазав его по нескольким страницам.

Главное, почему стоит избегать работы с ванильным модулем plotly.py, громоздкость данных. Процесс вбивания кода выходит очень длительным и часто приводит к ошибкам. К счастью, из данной ситуации есть два выхода.

Если нам все же не удалось свернуть с тропинки ploty.py, то придется порыться в конструкторе. Официальная документация выглядит красиво, но часто все равно приходится часами копаться на других сайтах в поисках подходящего способа пофиксить код. У Plotly есть свой форум с неплохими советами, но многие образцы кодов не обновлены и не работают в версии 3.0. Поэтому ищите сразу образцы, совместимые с последней версией, или придется переводить их вручную.

Следующие два продукта от Plotly, на которые мы обратим внимание, предлагают высокоуровневые обертки, упрощающие программный интерфейс plotly.py. Они помогут сэкономить время, если вы работаете с библиотекой Pandas. Давайте рассмотрим их поподробнее.

Express


Модуль Plotly Express был выпущен в марте 2019 года и находится в процессе активной разработки. Компания работает над созданием условий поддержки новых графиков и собирается выпустить Plotly 4.0 летом 2019 года.

Express позволяет уменьшить код, необходимый для создания датафреймов Pandas в 10 раз. Загружать свою таблицу нужно в виде опрятных данных, где каждый столбец соответствует одной переменной, а каждая строка одному наблюдению.

Установите Express с помощью pip install plotly_express.

Чтобы использовать эту библиотеку в записной книжке Jupyter, введите следующий код в командную строку:

jupyter labextension install @jupyterlab/plotly-extension

Данный код позволит создать гистограмму из таблицы с традиционным Express импортом:

import plotly_express as px         px.bar(my_df, x='my_x_column', y='my_y_column')


Вуаля! Вы получили гистограмму по данным таблицы (вставьте свои значения там, где у меня в коде дано my_.

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

px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title")


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

_my_fig = px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title')_my_fig.data[0].update(    text=my_df['my_y_column'],      textposition='inside',    textfont=dict(size=10))_my_fig.iplot()


Внимание: я нашел документацию Express! Она не отобразилась у меня на первой странице поиска в гугле, поэтому я не сразу смог ее прикрепить. Теперь она есть. Всегда пожалуйста!
Express позволяет быстро создавать разного вида диаграммы, но доступны могут быть не те, что Вам требуются. Например, нормальную гистограмму с накоплением вы сейчас врядли сможете собрать. А если очень надо, то придется подниматься в гору по другой тропинке в этот раз с Cufflinks.

Cufflinks


Cufflinks очень похож на Express тем, что является оберткой интерфейса Plotly, позволяющей упростить работу с Pandas. Cufflinks сторонняя программа с открытым исходным кодом, которая существует уже более четырех лет.

Установите ее с помощью pip install cufflinks.

Импортируйте модуль и настройте файл для автономного использования.

import cufflinks as cfcf.set_config_file(offline=True)


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

image

Пример гистограммы с накоплением, созданной с помощью Cufflinks.

А вот и сам код:

df = pd.DataFrame(np.random.rand(6, 3), columns=['A', 'B', 'C'])df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data')


Обратите внимание, что для создания диаграмм с помощью Cufflinks Вам нужно использовать .iplot().

Как и Express, Cufflinks возвращает исходные данные, чтобы Вы могли вносить мелкие поправки. Но в отличие от Cufflinks, Вам нужно уточнить переменную asFigure=True, чтобы вернуть информацию. После этого можно обновить график точно так же, как в Express. Вот как это будет выглядеть, если Вы захотите изменить название и диапазон осей.

my_fig = df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data', asFigure=True)_fig.layout.yaxis = dict(title='Members', range=[0, 600])

Вот документация Cufflinks.

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

Сравнение трех вариантов


Далее Вы можете наблюдать сравнение кода со схожей структурой для графиков, созданных с помощью plotly.py, Express и Cufflinks.

plotly.py


image

Пример диаграммы рассеяния, выполненной с plotly.py

fig = {    'data': [        {            'x': df2007.gdpPercap,             'y': df2007.lifeExp,             'text': df2007.country,             'mode': 'markers',             'name': '2007'},    ],    'layout': {        'title': "Example Scatter Plot with Vanilla plotly.py"    }}py.iplot(fig)


Express


image

Пример диаграммы рассеяния, выполненной с Plotly Express

px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express')


Выглядит просто и лаконично! Форматирование по умолчанию немного отличается, а названия осей генерируются автоматически. Теперь предлагаю взглянуть на тот же график в Cufflinks.

Cufflinks


image

Пример диаграммы рассеяния, выполненной с Cufflinks

df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     title='Example Scatter Plot with Cufflinks')


Код похож на Express, но у графика немного другие значения по умолчанию. Определенно, с Express и Cufflinks Вам не придется часами выстукивать коды, что особенно важно при создании более сложных графиков.

Давайте посмотрим, как можно вернуть и обратиться к основной информации.

Обновление графиков Cufflinks и Express


Давайте перейдем к макету графика, созданного с Cufflinks, и добавим названия осей.

image

Пример диаграммы рассеяния, выполненной с Cufflinks Доступ к исходному графику

fig = df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     asFigure=True,    title='Example Scatter Plot with Cufflinks - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вот как сделать то же самое с Express. Не забывайте, что в данной библиотеке не нужно уточнять asFigure=True.

image

Пример диаграммы рассеяния, выполненной с Plotly Express Доступ к исходному графику

fig = px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вы можете обратиться к исходным данным, чтобы добавить текстовые метки следующего вида:

fig.data[0].update(text=df2007['gdpPercap'],textposition=inside,textfont=dict(size=10))


Что выбрать: Plotly.py, Express или Cufflinks


Выбирать всегда сложно. Один раз я думал, что работал над частью проекта в Express, а потом понял, что это был Cufflinks!

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

К сожалению, ни один высокоуровневый API на данный момент не дает возможность создавать графики любого типа. Однако лично я точно постараюсь максимально избегать использования ванильного python.py и предпочту Cufflinks или Express.

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

Форматирование по умолчанию у двух библиотек может сильно отличаться. Например, создав датафрейм со случайными данными для столбцов X, Y и Z и используем следующий код, в Cufflinks мы получим следующую диаграмму:

df.iplot(kind=scatter, mode=markers, x=X, y=Y, title=Random Data, categories=Z)


image

Диаграмма рассеяния по умолчанию с Cufflinks

А вот что мы получим с Express-кодом:

px.scatter(df, x=X, y=Y, color=Z, title=Random Data)


image

Другие пресеты с Express

Заметная разница!

Сохранение файлов


Закончив работы с диаграммой, Вы можете навести на нее мышку и щелкнуть по значку камеры, чтобы экспортировать ее в формате .png, или нажать Экспортировать в plot.ly, чтобы сохранить интерактивное изображение на сервер Plotly. Помимо этого, Вы можете скачать файлы в интерактивном HTML-формате следующим образом:

py.offline.plot(my_fig, filename=my_example_file.html)


Если нужны другие форматы изображения, Вы можете воспользоваться пакетом orca и скачивать файлы в форматах .png, .jpg и .pdf. Данный пакет на данный момент недоступен на pypi.org, поэтому установить его с помощью pip не получится. Вы можете управлять пакетом с помощью conda или установить ОС-специфичную версию orca со страницы GitHub. После этого Вам не нужно будет импортировать библиотеку orca. Узнать больше о программе orca можно здесь.

Вот код для создания png-файла после установки orca:

import plotly as plotlyplotly.io.write_image(fig, file='my_figure_file.png', format='png')


Как видите, вытянуть свои графики из Plotly можно несколькими разными способами.
Предлагаю кратко пробежаться по еще двум компонентам экосистемы Plotly, чтобы Вы поняли что есть что.

Dash


С Plotly Dash Вы можете создавать дашборды для своей команды или для других людей. Есть версия с открытым кодом доступа, у которой к 1 мая 2019 года насчитывалось практически 9000 звезд GitHub. Plotly также предлагает целый ряд дополнений. Может, в будущем я напишу статью и об этом. Подписывайтесь, чтобы не пропустить.

Chart Studio


Plotly Chart Studio позволяет легко создавать и редактировать графики в браузере. Plotly рекламирует данную программу как самый умный редактор для создания D3.js- и WebGL-диаграмм. Не надо ничего кодировать вручную. Есть бесплатная версия, но если хотите сохранить свои графики, то придется отдать 99$ за год использования.

А теперь, когда мы уже добрались до вершины Plotly, давайте быстро пробежимся по другим горам визуализации данных в диапазоне Python.

Бонус: другие варианты библиотек визуализации данных от Python


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

image

Хотите делать графики по старинке обратитесь к ванильной библиотеке Matplotlib API.

image

Pandas Matplotlib позволяет создавать неплохие простенькие графики. Может создавать стандартные Matplotlib объекты.

image

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

image

Bokeh конкурент Plotly. Программа с открытым исходным кодом, интерактивная, работает с Python.

image

Holoviews высокоуровневая обертка, работающая с Matplotlib, Bokeh, а теперь и с Plotly. Знаю ребят, которые пользуются именно ей.

image

Специалистам, работающим с языком R, нравится использовать Shiny от RStudio. Оно позволяет пользователям R создавать интерактивные визуализации для веб-приложений.

image

Tableau и Microsoft PowerBI две популярные опции с системой перетаскивания данных визуализации, которые работают с Python. Tableau очень даже хорошая библиотека, но за нее придется заплатить, если не хотите, чтобы Ваша работа была в открытом доступе.

image

На мой взгляд, PowerBI обладает менее интуитивно понятным интерфейсом, но программа все равно очень мощная и популярная.

Большинство ПО для создания интерактивных графиков используют библиотеку D3.js. Она очень популярна.

Выводы и полезные ресурсы


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

Возможно, когда-нибудь появится универсальная библиотека, позволяющая создавать все, что захотите, используя высокоуровневые API-опции Plotly. А пока, если хотите сэкономить время и сделать крутые графики, предлагаю обращаться к Pandas с Cufflinks или Express.



Совет: когда используете в графиках цвет, не забывайте про людей с дальтонизмом. Воспользуйтесь палитрой, удобной для дальтоников. Я использую палитру от ggplot.

image

Образец цветов

color_list = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#D55E00", "#0072B2",  "#CC79A7"]


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Математические расчёты, стоящие за феноменом роллинг-шаттера

03.07.2020 18:07:41 | Автор: admin
image


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

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

Первый пропеллер совершает 1/10 часть вращения во время экспозиции:

image


Подписывайтесь на каналы:
@Ontol самые интересные тексты/видео всех времен и народов, влияющие на картину мира
@META LEARNING где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)


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

image


Это уже похоже на ту картинку, что мы видели в начале. Пять раз за экспозицию:

image


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

image


Пропеллер с большими лопастями:

image


Колесо автомобиля:

image


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

image


Пусть изображение будет I(r,), реальный (вращающийся) объект будет f(r,), где (r,) это 2D полярные координаты. Мы выбрали полярные координаты для этой задачи из-за вращательного движения объектов.

Объект вращается с угловой частотой , а шаттер перемещается по изображению со скоростью v по вертикали. В положении (r,) на картинке, дистанция, которую прошел шаттер с начала экспозиции, равна y=rsin, где прошедшее с этого момента время равно (rsin)/v. За это время объект повернулся на (/v)rsin) радианов. Итак, мы получаем

I(r,)=f(r,+(/v)rsin),

что и является требуемой трансформацией. Коэффициент /v пропорционален числу вращений за экспозицию и параметризует трансформацию.

Чтобы получить более глубокое представление об очевидных формах пропеллеров, мы можем рассмотреть объект, состоящий из P пропеллеров, где f является ненулевым только для

=2/P,4/P2=2p/P для 1<p<P.

Изображение I является ненулевым для +(/v)rsin=2p/P или

image

В Декартовой системе координат оно становится

image

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

image


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

image


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

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

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

image


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

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

image


image


К сожалению, картинка не идеальна, но по крайней мере очень приближена к реальности.

Об авторе: Джейсон Коул аспирант из Лондона, который горит математикой, физикой и визуализацией данных. Здесь его вебсайт. А статья была опубликована здесь.

Обсуждение на Hacker News

доп. видео









Подписывайтесь на каналы:
@Ontol самые интересные тексты/видео всех времен и народов, влияющие на картину мира
@META ОБУЧЕНИЕ, где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Бенуа Мандельброт на TED Фракталы и искусство изломов

04.07.2020 18:11:54 | Автор: admin
image

Большое спасибо. Прошу прощения за то, что я сижу. Я очень старый человек.

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

Есть много видов беспорядка. Так вот, по чистой случайности много лет назад я стал заниматься этой формой усложнения, и, к моему полному удивлению, я нашёл признаки, и, должен сказать, весьма чёткие признаки порядка в изломах. А потому сегодня я хотел бы представить вам несколько примеров того, что это значит. Я предпочитаю слово изломанность слову неровность потому, что для того, кто изучал латынь, как и я в своей далёкой молодости, неровность это противоположность ровности. Но ведь это не так.

Ровность есть противоположное к изломанности, потому что мир по большей части предстаёт нам как полный изломов.

Позвольте показать вам пару объектов. Некоторые их них созданы искусственно. Прочие весьма реальны, в определённом смысле. Вот это реальная вещь.

image

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

В связи с изучением этой проблемы я обнаружил нечто совершенно удивительное: изломанность можно измерить числом, скажем, 2,3 или 1,2, а иногда и намного большим. Однажды, один мой друг принёс фотографию и, полушутя, спросил: Каков излом у этой кривой? Я сказал: Чуть меньше, чем полтора Как оказалось, он был равен 1,48. Это не заняло у меня много времени, поскольку я так долго изучал эти вещи. Числа, о которых идёт речь, означают степень изломанности поверхности.

image

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

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

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

image

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

Так в чём же от этого польза? Удивительно и даже поразительно, но анатомы плохо себе представляли структуру лёгкого вплоть до недавнего времени. Думаю, мои математические исследования, как ни удивительно, оказали большую помощь хирургам, занятым изучением лёгочных заболеваний, а также болезней печени, где имеются подобные ответвляющиеся системы с отсутствием понятной геометрии. Иными словами, мне пришлось создавать геометрию того, что не имеет своей геометрии. Обнаружилось удивительное качество: очень часто правила этой геометрии являются чрезвычайно краткими. Начинаешь с недлинных формул, применяешь их несколько раз, иногда повторно, снова и снова. Тот же повтор. И в конце концов получается нечто такое.

image

Это облако полностью искусственное, на 100%. Ну ладно, на 99,9%. Единственный естественный элемент тут число, изломанность облака это число взято у природы. Такая сложная вещь, как облако, такая неустойчивая, изменчивая, подчиняется простому правилу. Это простое правило не есть объяснение облачности. Но море облаков должно учитывать это правило. Не знаю, насколько совершенны эти старые фотографии. Я интенсивно занимался этим, но потом моё внимание было направлено на другие явления.

А вот ещё одна довольная любопытная вещь. Одно из революционных событий в истории математики, недостаточно оцененное многими, произошло примерно 130 лет назад, 145 лет назад. Математики начали создавать несуществующие формы. Среди математиков стало цениться, причём в совершенно невообразимой степени, умение человека создать то, чего в природе никогда не было. В частности, они смогли изобрести кривую, которая заполняет всю плоскость до последней точки. Кривая это кривая, плоскость это плоскость, и эти два понятия не стыкуются. Оказалось, что всё-таки стыкуются.

image

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

image

Само по себе, это история. Это было в период с 1875 по 1925, удивительное время, когда математика готовилась оторваться от реального мира. Иллюстрацией разрыва, со времен моего детства и моих студенческих лет, разрыва между математикой и видимой реальностью служили определённые объекты. Однако мне удалось их переосмыслить, поставить с ног на голову, и с их помощью описать некоторые аспекты усложнённости природы.

image

В 1919-м году человек по имени Хаусдорф определил число, которое можно было считать математической шуткой. Но я обнаружил, что это число хороший инструмент измерения изломанности. Когда я впервые рассказал об этом моим коллегам, они сказали: Не занимайся глупостями. Это же нечто На самом деле я не занимался глупостями.

image

Великий художник Хокусай прекрасно знал это. В нижней части картины водоросли. Хокусай не владел нужной математикой: её тогда просто не существовало. Кроме того, будучи японцем, он [в те времена] не имел контактов с Западом. Но художественное искусство с давних времен содержит фрактальные элементы. Об этом я могу говорить долго.

image

Эйфелева башня имеет фрактальные элементы. Я прочитал книгу Эйфеля о его башне объём его понимания просто потрясающий.

image

Вот беспорядок внутри беспорядка. Броуновская петля. Однажды я решил, что прошла немалая часть моей профессиональной жизни, и столько разного занимало меня, что я решил, что пора бы испытать себя. Могу ли я исследовать объект, который все уже давно исследуют, и найти в нём что-либо радикально новое? Я стал изучать всё, что входит в категорию Броуновского движения. Пытался подойти с разных сторон, пробовал различные методы, и вернулся к тому, с чего начал. Тогда я предложил своему ассистенту: Я тут ничего не вижу. Сможешь закрасить? Он так и сделал, то есть заполнил все внутренности. У меня получилось

image

Но я закричал: Стоп! Стоп! Стоп! Понял: это остров. Удивительно. Броуновское движение имеет изломанность равную двум. Измеряю, получается 1,33. Измеряю заново и заново. Долгие замеры, большие Броуновские движения. Опять: 1,33. Тут же возникает математическая проблема: как это доказать? Моим друзьям для этого понадобилось 20 лет. У троих доказательства были неполные. Они соединили усилия, и вместе им удалось получить доказательство. В результате они удостоились известной [Филдсовской] медали для математиков. В целом, математики получили три медали [Филдса] за доказательство фактов, которые я видел, но не мог доказать.

Сейчас меня всюду спрашивают: Как это всё началось? Как ваши занятия привели вас к таким необычным вещам?

image

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

image

У меня возникла теория, и я написал об этом книги.

image

Движения цен финансовых инструментов Слева вам видны данные за длительный период, справа же, наверху, данные согласно очень и очень модной теории. Это крайне просто и об этом можно очень быстро написать массу книг. (Смех) На эту тему есть тысячи книг. Теперь сравните с реальными движениями цен. И где же они? Дополнительные линии включают реальные движения цен, а также небольшую подделку с моей стороны. Основная идея там состояла в том, что надо уметь делать Как это называется? моделирование колебаний цен. Это прекрасно срабатывало 50 лет назад.

image

В течение 50 лет к моей идее относились с насмешкой, потому что можно было делать проще. Но сейчас, скажу я вам, ко мне стали прислушиваться. (Смех) Эти две кривые представляют средние значения. Синяя индекс Standard and Poors [S&P 500], а красная индекс Standard and Poors, из которого вычтены 5 крупнейших скачков цен. Скачок, безусловно, портит анализ, и во многих исследованиях он считается [не поддающимся анализу] особым случаем. Невероятное совпадение, вмешательство Господа. Ну, мелочь, её можно просто отложить в сторону. Вмешательства Господа на этом графике, а их ровно пять, как оказалось, так же важны, как и всё остальное. Иными словами, вмешательства Господа нельзя откладывать в сторону.

image

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

image

Теперь я перейду к последней теме множество, названное моим именем. В некотором смысле, это история моей жизни. Моё отрочество прошло во Франции, оккупированной в те годы Германией. Поскольку я думал о том, что в любой момент меня может не стать у меня были большие мечты. После войны я вновь встретился с дядей. Мой дядя был выдающимся математиком и он сказал: Вот тебе задача. 25 лет назад я не смог решить её, и никто её не может решить. Это построение одного математика по имени Гастон Джулиа и другого по имени Пьер Фату. Если сможешь найти тут нечто новое, всё что угодно, считай, что твоя карьера обеспечена. Очень просто. Я стал изучать эту проблему, и, как и тысячи тех, кто до меня это пытался с делать, ничего не добился.

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

image

Эта имеет исключительную сложность. В ней скрыто уравнение: z трансформируется в z ^ 2 + c. Так просто и скучно, так неинтересно. Теперь прокрутим это один раз, два раза Два раза достаточно. О чудо! Появляется вот что. Я не собираюсь объяснять здесь эти вещи, но получается вот что и вот что.

image

image

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

image

И всё из этой короткой формулы, в которой всего сколько там? пять значков. И вот что в результате.

image

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

В 1990-м году я был в Великобритании, в Кембридже, мне там от университета вручали приз. Спустя три дня один лётчик, пролетая над полем, увидел вот это.

image

Откуда бы такая вещь? Ясное дело от пришельцев.

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

image

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

Translated by Namik Kasumov
Reviewed by Ekaterina Tsvetkova




image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Ник Бостром Как уничтожить цивилизацию

05.07.2020 12:20:18 | Автор: admin
image

Крис Андерсон: Ник Бостром, Вы уже делились с нами своими безумными идеями. Пару десятилетий назад, как мне помнится, вы предположили, что мы будем жить в симуляции или мы уже в ней. А относительно недавно вы представили самый наглядный пример того, как может навредить всеобщий искусственный интеллект. И уже в этом году вы собираетесь издавать книгу с самыми уязвимыми мировыми гипотезами. И сегодняшний выпуск должен стать иллюстрированным руководством к ней. Давайте начнём. Что это за гипотезы?

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

КА: То есть, вы определяете этот шар как причину гибели цивилизации.

НБ: Пока мы не выйдем из своего стандартного состояния полуанархии, как я это называю.

КА: В качестве доказательства вы приводите несколько контрпримеров. Вы убеждены, что нам везло на протяжении многих лет. И возможно мы, сами того не подозревая, уже вытянули этот шар смерти. Также вы приводите цитату. Что она означает?

НБ: Она только показывает, насколько сложно предусмотреть все последствия базовых открытий. У нас нет такой возможности. Мы хорошо научились вытаскивать шары из урны, но не умеем возвращать их обратно. То есть, мы можем изобретать, но не наоборот. В качестве стратегии у нас есть только надежда на то, что в урне нет шаров чёрного цвета.

КА: Однажды мы его вытащим и не сможем вернуть обратно, и вы считаете нам пока везло. Прокомментируйте примеры, где вы упоминаете несколько типов уязвимости.

image

НБ: Самый простой тип для понимания технология, которая сможет без особого труда вызвать много массовых разрушений. Синтетическая биология может стать богатым источником чёрных шаров подобного рода. Также стоит задуматься о продуктах геоинженерии. Мы можем бороться с глобальным потеплением, но не нужно облегчать себе задачу. Не нужно, чтобы случайный человек и его бабушка имели возможность радикальным образом изменить климат на земле. Или смертоносные беспилотные дроны размером с комара, которые массово производят для уничтожения вредителей Нанотехнологии, всеобщий искусственный интеллект.

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

НБ: Вернёмся в 30-е годы ХХ века, когда мы впервые достигли прогресса в ядерной физике. Некоторые выдающиеся учёные выяснили, как создать цепную ядерную реакцию и потом довели её до бомбы. Мы провели исследование. Выяснилось, что для создания атомной бомбы, содержащей в огромном количестве уран и плутоний, которые получить довольно трудно, нужны ультрацентрифуги, нужны реакторы, а также большое количество энергии. Мы предполагаем, что вместо этого существует более лёгкий способ высвободить энергию из атома. А что, если окажется возможным вызвать ядерный взрыв из песка в микроволновке или более простым способом. Сейчас это невозможно с точки зрения физики. Но пока не проведены такие опыты, как узнать, что из этого выйдет?

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

НБ: Да, если бы существовало что-то, созданное специально, а не само по себе. Так мы делаем многое. Мы можем уложить 10 блоков друг на друга, но в природе такого не встретишь.

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

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

КА: Есть другой тип уязвимости. Расскажите о нём, пожалуйста.

image

НБ: Помимо простых для понимания чёрных шаров, которые снесут всё на своем пути, другие будут создавать людям стимул для совершения плохих поступков и причинение вреда. То есть, если подумать о так называемом Типе-2а, то это технология, которая подвигнет великие мировые державы на использование всей своей военной мощи для разрушения. На самом деле, ядерное оружие очень близко к этому, да? Что мы сделали: мы потратили более 10 триллионов долларов на создание 70 тыс. ядерных боеголовок и держим их в состоянии повышенной боевой готовности. Во время Холодной войны мы несколько раз были на грани взаимоуничтожения. Не потому, что люди считают замечательной идеей спустить 10 миллионов долларов на самоуничтожение. Стимулировало то, что мы только ищем себя, и это могло быть худшим. Представьте, если бы первый удар прошёл без особых последствий, то было бы очень сложно в кризисной ситуации воздержаться от запуска всех ядерных ракет. Если не иначе, потому что вы боитесь, что это сделают с другой стороны.

КА: Гарантированное взаимоуничтожение поддерживало стабильность в период холодной войны. Иначе нас бы тут не было.

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

КА: Как и плохие мотивы влиятельных субъектов мира, вы также переживаете из-за плохих побуждений каждого из нас в типе 2б.

image

НБ: Да, тут лучше взять в пример глобальное потепление. Каждый из нас пользуется в быту какими-то современными удобствами, использование которых не имеет значительных последствий, так? Но миллиарды людей делают то же самое, что вместе имеет разрушительное действие сейчас проблема глобального потепления может усугубиться. Существует параметр влияния на климат. Он показывает на сколько усилится потепление при выхлопе определённого количества парниковых газов. Предположим, что при количестве парниковых газов, выпускаемых на данный момент, к 2100 году вместо увеличения температуры всего на 34,5 градуса мы столкнёмся с увеличением на 15 или даже 20 градусов. То есть мы можем оказаться в очень плохом положении. Предположим, что очень сложно создать возобновляемый источник энергии или в земле есть больше ископаемых видов топлива

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

НБ: Я бы не был так уверен.

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

КА: А какое у вас мнение? Находится ли наша планета, человечество со всеми своими техническими возможностями, в уязвимом положении? Есть ли шар смерти в нашем будущем?

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

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

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

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

НБ: Ах, да

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

КА: Давайте обсудим это. Поговорим об ответных реакциях. Предположим, размышляя о всех возможностях, которые мы имеем на сегодняшний день, это не только синбиотехнологии, но и вещи вроде кибервойны, искусственный интеллект и т.д. за что, возможно, в будущем нас ожидает серьёзная расплата. Какими будут ответные реакции? Вы упомянули также четыре типа этих ответных реакций.

image

Ограничение разработок

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

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

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

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

НБ: Я полностью согласен. Хотелось бы, например, чтобы ДНК-синтезатор был не устройством, которое будет стоять в каждой лаборатории, а, быть может, сервисом. Допустим, в мире будет всего четыре или пять мест, куда можно будет отправить электронный образец ДНК и вам придут результаты. А потом у вас будет возможность при необходимости получить конечное множество уязвимых мест. Думаю, вы захотите узнать об особых ситуациях, которые можно будет жёстко контролировать.

КА: По сути, ваше мнение в том, что ничего не выйдет, если мы просто замедлим прогресс. Кто-нибудь, где-нибудь, предположим в Северной Корее, найдётся тот, кто захочет добыть именно чёрный шар из урны, если там такой есть.

НБ: В текущих условиях вполне вероятно. И дело не в синтетической биологии. Чёрным шаром могут оказаться абсолютно любые новые серьезные изменения в мире.

КА: Есть ещё вариант развития.

image

Ликвидация опасных людей

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

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

НБ: Всё не так однозначно. Под ликвидацией подразумевается также, например, лишение свободы или уничтожение, или изменение их взглядов на жизнь на более правильные. Смысл в том, что, допустим, вы справились с задачей, сократили количество опасных людей вдвое. Если делать ликвидацию путём убеждения, то вы столкнётесь с другими мощными факторами, влияющими на людей: партиями, религией, образованием. Если число опасных людей сократилось вдвое. Мне кажется риск снизится не на 50%, а только на 5 или 10%.

КА: Вы считаете, что мы не рискуем будущим человечества во втором варианте?

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

КА: А третий вариант?

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

image

Тотальная слежка

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

КА: Как в фильме Особое мнение.

НБ: В наблюдении нам могут помочь алгоритмы искусственного интеллекта, огромные центры свободы и т.д.

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

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

КА: Хорошо Друзья, именно поэтому наша беседа настолько увлекательная.

НБ: На самом деле об этом можно долго разговаривать, что очевидно. Мы обсуждали риски и проблемы, не так ли? Можем вернуться к этому. И четвёртая,

image

Глобальное управление

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

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

НБ: Однозначно, в ходе развития истории человечества масштабы политического аппарата увеличились. Сначала была группа охотников-собирателей, потом глава племени, города-государства, нации, сейчас существуют международные организации и т.д. Я просто хочу убедиться, что мне удалось подчеркнуть большое количество негативных сторон и риска как в случае тотальной слежки, так и в глобальном управлении. Просто хочу отметить, если нам повезёт, то мир может оказаться таким, что всё вышеперечисленное будет только спасением от чёрного шара.

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

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

КА: Какая разница, если мы живём в симуляции? Мы просто перезагружаемся.

НБ: Я не думаю, что это настало.

КА: Как вы считаете? Если сложить всё вместе, какова вероятность, что мы обречены?
(Мне нравится смех людей, когда звучит этот вопрос.)

НБ: На индивидуальном уровне нам придёт конец в любом случае, со временем мы стареем, разлагаемся, и всё в этом духе, да?

На самом деле всй немного сложнее. Если вы хотите посчитать вероятность того, что нам конец, во-первых, кто мы? Если вам много лет, то, возможно, умрёте своей смертью. Если вы молоды, то у вас может быть целых 100 лет. Вероятность индивидуальна. Затем порог, то есть ограничить понятие разрушения цивилизации. В своей книге я не считаю экзистенциальную катастрофу разрушением цивилизации. Это всё вопрос определения. Допустим, будет миллиард погибших или сокращение мирового ВВП на 50%, но от того, как вы обозначите порог, вы получите разную степень вероятности. Думаю, вы назовёте меня запуганным оптимистом.

КА: Вы запуганный оптимист, и я думаю, сейчас вы создали немало себе подобных запуганных людей.

НБ: Живущих в симуляции.

КА: Точно. Ник Бостром, ваши идеи удивляют. Спасибо, что запугали нас до смерти.

Translated by Olia Francia
Reviewed by Natalia Ost




image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Генеративная зоология с нейронными сетями

05.07.2020 14:08:58 | Автор: admin
image

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

image

Примеры изображений, созданных GAN

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

Некоторое время спустя в моем любимом подкасте была упомянута PhyloPic база данных силуэтных изображений животных, растений и других жизненных форм. Размышляя над этими строками, я задался вопросом что получится, если обучить систему, вроде той, что описана в статье Прогрессивные GAN, на очень разнообразном наборе подобных данных? Получится множество разновидностей нескольких известных типов животных, или мы получим множество вариаций, которое породит спекулятивную зоологию, управляемую нейронными сетями? Как бы все ни складывалось, я был уверен, что смогу получить из этого несколько хороших рисунков для моей учебной стены, поэтому я решил удовлетворить свое любопытство экспериментом.

Your browser does not support HTML5 video.

Я адаптировал код из статьи о прогрессивных GAN и обучил модель с помощью 12000 итераций, используя мощности Google Cloud (8 графических процессоров NVIDA K80) и весь набор данных PhyloPic. Общее время обучения, включая некоторые ошибки и эксперименты, составило 4 дня. Я использовал окончательную обученную модель для создания 50-килобайтных отдельных изображений, а затем потратил часы на просмотр результатов, категоризацию, фильтрацию и сопоставление изображений. Я также немного редактировал некоторые изображения, повернув их, чтобы все существа были направлены в одну и ту же сторону (чтобы добиться визуального удовлетворения). Этот практический подход означает, что то, что вы видите ниже это своего рода коллаборация между мной и нейронной сетью это была творческая работа, и я вносил в нее свои правки.

image

Летающие насекомые

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

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

image

Птицы

image

Четвероногие

image

Динозавры

image

Рыбы

image

Жуки

image

Гоминиды

Странные вещи



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

image

Чудища

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

image

Абстрактные существа

image

Неидентифицируемые

Случайный отбор


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

image

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Повелевать Webом с помощью Python

03.07.2020 20:16:17 | Автор: admin
Путешествие в простую веб-автоматизацию

image


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

Решение: Используйте Python для автоматической отправки выполненных заданий! В идеале я мог бы сохранить задание, набрать несколько клавиш и загрузить свою работу за считанные секунды. Сначала это звучало слишком хорошо, чтобы быть правдой, но потом я обнаружил Selenium, инструмент, который можно использовать с Python для навигации по сети.

image


Каждый раз, когда мы повторяем утомительные действия в Интернете с одинаковой последовательностью шагов, это отличный шанс написать программу для автоматизации процесса. С Selenium и Python нам просто нужно написать сценарий один раз, и затем мы сможем запустить его сколько угодно раз и уберечь себя от повторения однообразных задач (и в моем случае исключается возможность отправки задания в неправильное место)!

Здесь я рассмотрю решение, разработанное мной для автоматической (и правильной) отправки моих заданий. Попутно мы рассмотрим основы использования Python и selenium для программного управления вебом. Хотя эта программа работает (я использую ее каждый день!), она довольно индивидуальна, поэтому вы не сможете скопировать и вставить код для своего приложения. Тем не менее, общие методы здесь могут быть применены к неограниченному числу ситуаций. (Если вы хотите увидеть полный код, он доступен на GitHub).

Подход


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

image

File structure (слева) и Complete Assignment (справа).

Первая часть программы представляет собой цикл, который проходит по папкам, чтобы найти задание и класс, которые мы храним в кортеже Python:

# os for file managementimport os# Build tuple of (class, file) to turn insubmission_dir = 'completed_assignments'dir_list = list(os.listdir(submission_dir))for directory in dir_list:    file_list = list(os.listdir(os.path.join(submission_dir, directory)))    if len(file_list) != 0:        file_tup = (directory, file_list[0])    print(file_tup)


('EECS491', 'Assignment 3 Inference in Larger Graphical Models.txt')

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

Веб-контроль с Selenium


Чтобы начать работу с Selenium, мы импортируем библиотеку и создаем веб-драйвер, который является браузером, управляемым нашей программой. В этом случае я буду использовать Chrome в качестве браузера и отправлять драйвер на веб-сайт Canvas, где я отправляю задания.

import selenium# Using Chrome to access webdriver = webdriver.Chrome()# Open the websitedriver.get('https://canvas.case.edu')


Когда мы открываем веб-страницу Canvas, нас встречает первое препятствие поле для входа! Чтобы обойти это, нам нужно будет ввести идентификатор и пароль и нажать кнопку входа.

image

Представьте, что веб-драйвер это человек, который никогда раньше не видел веб-страницу: нам нужно точно сказать, куда нажимать, что печатать и какие кнопки нажимать. Есть несколько способов сообщить нашему веб-драйверу, какие элементы найти, и все они используют селекторы. Селектор это уникальный идентификатор элемента на веб-странице. Чтобы найти селектор для определенного элемента, скажем, поле CWRU ID, нам нужно посмотреть код веб-страницы. В Chrome это можно сделать, нажав Ctrl + Shift + I или щелкнув правой кнопкой мыши на любом элементе и выбрав Посмотреть код. Это открывает инструменты разработчика Chrome, чрезвычайно полезное приложение, которое показывает HTML, лежащий в основе любой веб-страницы.

Чтобы найти селектор для поля CWRU ID, я щелкнул правой кнопкой мыши в поле, нажал Посмотреть код и увидел следующее в инструментах разработчика. Выделенная строка соответствует элементу id_box (эта строка называется тегом HTML).

image

Этот HTML может выглядеть подавляющим, но мы можем игнорировать большую часть информации и сосредоточиться на частях id = "username" и name = "username". (они известны как атрибуты тега HTML).
Чтобы выбрать поле id с помощью нашего веб-драйвера, мы можем использовать атрибут id или name, который мы нашли в инструментах разработчика. Веб-драйверы в Selenium имеют много разных способов выбора элементов на веб-странице, и часто есть несколько способов выбрать один и тот же элемент:

# Select the id boxid_box = driver.find_element_by_name('username')# Equivalent Outcome! id_box = driver.find_element_by_id('username')


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

# Send id informationid_box.send_keys('my_username')


Мы выполняем один и тот же процесс для поля ввода пароля и кнопки входа, выбирая каждый из них в зависимости от того, что мы видим в инструментах разработчика Chrome. Затем мы отправляем информацию элементам или нажимаем на них по мере необходимости.

# Find password boxpass_box = driver.find_element_by_name('password')# Send passwordpass_box.send_keys('my_password')# Find login buttonlogin_button = driver.find_element_by_name('submit')# Click loginlogin_button.click()

Как только мы вошли в систему, нас приветствует эта слегка пугающая панель инструментов:

image

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

# Find and click on list of coursescourses_button = driver.find_element_by_id('global_nav_courses_link')courses_button.click()# Get the name of the folderfolder = file_tup[0]    # Class to select depends on folderif folder == 'EECS491':    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')elif folder == 'EECS531':    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')# Click on the specific classclass_select.click()


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

image

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

image

В этот момент я мог видеть финишную черту, но изначально этот экран меня озадачил. Я мог бы довольно легко нажать на поле Выбрать файл, но как я должен был выбрать нужный файл для загрузки? Ответ оказывается невероятно простым! Мы находим поле Choose File с помощью селектора и используем метод send_keys для передачи точного пути к файлу (называемого file_location в приведенном ниже коде) к блоку:

# Choose File buttonchoose_file = driver.find_element_by_name('attachments[0][uploaded_data]')# Complete path of the filefile_location = os.path.join(submission_dir, folder, file_name)# Send the file location to the buttonchoose_file.send_keys(file_location)


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

image

Теперь мы выбираем кнопку Отправить задание, нажимаем, и наше задание отправлено!

# Locate submit button and clicksubmit_assignment = driver.find_element_by_id('submit_file_button')submit_assignent.click()


image


Уборка


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

# Location of files after submissionsubmitted_file_location = os.path.join(submitted_dir, submitted_file_name)# Rename essentially copies and pastes filesos.rename(file_location, submitted_file_location)


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

Вот как это выглядит, когда я запускаю программу:

image

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

image

Пока программа работает, я могу наблюдать, как Python работает на меня:

image

Выводы


Техника автоматизации с помощью Python отлично подходит для многих задач, как общих, так и в моей области науки о данных. Например, мы могли бы использовать Selenium для автоматической загрузки новых файлов данных каждый день (при условии, что у веб-сайта нет API). Хотя на первый взгляд создание сценария может показаться трудоемким, преимущество заключается в том, что мы можем заставить компьютер повторять эту последовательность столько раз, сколько захотим, точно таким же образом. Программа никогда не потеряет фокус и зайдет в Twitter. Она будет точно выполнять шаги с идеальной последовательностью (алгоритм будет прекрасно работать, пока сайт не изменится).

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

В плане окупаемости эта программа экономит мне около 30 секунд на каждое задание, а на ее написание уходит 2 часа. Так что, если я использую ее для сдачи 240 заданий, я выйду в плюс по времени! Тем не менее, отдача от этой программы заключается в разработке классного решения проблемы и многому учит в процессе. Хотя мое время могло бы быть более эффективно потрачено на выполнение заданий, а не на выяснение того, как автоматически сдавать их, я полностью наслаждался этой задачей.Есть несколько вещей, приносящих такое удовлетворение, как решение проблем, и Python оказывается довольно хорошим инструментом для этого.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Python для начинающих как повелевать Webом

03.07.2020 22:11:07 | Автор: admin
Путешествие в простую веб-автоматизацию

image


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

Решение: Используйте Python для автоматической отправки выполненных заданий! В идеале я мог бы сохранить задание, набрать несколько клавиш и загрузить свою работу за считанные секунды. Сначала это звучало слишком хорошо, чтобы быть правдой, но потом я обнаружил Selenium, инструмент, который можно использовать с Python для навигации по сети.

image


Каждый раз, когда мы повторяем утомительные действия в Интернете с одинаковой последовательностью шагов, это отличный шанс написать программу для автоматизации процесса. С Selenium и Python нам просто нужно написать сценарий один раз, и затем мы сможем запустить его сколько угодно раз и уберечь себя от повторения однообразных задач (и в моем случае исключается возможность отправки задания в неправильное место)!

Здесь я рассмотрю решение, разработанное мной для автоматической (и правильной) отправки моих заданий. Попутно мы рассмотрим основы использования Python и selenium для программного управления вебом. Хотя эта программа работает (я использую ее каждый день!), она довольно индивидуальна, поэтому вы не сможете скопировать и вставить код для своего приложения. Тем не менее, общие методы здесь могут быть применены к неограниченному числу ситуаций. (Если вы хотите увидеть полный код, он доступен на GitHub).

Подход


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

image

File structure (слева) и Complete Assignment (справа).

Первая часть программы представляет собой цикл, который проходит по папкам, чтобы найти задание и класс, которые мы храним в кортеже Python:

# os for file managementimport os# Build tuple of (class, file) to turn insubmission_dir = 'completed_assignments'dir_list = list(os.listdir(submission_dir))for directory in dir_list:    file_list = list(os.listdir(os.path.join(submission_dir, directory)))    if len(file_list) != 0:        file_tup = (directory, file_list[0])    print(file_tup)


('EECS491', 'Assignment 3 Inference in Larger Graphical Models.txt')

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

Веб-контроль с Selenium


Чтобы начать работу с Selenium, мы импортируем библиотеку и создаем веб-драйвер, который является браузером, управляемым нашей программой. В этом случае я буду использовать Chrome в качестве браузера и отправлять драйвер на веб-сайт Canvas, где я отправляю задания.

import selenium# Using Chrome to access webdriver = webdriver.Chrome()# Open the websitedriver.get('https://canvas.case.edu')


Когда мы открываем веб-страницу Canvas, нас встречает первое препятствие поле для входа! Чтобы обойти это, нам нужно будет ввести идентификатор и пароль и нажать кнопку входа.

image

Представьте, что веб-драйвер это человек, который никогда раньше не видел веб-страницу: нам нужно точно сказать, куда нажимать, что печатать и какие кнопки нажимать. Есть несколько способов сообщить нашему веб-драйверу, какие элементы найти, и все они используют селекторы. Селектор это уникальный идентификатор элемента на веб-странице. Чтобы найти селектор для определенного элемента, скажем, поле CWRU ID, нам нужно посмотреть код веб-страницы. В Chrome это можно сделать, нажав Ctrl + Shift + I или щелкнув правой кнопкой мыши на любом элементе и выбрав Посмотреть код. Это открывает инструменты разработчика Chrome, чрезвычайно полезное приложение, которое показывает HTML, лежащий в основе любой веб-страницы.

Чтобы найти селектор для поля CWRU ID, я щелкнул правой кнопкой мыши в поле, нажал Посмотреть код и увидел следующее в инструментах разработчика. Выделенная строка соответствует элементу id_box (эта строка называется тегом HTML).

image

Этот HTML может выглядеть подавляющим, но мы можем игнорировать большую часть информации и сосредоточиться на частях id = "username" и name = "username". (они известны как атрибуты тега HTML).
Чтобы выбрать поле id с помощью нашего веб-драйвера, мы можем использовать атрибут id или name, который мы нашли в инструментах разработчика. Веб-драйверы в Selenium имеют много разных способов выбора элементов на веб-странице, и часто есть несколько способов выбрать один и тот же элемент:

# Select the id boxid_box = driver.find_element_by_name('username')# Equivalent Outcome! id_box = driver.find_element_by_id('username')


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

# Send id informationid_box.send_keys('my_username')


Мы выполняем один и тот же процесс для поля ввода пароля и кнопки входа, выбирая каждый из них в зависимости от того, что мы видим в инструментах разработчика Chrome. Затем мы отправляем информацию элементам или нажимаем на них по мере необходимости.

# Find password boxpass_box = driver.find_element_by_name('password')# Send passwordpass_box.send_keys('my_password')# Find login buttonlogin_button = driver.find_element_by_name('submit')# Click loginlogin_button.click()

Как только мы вошли в систему, нас приветствует эта слегка пугающая панель инструментов:

image

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

# Find and click on list of coursescourses_button = driver.find_element_by_id('global_nav_courses_link')courses_button.click()# Get the name of the folderfolder = file_tup[0]    # Class to select depends on folderif folder == 'EECS491':    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')elif folder == 'EECS531':    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')# Click on the specific classclass_select.click()


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

image

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

image

В этот момент я мог видеть финишную черту, но изначально этот экран меня озадачил. Я мог бы довольно легко нажать на поле Выбрать файл, но как я должен был выбрать нужный файл для загрузки? Ответ оказывается невероятно простым! Мы находим поле Choose File с помощью селектора и используем метод send_keys для передачи точного пути к файлу (называемого file_location в приведенном ниже коде) к блоку:

# Choose File buttonchoose_file = driver.find_element_by_name('attachments[0][uploaded_data]')# Complete path of the filefile_location = os.path.join(submission_dir, folder, file_name)# Send the file location to the buttonchoose_file.send_keys(file_location)


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

image

Теперь мы выбираем кнопку Отправить задание, нажимаем, и наше задание отправлено!

# Locate submit button and clicksubmit_assignment = driver.find_element_by_id('submit_file_button')submit_assignent.click()


image


Уборка


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

# Location of files after submissionsubmitted_file_location = os.path.join(submitted_dir, submitted_file_name)# Rename essentially copies and pastes filesos.rename(file_location, submitted_file_location)


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

Вот как это выглядит, когда я запускаю программу:

image

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

image

Пока программа работает, я могу наблюдать, как Python работает на меня:

image

Выводы


Техника автоматизации с помощью Python отлично подходит для многих задач, как общих, так и в моей области науки о данных. Например, мы могли бы использовать Selenium для автоматической загрузки новых файлов данных каждый день (при условии, что у веб-сайта нет API). Хотя на первый взгляд создание сценария может показаться трудоемким, преимущество заключается в том, что мы можем заставить компьютер повторять эту последовательность столько раз, сколько захотим, точно таким же образом. Программа никогда не потеряет фокус и зайдет в Twitter. Она будет точно выполнять шаги с идеальной последовательностью (алгоритм будет прекрасно работать, пока сайт не изменится).

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

В плане окупаемости эта программа экономит мне около 30 секунд на каждое задание, а на ее написание уходит 2 часа. Так что, если я использую ее для сдачи 240 заданий, я выйду в плюс по времени! Тем не менее, отдача от этой программы заключается в разработке классного решения проблемы и многому учит в процессе. Хотя мое время могло бы быть более эффективно потрачено на выполнение заданий, а не на выяснение того, как автоматически сдавать их, я полностью наслаждался этой задачей.Есть несколько вещей, приносящих такое удовлетворение, как решение проблем, и Python оказывается довольно хорошим инструментом для этого.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Гайд по DevOps для начинающих

06.07.2020 18:16:50 | Автор: admin
В чем важность DevOps, что он означает для ИТ-специалистов, описание методов, фреймворков и инструментов.

image

Многое произошло с тех пор, как термин DevOps закрепился в IT-мире. С учетом того, что большая часть экосистемы имеет открытый исходный код, важно пересмотреть, почему это началось и что это значит для карьеры в IT.

Что такое DevOps


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

Слово DevOps является объединением слов разработка (development) и операции (operations). DevOps помогает увеличить скорость доставки приложений и услуг. Это позволяет организациям эффективно обслуживать своих клиентов и становиться более конкурентоспособными на рынке. Проще говоря, DevOps это согласованность между разработкой и ИТ-операциями с более эффективным взаимодействием и сотрудничеством.

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

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

Вызовы для команды разработчиков


Разработчики, как правило, с энтузиазмом и желанием внедряют новые подходы и технологии для решения проблем организаций. Однако они также сталкиваются с определенными проблемами:

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


Проблемы, с которыми сталкивается операционная группа


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

  • Управление распределением ресурсов по мере роста спроса.
  • Обработка изменений в дизайне или настройках, необходимых для применения в производственной среде.
  • Диагностика и решение проблем, связанных с производством, после самостоятельного развертывания приложений.


Как DevOps решает проблемы разработки и операций


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

  • Снизить процент отказов при выпуске новых релизов
  • Увеличить частоту развертывания
  • Достичь более быстрого среднего времени на восстановление в случае выхода нового релиза приложения.
  • Сократить время на исправления


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

DevOps пытается решить различные проблемы, возникающие в результате применения методологий прошлого, в том числе:

  • Изолированность работы команд разработчиков и операторов
  • Тестирование и развертывание в виде отдельных фаз, выполняемых после проектирования и сборки и требующих больше времени, чем циклы сборки.
  • Чрезмерные времязатраты на тестирование, развертывание и проектирование вместо фокуса на создании основных бизнес-услуг
  • Ручное развертывание кода, приводящее к ошибкам в производстве
  • Разница в графиках работы групп по разработке и операциям, приводящая к дополнительным задержкам


image

Противостояние DevOps, Agile и традиционного IT


DevOps часто обсуждается в связи с другими ИТ-практиками, в частности, гибкой и водопадной ИТ-инфраструктурой.

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

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

Традиционные процессы Процессы в DevOps
После размещения заказа на новые серверы команда разработчиков работает над тестированием. Оперативная группа работает над обширной документацией, необходимой на предприятиях для развертывания инфраструктуры. После размещения заказа на новые серверы, команды разработчиков и операторов совместно работают над процессами и документооборотом для установки новых серверов. Это позволяет лучше понять требования к инфраструктуре.
Искажена информация о восстановлении после отказа, избыточности, расположении центров обработки данных и требованиях к хранилищам, так как отсутствуют входные данные от команды разработчиков, которая обладает глубокими знаниями в области применения. Подробная информация о преодолении отказа, избыточности, аварийном восстановлении, расположении центров данных и требованиях к хранилищам известна и корректна благодаря вкладу команды разработчиков.
Оперативная группа не имеет представления о прогрессе команды разработчиков. Также она разрабатывает план мониторинга на основе собственных представлений.
Оперативная группа полностью осведомлена о прогрессе, достигнутом командой разработчиков. Она также взаимодействует с командой разработчиков, и они совместно разрабатывают план мониторинга, который удовлетворяет IT и потребности бизнеса. Они также используют инструменты мониторинга производительности приложений (APM).
Нагрузочный тест, проводимый перед запуском приложения, приводит к сбою приложения, что задерживает его запуск. Нагрузочный тест, проводимый перед запуском приложения, приводит к снижению производительности. Команда разработчиков быстро устраняет узкие места, и приложение запускается вовремя.


Жизненный цикл DevOps


DevOps подразумевает принятие определенных общепринятых практик.

Непрерывное планирование


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

Совместное развитие


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

Непрерывное тестирование


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

Непрерывные выпуск и развертывание


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

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

Непрерывный мониторинг


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

Постоянная обратная связь и оптимизация


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

image

Преимущества DevOps


DevOps может способствовать созданию среды, в которой разработчики и операторы работают как одна команда для достижения общих целей. Важной вехой в этом процессе является внедрение непрерывной интеграции и непрерывной доставки (CI/CD). Эти методики позволят командам быстрее выводить программное обеспечение на рынок с меньшим количеством ошибок.

Важными преимуществами DevOps являются:

  • Предсказуемость: DevOps предлагает значительно более низкую частоту отказов при выпуске новых релизов.
  • Поддерживаемость: DevOps обеспечивает легкое восстановление в случае сбоев в новом релизе или отключения приложения.
  • Воспроизводимость: Система контроля версий сборки или кода позволяет восстанавливать более ранние версии по мере необходимости.
  • Более высокое качество: Решение проблем с инфраструктурой улучшает качество разработки приложений.
  • Время выхода на рынок: Оптимизация доставки программного обеспечения сокращает время выхода на рынок на 50%.
  • Снижение риска: Обеспечение безопасности в жизненном цикле программного обеспечения снижает количество дефектов на протяжении всего жизненного цикла.
  • Экономическая эффективность: Стремление к экономической эффективности при разработке программного обеспечения нравится высшему руководству.
  • Устойчивость: Программная система более стабильна, безопасна, а изменения можно проверять.
  • Более крупная кодовая база разбивается на управляемые части: DevOps основан на гибких методах разработки, которые позволяют разбивать большую кодовую базу на более мелкие и управляемые части.


Принципы DevOps


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

Разрабатывайте и тестируйте в среде, похожей на производственную


Суть заключается в том, чтобы позволить командам разработчиков и специалистов по контролю качества (QA) разрабатывать и тестировать системы, которые ведут себя как производственные системы, чтобы они могли видеть, как приложение ведет себя и работает задолго до того, как оно будет готово к развертыванию.

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

Развертывание с воспроизводимыми, надежными процессами


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

Мониторинг и проверка качества работы


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

Усовершенствование циклов обратной связи


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

Dev


  • Планирование: Kanboard, Wekan и другие альтернативы Trello; GitLab, Tuleap, Redmine и другие альтернативы JIRA; Mattermost, Roit.im, IRC и другие альтернативы Slack.
  • Написание кода: Git, Gerrit, Bugzilla; Jenkins и другие инструменты с открытым исходным кодом для CI/CD
  • Сборка: Apache Maven, Gradle, Apache Ant, Packer
  • Тесты: JUnit, Cucumber, Selenium, Apache JMeter


Ops


  • Выпуск, развертывание, операции: Kubernetes, Nomad, Jenkins, Zuul, Spinnaker, Ansible, Apache ZooKeeper, etcd, Netflix Archaius, Terraform
  • Мониторинг: Grafana, Prometheus, Nagios, InfluxDB, Fluentd, и другие, покрытые в этом руководстве


(* Инструменты для операций были пронумерованы в порядке применения операционными командами, но их инструментарий перекрывается стадиями жизненного цикла инструментами релиза и развертывания. Для удобства чтения нумерация была убрана.)

В заключение


DevOps это все более популярная методология, целью которой является объединение разработчиков и операторов в единое целое. Она уникальна, отличается от традиционных IT-операций и дополняет Agile (но не является столь же гибкой).

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:




Полезное


Подробнее..

Перевод - recovery mode Что должен знать Data Scientist про когнитивные искажения ИИ

25.06.2020 16:23:50 | Автор: admin
image

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

Так, вашему вниманию могут быть представлены следующие примеры определения отклонений:

  • В статистике: искажение (bias) это разница между ожиданием оцениваемой величины и ее значением. Такое определение жутко формально, так что позвольте мне его перевести. Искажение описывает результаты, которые систематически не соответствуют ожиданиям. Представьте себе стрельбу из лука, у которого сбит прицел. Высокий уровень искажения не означает, что вы стреляете куда угодно (в этом случае речь идет о дисперсии), суть будет заключаться в том, что даже идеальный лучник будет постоянно промахиваться. В данном контексте слово искажение несет в себе небольшой эмоциональный оттенок.
  • В сборе данных (а также в статистике): когда вы собираете данные, ваша выборка может не являться репрезентативной для интересующей вас совокупности. Искажение выборки в данном случае формальный термин. Такое искажение означает, что ваши статистические результаты могут содержать ошибки.
  • В когнитивной психологии: систематическое искажение от рационального. Каждое слово в этом содержательном определении, кроме от, заряжено нюансами, специфическими для данной области. Перевод на понятный язык: речь идет об удивительном факте, заключающемся в том, что ваш мозг развил определенные способы реакции на различные объекты, и психологи изначально сочли эти реакции искажениями. Список когнитивных искажений поражает.
  • В нейросетевых алгоритмах: По сути, речь идет об отрезке, отсекаемом с координатной оси. (искажение звучит круче, чем школьные математические термины, да?)
  • В социальных и физических науках: Любое из множества явлений, связанных с чрезмерным влиянием прошлых/актуальных условий на решения, принимаемые в настоящее время. Примерами также являются культурные предрассудки и инфраструктурная предвзятость.
  • В электронике: Фиксированное постоянное напряжение или ток, приложенные в цепи с переменным током.
  • В географии: Биас, в Западной Вирджинии. (от англ. Bias) (Я слышал, что Биас есть и в Франции).
  • В мифологии: Любой из этих древних греков.
  • О чем думает большинство экспертов по ИИ: речь об алгоритмических искажение идет тогда, когда компьютерная система отражает подсознательные ценности человека, который ее создал (разве не все, что создают люди, отражает подсознательные ценности?).
  • О чем думает большинство людей? О том, что наш опыт искажает наше восприятие и реакцию на информацию, особенно в контексте несправедливого отношения к другим людям и плохих поступков вообще. Некоторые люди используют это слово как синоним предрассудков.


Ох. У термина искажение много значений, и некоторые из них более острые, чем другие.

О чем идет речь в области машинного обучения и ИИ?


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

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

Весь смысл ИИ в том, чтобы дать вам возможность объяснить свои пожелания компьютеру на примерах (данных!), а не в инструкциях. Каких примерах? Это ваш выбор в качестве учителя. Датасеты это учебники, по которым ваш ученик может учиться. И знаете что? У учебников есть авторы-люди, как и у наборов данных.

Учебники отражают предвзятость их авторов. Как и у учебников, у наборов данных есть авторы. Они собираются в соответствии с инструкциями, сделанными людьми.


Представьте себе попытку обучить человека по учебнику, написанному предвзятым автором вас удивит, если ученик в конце концов выразит некоторые из тех же предвзятых представлений? Чья это вина?

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

Искажения исходят не от алгоритмов ИИ, они исходят от людей.


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

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Тренды в Data Scienсe 2020

26.06.2020 18:17:05 | Автор: admin
image

Google Trends по запросу data science

Краткое изложение


  • По нашим оценкам, вакансии в advanced analytics насчитывают почти 1 миллион человек во всем мире, 291 тысяча из них в США.
  • За последние два года дефицит работ в области data science значительно сократился были наняты около 800 тысяч специалистов, однако на данный момент десятки вакансий так и остаются нетронутыми, причем подавляющее большинство из них в США.
  • Самый большой спрос на рабочих в области advanced analytics в области залива Сан- Франциско с самыми высокими зарплатами и самым большим количеством вакансий, за ней следуют крупные городские центры вроде Нью-Йорка, Бостона, Вашингтона и Сиэтла.
  • Средняя заработная плата по стране у data scientists остается выше $100,000 эта тенденция просматривается почти во всех штатах, удовлетворенность работой и престиж также остаются на высоком уровне.
  • Для подготовки специалистов в advanced analytics было создано больше ста образовательных программ.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:




Вступление


Вот уже последние несколько лет data science является одним из самых ярких трендов в бизнесе. В 2012 году Harvard Business Review назвали работу data scientists самой сексуальной работой 21-го века. Многочисленные отчеты (1, 2, 3, 4) писали, что мир сталкивается с огромным дефицитом data scientists. Создавались буткемпы и университетские программы, чтобы решить вопросы, связанные с огромным спросом на навыки в этой области.

К advanced analytics мы относим всех, кто сам относит себя к data scientist, специалистам по машинному обучению или ИИ-исследователю.

Спрос и предложение data scientists май 2020


Общее число рабочих в области advanced analytics



На сегодняшний день в мире насчитывается чуть менее одного миллиона рабочих в области advanced analytics (см. раздел методологии ниже), из которых 290 тысяч или же примерно 30% приходится на Соединенные Штаты Америки. На данный момент численность data scientists значительно превосходит численность инженеров по машинному обучению и исследователей ИИ как в США, так и во всем мире, однако и инженеры, и исследователи являются новыми на рынке труда и в будущем могут значительно вырасти.

image

Сравнение общего числа продвинутых аналитиков в мире в разбивке по должности, май 2020 г.

Открытые и дефицитные вакансии


На сегодняшний день на LinkedIn открыты около 86 тысяч вакансий в сфере advanced analytics, большая часть (53.4 тысячи) приходится на США. Интересно отметить, что США представляет собой непропорционально большое число открытых вакансий (62%) по сравнению с долей рабочих в advanced analytics во всем мире (30%), хоть это и можно списать на ложную методологию сбора данных (см. раздел методологии ниже).

image

Количество открытых ролей advanced analytics по сравнению с общим числом профессиональных сотрудников advanced analytics

Мы можем использовать число открытых вакансий (по сравнению с количеством имеющихся сотрудников) в качестве приблизительного показателя, чтобы понять сколько всего работников недостает. Из приведенного ниже графика видно, что открытых вакансий по всему миру на 9% больше, чем непосредственно сотрудников, в то время как в США это число достигает примерно 18.7%.


Сокращение дефицита


Сегодня в США насчитывают примерно 53 тысячи свободных рабочих мест в области advanced analytics. Однако, в августе 2018 года LinkedIn опубликовал отчет на тот момент дефицит составлял около 151 тысячи рабочих мест. За последние два года дефицит значительно сократился по всему миру была нанята примерно 831 тысяча профессионалов в области advanced analytics (см. ниже).

image

Apteo оценивает общее количество продвинутых аналитиков с течением времени

image

Дефицит продвинутых аналитиков в 2018 году по сравнению с 2020 годом

Распределение открытых вакансий и недостаток рабочих по городам США


Общее число специалистов и вакансий


Никого не удивит, что наибольшая часть работников в advanced analytics находятся в районе залива Сан-Франциско примерно 45.7 тысяч человек, как и наибольшее количество открытых вакансий около 8 тысяч. На втором месте идет Нью-Йоркская агломерация около 38.8 тысяч сотрудников и 5.9 тысяч вакансий. На третьем месте район Большого Бостона 15.9 тысяч сотрудников и 3.3 тысячи вакансий.

Самая высокая доля на душу населения


На первом месте район залива Сан-Франциско 5.9 тысячи человек на миллион. На втором месте идет Сиэтл 4.3 тысячи на миллион, завершает Бостон 3.2 тысячи на миллион.

Наибольшая нехватка рабочей силы


Наибольший процент (39.2%) открытых вакансий в городе Вашингтон.

image

Расширенная аналитика сотрудников и вакансий по городам

image

Заработная плата и удовлетворенность работой в США



Заработная плата в этой сфере варьируется по всей Америке. Основываясь на данных из различных источников, мы подсчитали, что средняя зарплата специалистов достигает примерно $114,000 в год, что соответствует примерно $14,000 в районе залива Сан-Франциско.

В 2020 году работа в data science заняла третье место по Америке по версии Glassdoor (сразу после Front End Engineer и Java Developer). С 2016 по 2019 года data scientists занимали первое место.

image

Образовательные программы и требуемые навыки


Для удовлетворения потребностей в бизнесе появилось множество новых образовательных программ. На данный момент существует как минимум 79 буткемпов, 62 программы бакалавриата и 111 магистерских программ, ориентированных на data science. Ниже мы перечислим наиболее упоминаемые программные средства и навыки для специалистов в области advanced analytics

Top Tools


  • Python
  • SQL
  • R
  • Spark
  • Cloud
  • AWS
  • Java
  • Tensorflow


Top Skills


  • Machine Learning / Regression
  • Statistics
  • Research
  • Prediction
  • Visualization
  • Recommendation
  • Optimization
  • Deep Learning
  • Natural Language Processing


image

Образовательные программы

Вывод


Очевидно, что data science продолжает быть крайне востребованной и на сегодняшний день. В то время как мир, судя по всему, быстро удовлетворяет этот спрос, по-прежнему существует острая нехватка рабочих в области advanced analytics. Интересно то, что возникают и новые должности типа инженера по машинному обучению (machine learning engineer) или ИИ-исследователя (A.I. researcher), и вполне вероятно, что для них потребуются дополнительные сотрудники, поскольку все больше компаний работают над внутренним продвижением data science.

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

Методология


Расчет занятости и дефицита


Для идентификации data scientists и открытых вакансий в data science, мы провели поиск по ключевым словам на LinkedIn по трем наиболее распространенным названиям вакансий, которые мы ассоциируем с математической, инженерной и аналитической работой, в которой, по нашему мнению, и заключается работа data scientist при помощи премиум аккаунта генерального директора и соучредителя Apteo Шанифа Дханани. Названия вакансий следующие data scientist, инженер по машинному обучению и исследователь искусственного интеллекта.

Data scientist и инженер по машинному обучению также могут быть связаны с такими ключевыми словами как data science и инженер МО, поэтому для предотвращения двойного подсчета мы использовали бинарный поиск искали ровно один термин за раз, исключая все остальные термины. Например, мы соединили результаты из следующих двух запросов для поиска data scientists:

data science -data scientist -machine learning engineer -ml engineer -ai researcher and data scientist -data science -machine learning engineer -ml engineer -ai researcher

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

Источники информации:

  • Данные поиска работ на LinkedIn, полученные 1-го мая 2020 года.
  • Google (численность населения)



Расчет заработной платы


Единого правдивого источника для расчета заработной платы просто не существует. Правительство США, рекрутинговые компании и независимые отчеты публикуют разные значения о заработной плате advanced analytics. Для наших отчетов мы собрали как можно больше независимых значений как на государственном, так и на национальном уровне и использовали среднее значение.

Источники информации:




Рост занятости


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

Источники информации:




Образовательные программы и требуемые навыки



Следует снова проговорить, что было сложно оценить образовательные программы. В каждом университете свое название для программы по data science, поэтому нам приходилось субъективно определять, какие программы включать в список, а какие исключать из него. Мы попытались отобрать те программы, основанные на математической строгости, вычислительной работе и аналитике. Мы исследовали различные отчеты и агрегаторы для сбора данных по университетским программам, а также различные буткемпы для определения суммарных показателей для 2020-го года.

Источники информации:


Читать еще


Подробнее..

Перевод Data Science умерла. Да здравствует Business Science

27.06.2020 22:14:45 | Автор: admin

5 полезных уроков от скромного лосося



image

Три волны развития искусственного интеллекта согласно Evo Pricing, основано на исследованиях DHL.

Данные ненадежный друг, и с трудом что-то о них можно назвать научным. Что же делать с наукой о данных?

За последние 5 лет я провел собеседования с более чем 1000 кандидатами на должность аналитиков данных, желающих работать в Evo Pricing. В процессе я узнал, что то, как в СМИ изображают данную профессию, в корне неверно; мы не просто подставляем данные в уже готовые алгоритмы.

Назрела необходимость коренным образом переосмыслить наше представление о науке о данных.

70 лет истории в двух параграфах и одной картинке


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

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

Распространенные заблуждения о науке о данных


image

Что такое Data Science?

По мнению Калифорнийского университета Беркли, эта наука один из самых перспективных карьерных путей для квалифицированных специалистов.

По моему мнению, название Data Science предполагает особый подход к решению определенных проблем. Вот есть определенные данные; а что нам с ними делать, что угодно?
На самом деле, вложить огромную сумму денег в какие-то данные, из которых, может быть, однажды получится что-то полезное, звучит не очень оптимально как с точки зрения карьерного роста, так и с точки зрения бизнес-стратегии. К сожалению, промышленная революция XIX века оставила нам в наследство школы и университеты для обучения большого числа рабочих, способных только давать однообразные ответы на стандартные вопросы; и с тех пор мало что изменилось.

А что будет, если мы научим людей задавать правильные вопросы, а машины находить ответы?


Data Science может стать карьерным тупиком


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

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

Данные и алгоритмы мощные инструменты. Но, как и любой инструмент, их результативность зависит от того, как хорош тот, кто ими пользуется.

Желайте добиться успеха развивайте Business Science


Как стать успешным, работая с данными? Сосредоточьтесь на проблеме, которую надо решить, а не на данных как таковых.

Для тех, кто хочет использовать данные в коммерческих целях, наука о бизнесе предлагает прекрасные стратегии:

  • бизнес-проблема должна быть определена, изучена и решена;
  • исследование должно быть выполнено с научной точки зрения;
  • влияние на бизнес: измеримый, объективный результат;


Для некоммерческих вариантов работы с данными логика, тем не менее, аналогичная: начните с вопроса/гипотезы, придерживайтесь строгой методологии, потом вернитесь к изучаемому аспекту/вопросу и определите, было ли доказано влияние данных на бизнес или нет. И так по новой.

Возникает вопрос: как это все сделать? Это мы можем объяснить, используя довольно забавную аналогию.

Урок от лосося 1: начинайте с конца



image

Скромный лосось не только вкусный, но и за свои 5-10 лет жизни успевает сделать много правильных, логичных вещей: жизнь его начинается с конца (в устье реки), а потом возвращается к началу (истоку), где происходит нерест, после чего он покидает реку, уступая место новому поколению лососей.

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

Среднестатистическому аналитику данных есть чему поучиться у скромного лосося. Как бы ни было комфортно (и интеллектуально застойно) плыть по течению к новому объему данных, такая простая, детская стратегия не приведет к успеху в долгосрочной перспективе.

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

Урок от лосося 2: не подплывайте близко к водопаду


Я проработал консультантом по вопросам управления в McKinsey & Company 10 лет. За время пребывания в должности я строго следовал традиционной каскадной модели работы она же модель Водопад: всегда начинал работу с того, что инвестировал в проект огромное количество времени, сил и клиентского бюджета. Исследовал все максимально подробно. Грубо говоря, кипятил океан и, в процессе, убивал бедных лососей!

image

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

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

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

В конце концов, именно для этого и появилась гибкая методология разработки. Чтобы допускать дополнительные корректировки.

Урок от лосося 3: принцип 80/20 поможет избежать медведей


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

image

Берегись медведя. Фото: Прыжок смерти, Питер Шталь.

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

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

Перфекционизм главный враг Business Scientistа

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


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

Наше спасение принцип 80/20 сосредоточивается на том, что действительно важно, и позволяет обойти препятствия, а не идти напролом. Поплавайте вокруг и поищите способы, которые могут помочь избежать медведей. Крайние, пограничные случаи практически не оказывают влияние на бизнес! Тогда зачем напрягаться?

Урок от лосося 4: чем меньше (данных), тем лучше (информация)


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

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

Работа на основе данных должна осуществляться снизу вверх, но эффективная коммуникация сверху вниз.


В какой-то момент ученому нужно заканчивать вариться в океане данных и переходить к формулированию сообщения как с нуля донести идею до получателя? Для этого нужно перейти в режим сверху вниз.

Не нужно создавать навороченную визуализацию, которая настолько динамична и запутанна, что понятна только технарям. Наоборот, формулировку надо максимально упростить. Тратьте МЕНЬШЕ времени на данные и БОЛЬШЕ на планирование обсуждения.

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

Урок от лосося 5: доказательство налицо


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

Только читав о спутниковой навигации, Вы не научитесь ею пользоваться.


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

Поэтому рекомендую начать с таких EOL-дел, как переупорядочение (для производственно-сбытовых цепочек) и уценки (в случае ценообразования). И я прекрасно понимаю, что лучшая уценка это та, которую Вы ВООБЩЕ не предлагаете, потому что все было с самого начала грамотно спланировано. Но насколько бы было проблемно нарушить планирование, предварительно не завоевав сердца и умы клиентов осязаемыми фактами?

Будь Business Scientistом, а деньги приложатся


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

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

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

Это философия жизни.

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

Хорошего плавания!

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Самое грустное уравнение в Data Science

29.06.2020 18:10:05 | Автор: admin
image
Запаситесь носовыми платочками! Сейчас я расскажу вам всю правду о статистике и data science. У вас слезы на глаза навернутся, я вам обещаю.

ВВОД = ДАННЕ + ПРЕДПОЛОЖЕНИЯ. Другими словами, статистика не дает вам правду.

Распространенные мифы


Часто можно услышать следующие ошибочные представления:
  • Если я найду правильные уравнения, я смогу узнать то, что сейчас никому неизвестно.
  • Если я добавлю математики в свои данные, я смогу уменьшить неопределенность.
  • Статистика может превращать данные в правду!


Все это звучит как сказки, не так ли? Потому что это они и есть.

Горькая правда


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

К сожалению, многие шарлатаны будут пытаться убедить вас в обратном. Они будут использовать стандартный прием, Ты не знаешь уравнений, которыми я тебя закидал, поэтому признай мое преимущество и делай как я скажу!

Не ведитесь на слова этих позеров.

Не повторяйте судьбу Икара


Думайте о статистических выводах (если коротко, о статистике) как о прыжке от того, что мы знаем (наших обычных данных) к тому, что не знаем (нашему параметру генеральной совокупности).

В статистике то, что вы знаете это не то же самое, что вы хотели бы знать

Может вы и хотите фактов о завтрашнем дне, но вы можете делать выводы только на основе вчерашнего. (Так раздражает, когда мы не помним будущее, правда?) Может вы хотите знать, что все ваши потенциальные пользователи думают о вашем продукте, но опросить вы можете лишь сотню. Тогда вы получаете неопределенность!

Это не магия, это предположения


Как вообще можно перескочить от того, что вы знаете к тому чего не знаете? Вам нужен мост, чтобы преодолеть эту пропасть. И название этому мосту предположения. Напомню вам о самом болезненном уравнении в data science: ДАННЕ + ПРЕДПОЛОЖЕНИЯ = ПРОГНОЗИРОВАНИЕ.

ДАННЕ + ПРЕДПОЛОЖЕНИЯ = ПРОГНОЗИРОВАНИЕ.

(Слово прогнозирование(prediction) спокойно можете заменить на выводы или прогнозы, если вам так удобней. Все это об одном и том же: утверждение о чем-то, что вы не знаете наверняка.)

Что такое предположение(assumption)?


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

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


Как бы мне сказать это прямо? Предположение это не факт, это чепуха, которую вы придумываете, потому что у вас недостаточно информации. Если вы часто принижаете людей своими супер точными интервалами, не забывайте, что называть правдой то, что основано на предположениях, слишком опрометчиво. Лучше воспринимайте статистику как инструмент для принятия решений. Этот инструмент не идеален, но все же лучше, чем ничего (в определенных ситуациях).

Статистика это ваша попытка делать все, что в ваших силах, в мире неопределенности.

Предположения и в Африке предположения. Они не превратятся в факты по взмаху волшебной палочки.

Предположения это часть принятия решений


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

Примеры: Когда вы читаете газету, вы предполагаете, что все факты проверены? Когда вы строили планы на 2020, вы предполагали, что не будет глобальной пандемии? Если вы анализировали данные, вы предполагали, что данные были записаны без ошибок? Вы предполагали, что ваш генератор случайных чисел дает случайные результаты? (Обычно они не случайны.) Когда вы решаете совершить покупку в интернете, вы предполагаете, что с вас будет списана верная сумма? Что насчет вашего последнего перекуса? Вы предполагали, что он не отравлен? Когда вы принимали лекарство, вы *знали* о его долговременном эффекте или предполагали?

Нравится вам это или нет, предположения часть принятия решений

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

Даже если вы решили обойтись без статистики, вы вероятно используете предположения, чтобы решить как действовать. Ради своей безопасности вы должны осознавать на каких предположениях основаны ваши решения.

Как творится магия статистики


В сфере статистики есть множество инструментов, позволяющих вам сформулировать предположения и объединить их с доказательствами. Так рождаются разумные решения. (Здесь можно посмотреть мое 8-минутное введение в статистику.)

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

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

image

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

Два человека могут прийти к совершенно разным выводам на основе одних и тех же данных! Им достаточно делать разные предположения.

По той же причине два человека могут прийти к совершенно разным выводам на основе одних и тех же данных! Им достаточно делать разные предположения. Статистика дает вам инструмент, который позволяет принимать решения более осознанно, но не существует единого правила ее использования. Это личный инструмент принятия решений.

Насколько хорошо вы проведете исследование зависит от того насколько хорошие предположения вы сделаете.

Что там по поводу науки?


Что происходит, когда ученый использует статистику, чтобы сделать какие-то выводы? Он просто формирует мнение и принимает решение поделиться им со всем миром. Это неплохо, волей не волей ученым периодически приходится делать выводы таким образом, такая уж у них работа. Я предполагаю, что иногда к этим выводам можно прислушаться.

Волей не волей ученым периодически приходится делать выводы на основе статистики, такая уж у них работа.

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

Итог


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

Нет, она не дает вам нужных фактов. Она дает вам то, что вам нужно, чтобы справиться с отсутствием фактов. Смысл статистики в том, чтобы помочь вам сделать все, что в ваших силах, в мире неопределенности.

Вам нужно лишь делать предположения.

Перевод: Диана Шеремьёва

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Видеоигры это будущее образования (размышления программиста из Palantir)

28.06.2020 02:16:08 | Автор: admin
Подписывайтесь на канал @META ОБУЧЕНИЕ, где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)

В подростковом возрасте моё реальное образование складывалось из:

  1. книг, которые я сам выбирал
  2. обучения программированию (самостоятельного)
  3. видеоигр (которые находил сам)
  4. математики (из школьной программы)

Пункты 1-3 не связаны с формальным школьным образованием и сформировались даже скорее вопреки ему. О нечто подобном писал Пол Грэм:



Прежде чем играть в игры или смотреть видео про покемонов, вы должны выучить наизусть имена и характеристики первых 100 покемонов. Ритуально повторяя их в алфавитном порядке. Хочется вам того или нет. Вот что обычно понимает система образования под математическими способностями.

Симуляторы (такие как игра Pokemon) дают более быстрое и глубокое понимание, понимание до мозга костей.

Поэтому я считаю, что:

4. Видеоигры станут ключевым компонентом образования.



Звучит абсурдно, но если задуматься, симуляция уже широко используется для обучения:

  • Компьютерная игра Kerbal Space Program знаменита тем, что делает своих игроков экспертами в астродинамике.
  • Авиасимуляторы и симуляторы боевых действий готовят пилотов и военнослужащих.
  • Игра Factorio обучает вас законам капитализма, производства и экономики.
  • Среды программирования это симуляции вселенной языка программирования с быстрой обратной связью (написать код -> отладить код).


image

Видеоигра это просто:

(а) симуляция реальности
(б) с быстрой обратной связью.

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

Поэтому вполне оправдано, чтобы видеоигры в будущем станут основной образовательной средой: это лучший способ на сегодняшний день, чтобы (а) создавать симуляции реальности (б) быстро получать обратную связь и (в) делать все это по доступным ценам.

(Кстати, это работает не только для абстрактных концепций, таких как астродинамика, но и для этических норм. К примеру, мое понимание героизма по сей день сформировано играми Final Fantasy и Metal Gear Solid. Также можно объяснить и ценность художественной литературы: можно получить телесные знания об отчаянии, прочитав Достоевского, и о ревности, прочитав В сторону Свана и др.)

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



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

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

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

Примеров таких игр пока не много, но я верю, что в будущем их станет больше. Почему же этого до сих не произошло? Я думаю, что ответ заключается в том, что:

6. Сейчас пока еще слишком трудно производить видеоигры. Упрощение процесса значительно увеличит предложение хороших видеоигр на рынке и приведет к постепенной революции в образовании.



Одно высказывание об интернете особенно хорошо мне запомнилось. Оно принадлежит Эвану Уильямсу, основателю Twitter/Blogger/Medium. Он как-то сказал, что лучший способ создать гигантскую интернет-компанию это взять то, что люди хотят сделать, и сделать это в 10 раз проще.

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

Нам кажется, что интернет позволяет делать что-то новое", говорит Уильямс. Но люди просто хотят делать то же, что и всегда.

(...)

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


Упростить создание вещей это мегатренд эпохи интернета:

  • Blogger/Medium/Wordpress (и Хабр) позволяют легко писать в интернете;
  • Subpack позволяет легко настраивать информационные рассылки
  • YouTube и TikTok позволяют легко создавать видео;
  • Ableton позволяет легко делать музыку и т. д.


Другой момент связан с тем, что упрощение имеет нелинейный эффект. Упрощение чего-либо в 10 раз приводит к тому, что что-то появляется в 1000-кратном количестве. Отсюда и взрыв онлайн-творчества на YouTube: множество видео по шахматам, Minecraft, математике, Академии Хана, стримы на Twitch, Soundcloud и др.; вы убираете некоторые сложности и получаете грандиозный результат.

Однако эту тенденцию ждет долгий путь развития. Создание видеоигр требует колоссальных усилий и высоких затрат; вам нужно быть либо сумасшедшим гением, разработчиком инди-игр со сверхвысокой толерантностью к риску, либо мега-корпорацией, как Unity, Steam или Valve. Видеоигры еще не пережили революцию создателей.

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

Несколько важных замечаний:

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

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

И последнее: именно поэтому ИИ имеет важное значение для производительности человека. В основном речь идет о том, как ИИ заменит людей. Я придерживаюсь позиции Ликлайдера: симбиоз человека и компьютера. ИИ сделает людей более эффективными, автоматизируя утомительные задачи. Например, люди могут использовать текстовый ИИ, такой как GPT-3, чтобы генерировать идеи/шаблонное письмо, чтобы избежать страха перед пустой страницей, а затем выбирать лучшие примеры и их дорабатывать/итерировать. (AI Dril, который был создан на основе GPT-2, как раз был таким ранним примером). По мере того как искусственный интеллект будет совершенствоваться, вспомогательное творчество станет все более употребимым явлением, позволяющим людям создавать сложные артефакты (в том числе видеоигры!) как никогда проще и лучше.

Потенциальная энергия человеческого творчества огромна. Нам просто нужно дать людям инструменты, и творения последуют. Вперед!

Спасибо Саку П за то, что он прочитал мой черновик.

Обновление: интересные обсуждения на Hacker News.



Подписывайтесь на канал @META ОБУЧЕНИЕ, где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru