Как стать автором
Обновить
14
0
Егор Назаркин @nimnull

Пользователь

Отправить сообщение

Латентно-семантический анализ

Время на прочтение4 мин
Количество просмотров97K
Как находить тексты похожие по смыслу? Какие есть алгоритмы для поиска текстов одной тематики? – Вопросы регулярно возникающие на различных программистских форумах. Сегодня я расскажу об одном из подходов, которым активно пользуются поисковые гиганты и который звучит чем-то вроде мантры для SEO aka поисковых оптимизаторов. Этот подход называет латентно-семантический анализ (LSA), он же латентно-семантическое индексирование (LSI)

Латентно-семантический анализ

Читать дальше →
Всего голосов 104: ↑101 и ↓3+98
Комментарии27

Что такое свёрточная нейронная сеть

Время на прочтение13 мин
Количество просмотров264K


Введение


Свёрточные нейронные сети (СНС). Звучит как странное сочетание биологии и математики с примесью информатики, но как бы оно не звучало, эти сети — одни из самых влиятельных инноваций в области компьютерного зрения. Впервые нейронные сети привлекли всеобщее внимание в 2012 году, когда Алекс Крижевски благодаря им выиграл конкурс ImageNet (грубо говоря, это ежегодная олимпиада по машинному зрению), снизив рекорд ошибок классификации с 26% до 15%, что тогда стало прорывом. Сегодня глубинное обучения лежит в основе услуг многих компаний: Facebook использует нейронные сети для алгоритмов автоматического проставления тегов, Google — для поиска среди фотографий пользователя, Amazon — для генерации рекомендаций товаров, Pinterest — для персонализации домашней страницы пользователя, а Instagram — для поисковой инфраструктуры.


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


Задача


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


Читать дальше →
Всего голосов 91: ↑91 и ↓0+91
Комментарии74

Математика для искусственных нейронных сетей для новичков, часть 1 — линейная регрессия

Время на прочтение8 мин
Количество просмотров151K
Оглавление

Часть 1 — линейная регрессия
Часть 2 — градиентный спуск
Часть 3 — градиентный спуск продолжение

Введение


Этим постом я начну цикл «Нейронные сети для новичков». Он посвящен искусственным нейронным сетям (внезапно). Целью цикла является объяснение данной математической модели. Часто после прочтения подобных статей у меня оставалось чувство недосказанности, недопонимания — НС по-прежнему оставались «черным ящиком» — в общих чертах известно, как они устроены, известно, что делают, известны входные и выходные данные. Но тем не менее полное, всестороннее понимание отсутствует. А современные библиотеки с очень приятными и удобными абстракциями только усиливают ощущение «черного ящика». Не могу сказать, что это однозначно плохо, но и разобраться в используемых инструментах тоже никогда не поздно. Поэтому моей первичной целью является подробное объяснение устройства нейронных сетей так, чтобы абсолютно ни у кого не осталось вопросов об их устройстве; так, чтобы НС не казались волшебством. Так как это не математический трактат, я ограничусь описанием нескольких методов простым языком (но не исключая формул, конечно же), предоставляя поясняющие иллюстрации и примеры.

Цикл рассчитан на базовый ВУЗовский математический уровень читающего. Код будет написан на Python3.5 с numpy 1.11. Список остальных вспомогательных библиотек будет в конце каждого поста. Абсолютно все будет написано с нуля. В качестве подопытного выбрана база MNIST — это черно-белые, центрированные изображения рукописных цифр размером 28*28 пикселей. По-умолчанию, 60000 изображений отмечены для обучения, а 10000 для тестирования. В примерах я не буду изменять распределения по-умолчанию.
Читать дальше →
Всего голосов 54: ↑47 и ↓7+40
Комментарии43

Автоматизируем покупку Ж/Д билетов Укрзалізниці

Время на прочтение9 мин
Количество просмотров50K

Привет! Наверное, каждый из нас когда-то сталкивался с ситуацией, когда нужно срочно куда-то уехать, но все Ж/Д билеты уже раскуплены. В этой статье я расскажу о том, как я писал Telegram бота для отслеживания и покупки освободившихся билетов Укрзалізниці.


Как это работает


Для покупки железнодорожных билетов в Украине компания Укрзалізниця запустила ресурс http://booking.uz.gov.ua/. Ресурс удобен тем, что не нужно посещать кассы, чтобы забрать сам билет. Достаточно показать проводнику QR код с посадочного талона на экране смартфона либо распечатав на принтере.


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


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


В качестве интерфейса был выбран Telegram так как это новая платформа для меня и я хотел с ней немного разобраться. В качестве бонуса сразу получаем уведомления на мобильный, не задумываясь о push нотификациях или email'ах.
В качестве языка программирования был выбран Python.

Читать дальше →
Всего голосов 43: ↑34 и ↓9+25
Комментарии50

Механизмы контейнеризации: namespaces

Время на прочтение11 мин
Количество просмотров60K
namespaces

Последние несколько лет отмечены ростом популярности «контейнерных» решений для ОС Linux. О том, как и для каких целей можно использовать контейнеры, сегодня много говорят и пишут. А вот механизмам, лежащим в основе контейнеризации, уделяется гораздо меньше внимания.

Все инструменты контейнеризации — будь то Docker, LXC или systemd-nspawn,— основываются на двух подсистемах ядра Linux: namespaces и cgroups. Механизм namespaces (пространств имён) мы хотели бы подробно рассмотреть в этой статье.

Начнём несколько издалека. Идеи, лежащие в основе механизма пространств имён, не новы. Ещё в 1979 году в UNIX был добавлен системный вызов chroot() — как раз с целью обеспечить изоляцию и предоставить разработчикам отдельную от основной системы площадку для тестирования. Нелишним будет вспомнить, как он работает. Затем мы рассмотрим особенности функционирования механизма пространств имён в современных Linux-системах.
Читать дальше →
Всего голосов 42: ↑39 и ↓3+36
Комментарии0

Простой способ добавить Wi-Fi модуль к Raspberry Pi Zero

Время на прочтение1 мин
Количество просмотров15K

Выглядит не очень, но работает!

Прошло всего несколько суток после поступления Raspberry Pi Zero в продажу, а уже нашлись умельцы, которые расширили возможности этого мини-ПК. Пользователь с ником Shintaro смог добавить беспроводный модуль Wi-Fi к основному модулю. Сделал он это просто — подпаял Edimax WiFi USB Adapter. Подключение производилось к USB-контактам платы.

Корпус адаптера пользователь снял. Питание для модуля забирается с пинов PP1 и PP6 на обратной стороне платы. Это нерегулируемые выводы энергии по USB, так что работать с ними следует с осторожностью, чтобы не повредить подключаемое оборудование или саму ау. Некоторые недорогие USB-адаптеры могут подавать больше 5В, что чревато — вся схема может сгореть.
Читать дальше →
Всего голосов 12: ↑6 и ↓60
Комментарии11

Добавляем WiFi к Raspberry Pi всего за $2

Время на прочтение2 мин
Количество просмотров29K


Разного рода хаков для мини-ПК Raspberry Pi Zero, вышедшего в тираж пару недель назад довольно много. Правда, пока что большая часть — простенькие приемы, типа впайки WiFi модуля, что и хаком особо назвать нельзя. Сейчас начинают появляться более интересные вещи, среди которых — использование SDIO для добавления WiFi модуля. Причем USB при этом не используется, порт остается функциональным.

Пользователь Hackaday.io с ником ajlitt некоторое время задумался о возможности добавления WiFi модуля к таким платам, как Raspberry Pi A+ и Raspberry Pi Zero. Дело в том, что у Raspberry Pi B+, например, несколько USB портов, и один из них можно без проблем занять соотвествующим WiFi модулем. Но у Zero и A+ портов минимум, и подключать к ним WiFi модуль не всегда представляется возможным. Решение умельца оказалось довольно оригинальным. Дело в том, что у Raspberry Pi есть специальный GPIO-разъем с пинами, и к этому разъему можно подключать различные устройства, в том числе, и SDIO-девайсы. Эту особенность «малинки» и было решено использовать.
Читать дальше →
Всего голосов 21: ↑19 и ↓2+17
Комментарии11

Нейросеть на Python, часть 2: градиентный спуск

Время на прочтение16 мин
Количество просмотров59K
Часть 1

Давай сразу код!


import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim = (0.5,4)
synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
for j in xrange(60000):
    layer_1 = 1/(1+np.exp(-(np.dot(X,synapse_0))))
    layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
    layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
    layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
    synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
    synapse_0 -= (alpha * X.T.dot(layer_1_delta))

Часть 1: Оптимизация


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

Суть происходящего в том, что обратное распространение не вносит в работу сети оптимизацию. Оно перемещает неверную информацию с конца сети на все веса внутри, чтобы другой алгоритм уже смог оптимизировать эти веса так, чтобы они соответствовали нашим данным. Но в принципе, у нас в изобилии присутствуют и другие методы нелинейной оптимизации, которые мы можем использовать с обратным распространением:
Читать дальше →
Всего голосов 33: ↑28 и ↓5+23
Комментарии5

Нейросеть в 11 строчек на Python

Время на прочтение8 мин
Количество просмотров533K

О чём статья


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

Дайте код!


X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
syn0 = 2*np.random.random((3,4)) - 1
syn1 = 2*np.random.random((4,1)) - 1
for j in xrange(60000):
    l1 = 1/(1+np.exp(-(np.dot(X,syn0))))
    l2 = 1/(1+np.exp(-(np.dot(l1,syn1))))
    l2_delta = (y - l2)*(l2*(1-l2))
    l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
    syn1 += l1.T.dot(l2_delta)
    syn0 += X.T.dot(l1_delta)


Слишком сжато? Давайте разобьём его на более простые части.
Читать дальше →
Всего голосов 47: ↑44 и ↓3+41
Комментарии17

Простой метапоисковый алгоритм на Python

Время на прочтение3 мин
Количество просмотров20K

Лирическое отступление


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

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

Когда лень работать руками


Первая и самая очевидная для меня мысль – написать простой метапоисковый алгоритм на Python. Другими словами, вся автоматизация сводится к использованию выдачи другой поисковой машины (Google Search) за неимением своих баз данных. Сразу оговорюсь, есть уже готовые библиотеки, решающие подобную задачу, например pygoogle.
Читать дальше →
Всего голосов 18: ↑12 и ↓6+6
Комментарии10

58 признаков хорошего интерфейса

Время на прочтение16 мин
Количество просмотров380K
У хорошего интерфейса пользователя высокая конверсия и его просто использовать. То есть, он хорош и для бизнеса, и для использующих его людей. Вот список опробованных нами идей.

1 Один столбец вместо нескольких


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

image
Читать дальше →
Всего голосов 226: ↑182 и ↓44+138
Комментарии102

Почему писать приложения под N900 выгодно!

Время на прочтение7 мин
Количество просмотров2.1K
За последнее время Nokia сделало очень много шагов, которые должны сделать привлекательной платформы от Nokia. И я просто не могу обойти стороной это событие и резюмирую все, что мне показалось значительным и полезным.
image

Если честно, я даже не надеялся, что такой гигант так быстро и просто сможет перестраиваться под рынок. Но последние два года показали, что Nokia серьезно намерена удерживать свои позиции на мобильном рынке и будет бороться. Вот последняя неделя меня просто удивила и обрадовала событиями.
Как тут уже писали ранее вышел релиз Qt Nokia SDK для Windows и Linux и бета для Mac Os. Но на этом радости только начинаются.

Читать дальше →
Всего голосов 68: ↑44 и ↓24+20
Комментарии198

Упорядочивание значков на рабочем столе Windows

Время на прочтение1 мин
Количество просмотров1.9K
Совершенно случайно наткнулся на интересную программку.

Обратил я на нее внимания из-за до боли знакомой картинки, но в новом оформлении.

Описание программки гласит, что она призвана помочь разобраться в месиве ярлыков на рабочем столе операционной системы.

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

image

И что мы видим? ПРАВИЛЬНО! Это же Windows 3.11 для рабочих групп ))))

Собственно программка называется Fences. Весит сравнительно немного (6,35 Мб). Работает под Windows 2003, Windows Vista, Windows XP.

Сайт — www.stardock.com/products/fences
Всего голосов 34: ↑21 и ↓13+8
Комментарии14

10 признаков php-приложения «с душком»

Время на прочтение3 мин
Количество просмотров924
Если вы заказываете приложения сторонним разработчикам, обязательным условием является оценка его качества после того, как разработчик передал код вам. Вы можете быть гуру в программном обеспечении, тогда эта статья не для вас, но если вам нужно несколько простых пунктов, оценки качества, то вот они:
Читать дальше →
Всего голосов 154: ↑65 и ↓89-24
Комментарии76

Дерево категорий с чекбоксами на JQuery

Время на прочтение2 мин
Количество просмотров1.6K

Begin



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

Написал такое вот деревце. Реализовал в виде плагина к любимому JQuery )

Что умеет:


  • Если указан пустой див — загружает из указанного скрипта все категории, и подкатегории(вложенные ul, если li имеет класс folder и не имеет вложенного списка(ul) — дерево будет автоматом подгружать этот список из указанного скрипта с указанной глубиной рекурсии(это забота скрипта выдавать запрашиваемые данные с требуемыми параметрами).
  • Если указан готовый список — то можно сворачивать/разворачивать подкатегории, отмечать нужные, которые будут подсвечены заданным классом
  • Получать выбранные номера категорий (value чекбоксов) в массиве
  • Возможность поиска по всем загруженным веткам дерева, вывод результата поиска в указанный див(указывается див для поиска, в котором строка для ввода запроса + див(пустой) для вывода результатов)
  • Число результатов поиска можно ограничить (в параметрах)
  • При клике на одном из найденных результатов — дерево открывается чтобы отобразить заданную ветку и она подсвечивается классом(указывается в параметрах)
  • Можно задать чтобы при клике на родительской категории — внутренние также выделялись
  • Можно задать сообщение которое выдается при попытке выделить лишний чекбокс если число их ограничено.


Вроде ничего не забыл )

Параметры:
Читать дальше →
Всего голосов 14: ↑12 и ↓2+10
Комментарии10

«Пилим» FLAC

Время на прочтение6 мин
Количество просмотров3.6K
На одном большом всем известном трекере люди стали частенько делиться своими копиями дисков, в формате flac/ape/wavepack(wv) с файлом-cue.
На деле — всё гладко. Действительно, есть и плееры, поддерживающие всё это дело, и действительно это всё работает. НО.
Мои увлечения связаны с электронной клубной музыкой, соответственно ради одного-двух треков целиком диски нарезать перед вечеринкой не хочется(лучше сделать свои грамотные сборники), плюс еще хотелось чтобы привести все файлы к одному формату, а именно FLAC — т.к. новые прогрессивные программы(Ableton Live) и плееры(ipod (с особой прошивкой, либо тач с софтом/cowon) его поддерживают.

Итак, еще раз, задача — имеются diskname.flac + diskname.cue, из них нужно получить много треков с тэгами и внятными названиями файла(Название артиста, номер трека, название трека) + плейлист.

Для примера я взял дистрибутив debian lenny (5.0). Видимо, для пользователей *buntu и других, основанных на debian дистрибутивах команды тоже будут верны.
Читать дальше →
Всего голосов 18: ↑16 и ↓2+14
Комментарии32

Обработка запросов в ASP.NET MVC

Время на прочтение7 мин
Количество просмотров21K
Попробую внести свою лепту в освоение относительно неосвоенного фреймворка ASP.NET MVC и предлагаю вашему вниманию перевод отрывка из книги "Pro ASP.NET MVC Framework" под названием «The Request Processing Pipeline».

***

Давайте рассмотрим, что происходит в режиме runtime, когда ASP.NET MVC обрабатывает входящий запрос.

Конвейер обработки запросов в ASP.NET MVC сравним с жизненным циклом страницы в ASP.NET WebForms в том, что он отображает анатомию системы. Понимание этого процесса необходимо для выполнения каких-либо нестандартных задач. В отличие от традиционного жизненного цикла страницы в ASP.NET, конвейер обработки запросов в MVC очень гибок – можно изменить любую его часть так, как вам хочется, и даже перераспределить или заменить некоторые компоненты. Хотя обычно не приходится расширять или изменять конвейер, можно сделать это в любой момент, потому как расширяемость лежит в основе ASP.NET MVC.
Читать дальше →
Всего голосов 12: ↑10 и ↓2+8
Комментарии20

Colobot и Ceebot

Время на прочтение5 мин
Количество просмотров34K
ГеймпадВ мире всегда существовали некоторые закрытые общества, которые доступны только ограниченному кругу людей. Для того, чтобы попасть туда нужно было обладать чем-то необычным. Например, ездить на Bentley или курить Behike.

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

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

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

P.S. Создал открытый блог Игры для программистов.

Читать дальше →
Всего голосов 130: ↑125 и ↓5+120
Комментарии47

ejabberd+AD+Shared Roster

Время на прочтение10 мин
Количество просмотров4.7K
Доброго времени суток.

Для начала что мы имеем: небольшую сеть на ~150 машин, в основном с ОС Windows XP, домен, поднятый естественно на Windows 2k3 и нормальную машинку(или сервер) на которой установлен gentoo linux (опционально MySQL).

Задача: Установить jabber сервер, сделать общий ростер, с группами из AD, прикрепить к нему icq гейт и поставить jabber клиенты на рабочие машины.
Читать дальше
Всего голосов 12: ↑12 и ↓0+12
Комментарии6

C# + WPF + сторонние сборки -> один .exe-шник

Время на прочтение3 мин
Количество просмотров25K
Бывает приходится разработать маленькое приложение на C# и WPF, однако в следствие использования сторонних сборок(например SharpZipLib, Unity) — получается так что на выходе у нас кроме нашего маленького .exe-шника получается ещё и куча .dll-ок, а нам нужно чтобы был именно один .exe-шник.
Читать дальше →
Всего голосов 18: ↑14 и ↓4+10
Комментарии12
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Киев, Киевская обл., Украина
Дата рождения
Зарегистрирован
Активность