Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-06-26

PCA


После линейной регрессии была логистическая регрессия. А потом начались нейросети — Neural Networks. Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning). А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA).

Сегодня разберем тему снижения размерности.

Dimensionality Reduction — штука довольно занятная в контексте Machine Learning, ибо, в отличие от предсказания злокачественности опухоли с помощью нейросети, к примеру, не несет непосредственной пользы. А вот опосредованно вполне может пригодится.
Одно из применений снижения размерности — сжатие данных. Было в вашем наборе данных две характеристики, а мы оставим одну — сжали данные вдвое.
Другое применение — ускорение обучения машины. Вместо обработки матриц 10000х100500000 можно обрабатывать матрицы 1000х100500000, это будет заметно быстрее.

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

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

Задача может показаться похожей на линейную регрессию, но это не так. И Cost Function другая и в датасете нет деления на переменные и цель/значение (X, Y). Все фичи датасета – это X. Таким образом, снижение размерности относится к разряду Unsupervised Learning, в отличие от линейной регрессии, относящейся к Supervised Learning.

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

Математически это делается так:
найти для датасета Covariance Matrix (ковариантную матрицу) — матрица n,n из суммы произведений фич;
найти Eigenvectors (эйгенвекторы) aka «singular value decomposition» этой матрицы.
Первые K векторов из матрицы U в полученных эйгенвекторах — это и будут искомые векторы уменьшенной размерности.
Умножив транспонированную матрицу из этих векторов на данные датасета, мы получим новый, сжатый датасет, что и требовалось.
Нихрена неясно, зато математически кратко выражено.

Ну и в завершение — а какую бы нам выбрать новую, маленькую, хорошую размерность? Для визуализации данных это не вопрос, тут либо 2, либо 3. А вот для сжатия данных надо выбирать новую размерность осторожно, обдуманно.

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

Ошибка вычисляется как сумма квадратов X - Xapprox поделенная на сумму квадратов X. Ну, не совсем X, конечно, там проекции и длины векторов, см.картинки.
Но для такого вычисления нам надо уметь «восстанавливать» исходное значение Х — разжимать данные обратно, получая Xapprox.

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

Вот и все уменьшение размерности методом PCA. Ковариантная матрица, ейгенвекторы и перемножение пары матриц — математическая запись очень лаконична. А что под капотом — нам не объясняли.


Чуть не забыл. В практическом упражнении мы применили PCA для сжатия данных. На входе был набор картинок 32х32 пикселя — изображения лиц людей. А на выходе мы, определив 36 pricipal components, получили картинки 6х6 пикселей. Только это уже как бы и не картинки, это именно наиболее важные области картинок, отвечающие на наибольшую вариативность — чем лица отличаются одно от другого.

А потом, определив 100 PC, получили картинки 10х10, разжав которые обратно получили ошеломляющий результат — см.иллюстрацию.



original post http://vasnake.blogspot.com/2014/06/pca.html

2014-06-25

K-Means


После линейной регрессии была логистическая регрессия. А потом начались нейросети — Neural Networks. Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning). А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA). Тему снижения размерности мы отложим на потом. Сегодня поглядим на алгоритм кластеризации под названием K-Means.

Clustering (кластеризация) это класс проблем из раздела Unsupervised Learning, в отличие от рассмотренных ранее, относящихся к Supervised Learning. Принципиальная разница между этими двумя разделами заключается в том, что в проблемах Supervised Learning данные для обучения всегда содержат ответ (метку, label). Нет, так неясно. Давайте так: в тренировочном наборе данных для обучения распознаванию рукописных цифр всегда есть значение цифры изображенной на распознаваемой картинке. Если еще проще, то машина строит догадку – «это цифра 3», а супервайзер бьет ее по рукам линейкой и рявкает – «дура, это цифра 5», после чего машина корректирует коэффициенты в вычислениях, чтобы следующий раз угадать точнее.

А вот в проблемах Unsupervised Learning никаких готовых ответов нет. Есть только наборы данных и их надо как-то структурировать. Например разложить по кучкам согласно некоей общности характеристик (features). Эти кучки и будут кластеры, а процесс отнесения записей данных в тот или иной кластер — кластеризация.

Так как же делается кластеризация? Один из наиболее употребимых алгоритмов называется «K-Means Algorithm».

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

Теперь машина итеративно, до схождения (или ограничения по количеству циклов/времени) делает два шага:

1. Распределяет точки по кластерам (двум, в примере) по принципу близости к центроиду. Cluster Assignment Step.

2. Двигает центроиды кластеров (точки по плоскости) в центр/среднее положение в кластере (облаке точек). Move Centroid Step.


Всё, вот и весь алгоритм.

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

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

Теперь вопрос — а как назначить оптимальное количество кластеров? Ответ очевиден — посчитать Cost Function для разного количества кластеров, построить график и заценить, где на графике происходит резкий (относительно) переход. Это будет метод локтя (Elbow Method).

А вообще-то, обычно количество кластеров назначают вручную, исходя из предполагаемого применения результата. Например разбиение размеров футболок по группам (S, M, L, XL) или (S, SM, M, L, XL, XXL) — что лучше для бизнеса продажи футболок — 4 размера для упрощения производства или 6 размеров для более точного подгона одежды по фигуре?

Что любопытно, в практическом задании мы применяли кластеризацию (K-Means) для сжатия картинок. Уменьшалась цветовая палитра (до 16 цветов) и, как итог, размер файла изображения. Приблизительно в шесть (6) раз.
Фактически, пиксели группировались в 16 кластеров в контексте похожести/близости цвета, после чего группам пикселов присваивался некий «средний» для группы цвет.

Получилось забавно.

 


original post http://vasnake.blogspot.com/2014/06/k-means.html

2014-06-24

C10K

Случайно наткнулся на замечательную статью, в которой содержится обзор и оценка разных подходов к вопросу — а как нам обеспечить 10 000 одновременных соединений (сетевых сессий) на одной машине:

Читал, не мог оторваться, просто как детектив какой-то. Масса информации.

А вышел я на эту статью разглядывая вот эти слайды:
Заголовок провокационный, да. Вообще, презентация способна вызвать немало баттхерта у незрелых личностей. Сначала речь идет о реальной асинхронности ввода/вывода в противовес имитируемой через event loop. Потом делается плавный переход от пула реально асинхронных потоков операционной системы (MS Windows) к обработчикам сетевых протоколов, написанных на Python (Python/C API). Изящно.

А чтобы обеспечить thread-safety и не упираться в GIL, PyParallels делает ход конем: проверяет – главный поток выполняется или нет и если нет — работает в обход GIL, перехватывая thread-sensitive вызовы ядра Python.

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

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

During the fall of 2012, a heated technical discussion regarding asynchronous programming occurred on python-ideas. One of the outcomes of this discussion was Tulip, an asynchronous programming API for Python 3.3, spearheaded by Guido van Rossum. A lesser known outcome was PyParallel: a set of modifications to the CPython interpreter that allows Python code to execute concurrently across multiple cores.
Twisted, Tulip, Gevent, Stackless/greenlets and even node.js are all variations on the same pattern for achieving "asynchronous I/O": non-blocking I/O performed on a single thread. Each framework provides extensive mechanisms for encapsulating computational work via deferreds, coroutines, generators and yield from clauses that can be executed in the future when a file descriptor is ready for reading or writing.
What I found troubling with all these solutions is that so much effort was being invested to encapsulate future computation (to be executed when a file descriptor is ready for reading or writing), without consideration of the fact that execution is still limited to a single core.
PyParallel approaches the problem in a fundamentally different way. Developers will still write code in such a way that they're encapsulating future computation via the provided APIs, however, thanks to some novel CPython interpreter modifications, such code can be run concurrently across all available cores.


PyParallel - How We Removed the GIL and Exploited All Cores (Without Needing to Remove the GIL at all) - Trent Nelson from PyData on Vimeo.


Несколько слайдов, чиста для иллюстрации темы:





original post http://vasnake.blogspot.com/2014/06/c10k.html

2014-06-23

mp3 splitter

В нынешние непростые времена я на своем iPod слушаю аудиокниги. Живучая, кстати, скотина. Судя по моему блогу, пользуюсь я этой iPod-кой уже лет 8, а она все не сдохнет.
Так вот, аудиокниги бывают нарезаны большими файлами, по часу и более, что очень неудобно, если надо перемотать на какое-то определенное место в записи. Уж очень долго и небыстро работает кнопка fastforward в этом мегадевайсе. Поэтому для меня наиболее удобный размер одного файла аудиокниги — минут 10-30 воспроизведения. Соответственно, иногда приходится нарезать большие файлы на пачки маленьких.

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

Короче, предлагаю вашему вниманию достойного представителя программ класса «я нарежу ваши mp3 файлы»:
Просто и со вкусом. Что надо — работает, а остального нет.


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


original post http://vasnake.blogspot.com/2014/06/mp3-splitter.html

2014-06-21

В Строгино дует

Пятница, 20 июня 2014 года — опять прекрасная погода! Местами солнечно, в целом тепло — около 20 градусов тепла и, самое главное, ветер до 12 метров в секунду. Хорошими такими, длинными порывами.
Сегодня опять получилось выскочить на бластинг на парусе 6 метров, во какой ветер.

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

Отличная погода. И не жарко.



original post http://vasnake.blogspot.com/2014/06/blog-post_21.html

2014-06-20

Blue Jasmine

Давеча отсмотрел фильму «Жасмин», что в оригинале Blue Jasmine (2013).
Директор картины, он же писатель (сценарист) — Вуди Аллен (Woody Allen). В главной роли — Электродрель (Галадриэль) Cate Blanchett.

История про дамочку, вкрутившуюся когда-то в высший свет, удачно выйдя замуж за прохиндея и мошенника, которого играет сам Алек Болдуин (Alec Baldwin).

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


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


original post http://vasnake.blogspot.com/2014/06/blue-jasmine.html

2014-06-19

Certificate

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

Coursera
Stanford University
Machine Learning

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

Теперь я сертифицированный специалист по Machine Leraning (как бы).



original post http://vasnake.blogspot.com/2014/06/certificate.html

2014-06-18

Get a job at Google

По некоторым сведениям, на работу в Google берут одного из 130 претендентов. Высокий конкурс. При этом 14% работников не имеют высшего образования — гении, вероятно.
Высоко ценятся « T-shaped» профессионалы, обладающие глубокими познаниями в определенной области, но, кроме того, знающие массу всякого обо всяком.

Короче, посмотрите инфографику

А вот так представляли найм на работу в Google в 2011 году


А вот и вкусняшка:
Answers To 15 Google Interview Questions That Will Make You Feel Stupid

Если интересно, вот еще подборка каверзных вопросов, 140 штук:

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



original post http://vasnake.blogspot.com/2014/06/get-job-at-google.html

2014-06-17

Plone + webcam

Озаботился я тут на днях одной проблемой. Суть проблемы в том, что хочется показывать на веб-странице картинки с веб-камеры. Очевидно, проблеме сто лет в обед и решается она двумя сниппетами кода
HTML
<img id="myimg" src="url to webcam.jpg">
и JS
function showImageFromWebcam() {
    var now = new Date();
    var stamp = parseInt(now.getTime() / 2000, 10);
    $('#myimg').attr('src', "http://clubwindsurf.info/ftpfiles/webcam.jpg?" + stamp);
    setTimeout(showImageFromWebcam, 2000);
}
setTimeout(showImageFromWebcam, 2000);

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

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

Недолгое гугление и игра с jsfiddle привели к следующему решению:
// правильная загрузка картинок с веб-камеры
// http://stackoverflow.com/questions/11632278/use-page-specific-css-in-plone
// http://jsfiddle.net/623rB/13/
// http://jqueryfordesigners.com/image-loading/
// http://docs.plone.org/adapt-and-extend/theming/templates_css/css.html

// HTML
<div id="loader" class="loading"></div>

// CSS
DIV#loader {
    border: 1px solid #ccc;
    width: 640px;
    height: 480px;
}
/**
 * While we're having the loading class set.
 * Removig it, will remove the loading message
 */
 DIV#loader.loading {
    background: url(http://jqueryfordesigners.com/images/spinner.gif) no-repeat center center;
}

// JS
function showImageFromWebcam() {
    var now = new Date();
    var stamp = parseInt(now.getTime() / 2000, 10);

    var img = new Image();

    // wrap our new image in jQuery, then:
    $(img)
    // once the image has loaded, execute this code
    .load(function () {
        // set the image hidden by default
        $(this).hide();

        // with the holding div #loader, apply:
        $('#loader')
        // remove the loading class (so no background spinner),
        .removeClass('loading')
        // then insert our image
        .empty().append(this);

        // fade our image in to create a nice effect
        //$(this).fadeIn(200);
        $(this).show();
        setTimeout(showImageFromWebcam, 2000);
    })

    // if there was an error loading the image, react accordingly
    .error(function () {
        // notify the user that the image could not be loaded
        setTimeout(showImageFromWebcam, 1333);
    })

    // *finally*, set the src attribute of the new image to our image
    .attr('src', "http://clubwindsurf.info/ftpfiles/cam_1.jpg?" + stamp);
}

setTimeout(showImageFromWebcam, 2000);

Результат можно наблюдать тут http://clubwindsurf.info/webcam

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

Сделать Plone add-on (http://plone.org/products) с названием типа «Живые снимки с веб-камеры» / «Webcam images live».
Этот аддон (viewlet, portlet, document — пока не решил) спрашивает — где брать картинку, размер картинки (можно и автоматом детектировать), периодичность обновления. После чего вставляет на страницу вышеупомянутый код обновления изображения.

Удивительно, но ничего готового на эту тему я не нашел.

Кстати, в сети нашелся вот такой интересный материал:
Plone, HTML 5 Canvas and Face Detection with Webcam

Добрый человек сделал прототип распознавателя лиц (на базе openCV) в виде аддона к Plone. По сути, он игрался с новыми API в HTML5.



original post http://vasnake.blogspot.com/2014/06/plone-webcam.html

2014-06-16

Neural Net Flaws

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

«Intriguing properties of neural networks»

На i-programmer есть статья об этой работе:

What has been discovered is that a single neuron's feature is no more interpretable as a meaningful feature than a random set of neurons. That is, if you pick a random set of neurons and find the images that produce the maximum output on the set then these images are just as semantically similar as in the single neuron case.
This means that neural networks do not "unscramble" the data by mapping features to individual neurons in say the final layer. The information that the network extracts is just as much distributed across all of the neurons as it is localized in a single neuron.
This is an interesting finding and it leads on to the second and even more remarkable finding..
Every deep neural network has "blind spots" in the sense that there are inputs that are very close to correctly classified examples that are misclassified.

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

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

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

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

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

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

Очень ценное изобретение, ящетаю.


original post http://vasnake.blogspot.com/2014/06/neural-net-flaws.html

Каталка в Строгино

11 июня 2014 года днем было очень неплохо. Ветер 5-10 м/с, порывистый, с севера с заворотами на запад. Трудно на таком ветру кататься, надо быть постоянно готовым к выкрутасам.
Зато я опять вышел на бластинг на нашем парусочке шестиметровом. Пацаны гоняют на 8-9 метровый парусах, а я, такой, на шестерке — вжжжжииик...
Прохватил через половину поймы, такой кайф!

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

Отлично покатались.

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



original post http://vasnake.blogspot.com/2014/06/blog-post_16.html

2014-06-11

Укладка

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


Попробуйте, это офигительно легко. Я проверил.



original post http://vasnake.blogspot.com/2014/06/blog-post.html

2014-06-10

Carrie

Намедни отсмотрел две фильмы по Стивену Кингу:
«Телекинез» 2013, что в оригинале Carrie (2013) и
«Кэрри» 1976, что в оригинале Carrie (1976).


Более свежий фильм это римейк более старого. Несмотря на то, что рейтинг на imdb выше у старого фильма, лично мне современная экранизация понравилась больше. Зрелищнее, динамичнее, что-ли. А если учесть, что подручного главгадины в версии 1976 года играет Джон Траволта (John Travolta), то понятно, почему роль главгадины такая неубедительная.

Кстати, если верить тому же imdb, это первая роль Траволты на большом экране.


В общем, если вы тащитесь от Стивена Кинга и любите драмы про несправедливость, убогих и отмщение — можете смотреть. Рекомендую римейк 2013 года в таком случае. А так — ничего цепляющего.

Одно наблюдение: в фильме 1976 года в кадре не встречается почти ни одного цветного. Все сплошь белые европо-американцы. К чему бы это?


original post http://vasnake.blogspot.com/2014/06/carrie.html

2014-06-09

TrueCrypt всё?

Демократия на марше:

На официальном сайте популярной системы дискового шифрования TrueCrypt опубликовано заявление, что система не является безопасной и может содержать уязвимости. Более того, сообщается, что с мая 2014 года разработка TrueCrypt прекращена. В то же время выпущен финальный релиз TrueCrypt 7.2, который рекомендуется использовать только в качестве промежуточного звена при миграции на другие системы.

Очень жаль, я его использую https://www.google.ru/search?q=truecrypt+site%3Avasnake.blogspot.com

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

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

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

Как можно договариваться имея такой разный базис?


original post http://vasnake.blogspot.com/2014/06/truecrypt.html

2014-06-06

Вудгпу (Deluge)

Некоторое время тому, я написал, как пропатчить KDE под FreeBSD код Deluge, чтобы рутрекер его не банил (http://vasnake.blogspot.ru/2014/02/deluge-136-rutracker-patch.html).

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

$ Traceback (most recent call last):
  File "/opt/deluge/deluge-1.3.6/env/bin/deluge-gtk", line 9, in <module>
    load_entry_point('deluge==1.3.6', 'gui_scripts', 'deluge-gtk')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 356, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2431, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2147, in load
    ['__name__'])
  File "/opt/deluge/deluge-1.3.6/deluge/ui/gtkui/__init__.py", line 1, in <module>
    from gtkui import start
  File "/opt/deluge/deluge-1.3.6/deluge/ui/gtkui/gtkui.py", line 79, in <module>
    from torrentview import TorrentView
  File "/opt/deluge/deluge-1.3.6/deluge/ui/gtkui/torrentview.py", line 52, in <module>
    from deluge.ui.tracker_icons import TrackerIcons
  File "/opt/deluge/deluge-1.3.6/deluge/ui/tracker_icons.py", line 51, in <module>
    from deluge.httpdownloader import download_file
  File "/opt/deluge/deluge-1.3.6/deluge/httpdownloader.py", line 35, in <module>
    from twisted.web import client, http
  File "/usr/lib/python2.7/dist-packages/twisted/web/client.py", line 38, in <module>
    from twisted.web.iweb import UNKNOWN_LENGTH, IAgent, IBodyProducer, IResponse
  File "/usr/lib/python2.7/dist-packages/twisted/web/iweb.py", line 19, in <module>
    from twisted.cred.credentials import IUsernameDigestHash
  File "/usr/lib/python2.7/dist-packages/twisted/cred/credentials.py", line 13, in <module>
    import hmac, time, random, re
  File "/usr/lib/python2.7/hmac.py", line 8, in <module>
    from operator import _compare_digest as compare_digest
ImportError: cannot import name _compare_digest

Что делать, куда бежать?
Как обычно, недолгое гугление привело к описанию бага, связанного с тем, что на платформе (Debian Jessie/testing) обновили Python:

if you are using virtualenv then you have to rebuild your virtual
environment
e.g.
$ virtualenv /path/to/your/virtualenv/

Очевидно (http://vasnake.blogspot.ru/2014/02/deluge-136-rutracker-patch.html) патченый Deluge я поставил используя virtualenv. Соответственно, проблема устраняется как прописано доктором:

$ pushd /opt/deluge/deluge-1.3.6/
$ virtualenv --system-site-packages env


И всё заверте...


original post http://vasnake.blogspot.com/2014/06/deluge.html

2014-06-05

SVM, Kernels


После линейной регрессии была логистическая регрессия. А потом начались нейросети — Neural Networks. Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning). А потом нам рассказали про Support Vector Machines (SVMs) и Kernels. Это по типу логистической регрессии, только лучше, по крайней мере, в некоторых случаях.

SVM еще называют Large Margin Classificators, потому как результатом применения SVM становится такое решение классификатора, которое проводит разделительную черту между классами так, чтобы расстояние до черты было наибольшим. То есть SVM строит наиболее качественный классификатор (если применять метод правильно).

Основная идея SVM классификатора в том, что Cost Function несколько мофицируется, с тем, чтобы обеспечить обнуление цены при пороговых значениях полинома гипотезы.

Математика, стоящая за оптимизацией такой интересной Cost Function построена на работе с векторами их проекциями и длинами. Возможно поэтому метод и называется Support Vector Machine. При этом есть достаточное количество хороших библиотек для использования SVM «из коробки».

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

Но тут в тему ворвались Kernels. Как нам обьяснили, SVM + Kernels это прекрасно, ибо, в отличие от логистической регрессии или нейросетей, машина перемалывает вычисления этого комбо сравнительно быстро. И есть огромный плюс — легкость получения нелинейных классификаторов.

Что же такое Kernels? Это способ определения фич (переменных модели, коэффициентов полинома) для полинома в тех случаях, когда нужна нелинейная модель. Традиционно в этих случаях применяют создание новых фич из имеющихся путем возведения в степень — квдрат, куб и т. д. Но можно применить Kernels.

Если на пальцах, то Kernel Function это функция похожести (similarity) одной записи датасета на другую. Только в алгоритме вычисляют похожесть между записями датасета и «landmarks». Лендмарки — это набор точек в пространстве датасета. Если проще — образцовые записи из датасета.

И если в полиноме гипотезы заменить исходные фичи на значения этих Kernel Functions, то получим метод Kernels для вычисления значений гипотезы, и как результат оптимизации Cost Function для этой гипотезы — нелинейный классификатор.

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

Тем не менее, считается, что для некоторых случаев SVM + Kernels это здорово и круто.

Обычно применяют Gaussian Kernels — функция похожести дает холм Гауссова распределения.

Есть еще часто применяемый linear kernel aka no kernel, который дает обычный линейный классификатор.

В общем, если количество фич относительно мало, до 1000, а количество записей данных достаточно, первые десятки тысяч — можно использовать SVM + Gaussian Kernel. И это позволить выработать достойный нелинейный классификатор.

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


В практическом занятии мы строили распознавалку спама, используя SVM + Gaussian Kernel.


original post http://vasnake.blogspot.com/2014/06/svm-kernels.html

2014-06-04

Counselor

На днях отсмотрел фильму «Советник», что в оригинале The Counselor (2013).
Директор (режиссер) сам Ridley Scott. Злого гения играет Cameron Diaz. История про возню вокруг масштабного наркотрафика (бочками).

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


Ерунда.

Чуть не забыл, Brad Pitt там тоже есть.


original post http://vasnake.blogspot.com/2014/06/counselor.html

2014-06-03

Freedom

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

Свобода — это легкость выбора в сочетании с количеством доступных вариантов.

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

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

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

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

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

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


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


original post http://vasnake.blogspot.com/2014/06/freedom.html

2014-06-02

Каталка

Сегодня, 31 мая 2014 года, в Строгино была отменная каталка. Тепло, я катался без гидрокостюма, солнечно — позагорали, ветрено — всю дорогу дуло 6-8 м/с, временами до 10 м/с и, возможно, сильнее. С юго-востока.

Было, да, было — я сегодня вышел в Строгино на режим бластинга на парусе 6 квадратных метров! Правда, только один раз. Еще раза два просто немного поглиссировал. Хорошо, воды много, волн мало, летишь себе. Только иногда приходилось обруливать других поклонников водных видов спорта.
Изумительно покатались, почаще бы так.

А вода холодная, вряд ли выше 20 град.цельсия.



original post http://vasnake.blogspot.com/2014/06/blog-post_2.html

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) Baltic (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)