Friday, April 26, 2013

Первое впечатление от Kotlin

Решил портировать just for fun одну небольшую но нетривиальную библиотеку со Scala на Kotlin. Про Kotlin читал и посмотрел несколько презентаций.

Плагин работает достаточно быстро и правильно выделяет места с ошибками, НО сообщения об ошибках плагин выдает как правило глупые и приходится запускать компилятор (сборку проекта), чтобы получить внятное сообщение об ошибке. А вот сборка проекта работает оочень медленно - проект из пяти классов собирается 8 секунд.

Печалька

Monday, May 28, 2012

Seven Databases in Seven Weeks

Просто обожаю такие книжки. Прочел за два дня.

Polyglot persistence - это круто и интересно. А в mongodb и couchdb самым гуманным образом сделан mapreduce.

Tuesday, March 6, 2012

Programming collective intelligence

Programming Collective Intelligence by  Toby Segaran.

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

Достоинства книги:

  • Книга очень легко читается, автор не страдает болезнью разжевывания. Воды в книге нет.
  • Каждая глава является (почти) самодостаточной. 
  • Примеры закодированы на Питоне: код краток. (Сравните с книгами Collective Intelligence in Action или с Algorithms of the Intelligent Web, где примеры закодированы на Java.)
  • Очень хорошо (интуитивно понятно) обосновывается, за счет чего алгоритм работает.
Недостатки (которые не умаляют достоинств):
  • В подавляющем случае нет ссылок на первоисточники. (А в книгах Collective Intelligence in ActionAlgorithms of the Intelligent Web и Machine Learning in Action такие ссылки есть.)
  • В книге отсутствуют (интуитивно понятные) объяснения, как работают метод опорных векторов и как работает алгоритм неотрицательной матричной факторизации ("beyond the scope of this book").
  • Некоторые важные трюки описаны, но не подчеркнута их важность. Пример: при иерархической кластеризации, когда две группы сливаются в одну группу, то показатели новой группы вычисляются как среднее между показателями исходных групп. В книге есть еще несколько таких мест.
Почему книга настоятельно рекомендуется к прочтению программистам:

  • В основе большинства алгоритмов искуственного интеллекта (Artificial Intelligence) и машинного обучения (Machine Learning) лежат очень простые трюки (или даже хаки) которые очень хорошо работают в некоторых условиях. Навых понимания того, что очень простой трюк может привести к правильному и эффективному решению, крайне важен для программиста. Основа этих алгоритмов очень проста (не rocket science).
  • Чтобы понимать, как работает современный интернет. Алгоритмы описанные в книге, лежат в основе повседневных современных вещей (см. краткое содержание дальше). Все мы ленивые и мало читаем. У всех у нас есть неправильные наивные представления о вещах, про которые мы не знаем наверняка. Однако, стыдимся своего невежества. Очень грустно слышать, когда коллега по работе (например) начинает с легкостью рассуждать, про то, как работают алгоритмы кластеризации, имея превратное и неправильное представление. В общем, надо прочесть, чтобы побороть свое невежество.
Ну теперь краткое содержание книги по главам. Все алгоритмы делятся на обучение с учителем (supervised learning) и обучение без учителя (unsupervised learning):
  1. Введение. Общие слова.
  2. Построение рекомендаций. Алгоритмы, лежащие в основе рекомендаций amazon, imdb и т.д.
    • User-based recommendations. Среди пользователей ресурса находятся N наиболее близких к вам, а затем делается из их топовых предпочтений делается взвешенная (weighted) рекоммендация для вас.
    • Item-based recommendation. Трюк: матрица предпочтений переворачивается. В результате находятся похожие продукты. Этот алгоритм лежит в основе рекоммендации от amazon. Плюс данного алгоритма - требует меньше вычислительных ресурсов.
  3. Обнаружение групп/структуры в данных. 
    • Иерархическая кластеризация. Набор данных представляетс в виде древовидной иерархической структуры. Примеры книги - иерархическая классификация блогов. Иерархия строится снизу вверх. Классификация предпочтений. Пример из другой книги (Data mining) - автоматическое построение иерархии видов/классов для животного мира. Как может применяться? Для рекомендации - вам могут порекомендовать купить предметы, которые находятся в той же (достаточно узкой) группе.
    • Иерархическая кластеризация столбцов. Применяется трюк, похожий на трюк из предыдущей главы - матрица предпочтений/аттрибутов переворачивается. В результате получается иерархия аттрибутов. Пример в книге - нахождение "главных" слов, которые наиболее употребляются в той или иной группе блогеров.
    • Кластеризация на N групп через усреднение (K-means clusterization). Здесь все просто. Говорите: хочу выявить N групп. Группы ищутся через рандомизацию/усреднение.
  4. Поиск и ранжирование. Реализован небольшой google на Питоне.
  5. Оптимизация. Минимизируется некоторая целевая функция, зависящая от многих параметров. Рассмотренные методы широко известны. Иллюстрируются на двух примерах: поиск расписания полетов для семейной встречи, расположение связей (социального графа) на плоскости так, чтобы пересекалось как можно меньше связей. Отдельно стоить отметить, что алгоритмы закодированы в обобщенном виде, -  и применимы ко многим задачам. 
    • Случайный поиск.
    • Метод спуска (обычного, не градиентного).
    • Имитация отжига.
    • Генетические алгоритмы.
  6. Фильтрация документов (спам/не спам).
    • Наивный Байесовский классификатор. Каждый взрослый человек должен понимать теорему Байеса!
    • Метод Фишера. Основной трюк - тестирование, насколько данная комбинация слов является случайной.
  7. Деревья принятия решений (decision trees).
    • Чем-то похоже на построение иерархической кластеризации из главы 3. Большое отличие - дерево строится сверху вних! Для разбиения можно использовать разные метрики:
      • Энтропия.
      • Индекc Джини.
      • Дисперсия.
    • Как и алгоритмы оптимизации, алгоритмы закодированы в обобщенном виде и легко применимы к новым задачам.
  8. Предсказание численных значений.
    • Среднее по K-соседям.
    • Поиск масштабирования атрибутов. Для этого множество разбивается на два подмножества: обучающее и тестирующее. Поиск оптимальных масштабирующих параметров происходит алгоритмами оптимизации из главы 5. (Одно из самых красивых мест в книге - когда на помощь одному эвристическому алгоритму приходит другой эвристический алгоритм!)
  9. Продвинутые методы классификации.
    • Метод опорных векторов. - Поиск сложных разбиений между группами.
  10. Поиск независимых компонент. Пример: формирование заголовков новостей. Похожие алгоритмы применяются сервисами вроде google news или яндекс новости. Суть - данные представляются в виде матрицы и мы пытаемся эту матрицу представить в виде произведения матриц. 
    • Метод неотрицательной матричной факторизации. - Пожалуй, самые красивый алгоритм из всей книги.
  11. Эволюционирующие алгоритмы. Построение программы, которая угадывает некоторую функцию.
    • Генетические алгоритмы.
  12. Повторный обзор рассмотренных алгоритмов.
Автор книги Toby Segaran является также соредактором книги Beautiful Data и соавтором книги Programming the Semantic Web. Книга Beautiful Data, судя по оглавлению, очень интересна.


Sunday, November 20, 2011

Metacomputation: Metasystem transitions plus supercompilation

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

Мне эта статья очень помогла в понимании предыдущих работ В.Ф. По крайней мере здесь очень понятно описаны две вещи, которые встречаются и в более ранних статьях:
  1. Объяснена нотация для графов конфигураций: (x → s.1 x)(s.1 → ‘a’) (y‘b’ ← y) – она используется во многих других работах, но у меня часто от нее оставалось ощущение недопонимания. Здесь еще мешает пониманию стремление Турчина написать (x → s.1 x), а не (x → s.1 x1) - то есть повторно использовать ту же самую переменную, экономя на именах.
  2. Стало понятно, что же такое walk grammar и почему они лучше получаются для плоского языка (в общем случае walk grammar является context-free, а для плоского языка она regular).
Теперь с новыми силами можно перечитать курантовский отчет.

Saturday, October 29, 2011

Знали ли вы, что ...

На маке, когда включена русская раскладка, нажатие alt дает те же спецсимволы в верхнем (цифровом) ряду клавиатуры, что и нажатие shift в английской раскладке:



Wednesday, October 5, 2011

Groovy


Начал использовать его в продакшн. Как оказалось, очень-очень интересный и практичный язык. Жаль, что я познакомился с ним так поздно.

Эклипсовский плагин для Groovy хорош, быстр и не глючит.

Из книжек рекомендую Programming Groovy - из-за размера: всего 300 страниц текста, прочитывается за пару дней.

Дальше, конечно, Groovy in Action (включая второе издание) - однако, данная книжка порой слишком многословна.

Thursday, July 7, 2011

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

Learn You a Haskell for Great Good!

Лучшая книга (из прочитанных мной) по Хаскелю. Основное достоинство - осмысление накопленного опыта (community). Именно в таком порядке и должно быть: Functor, Applicative Functor, Monoid, Monad.


По духу и въедливости напоминает "Thinking in Java". Начинается (как кажется) книжка весьма банально. Однако, не успеваешь оглянуться, как автор уже объясняет type lambda и <:<


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


Содержание всей книжки рассказывается (и показывается) максимум за 2 часа. Нужно пролистать и попробовать примеры.