Все потоки
Поиск
Написать публикацию
Обновить
211.33

Алгоритмы *

Все об алгоритмах

Сначала показывать
Порог рейтинга
Уровень сложности

R, Монте-Карло и enterprise задачи, часть 2

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

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


Задачи в Enterprise достаточны компактны для перебора и не требует точности 100 знаков после запятой. Не ракеты или реакторы запускаем и не научную теорию всего строим.


Рассмотрим далее на примере одной из нестандартных задач.


Является продолжением серии предыдущих публикаций.

Читать дальше →

Продолжаем интернационализацию поиска по адресам с помощью Sphinx или Manticore. Теперь Metaphone

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

Это продолжение публикации «Интернационализация поиска по городским адресам. Реализуем русскоязычный Soundex на Sphinx Search», в которой я разбирал, как реализовать поддержку фонетических алгоритмов Soundex в Sphinx Search, для текста написанного кириллицей. Для текста на латинице поддержка Soundex уже есть. С Metphone аналогично, для латиницы есть, для кириллицы не очень, но попытаемся исправить этот досадный факт с помощью транслитерации, регулярных выражений и напильника.

Это прямое продолжение, в котором разберём как реализовать оригинальный Metaphone, русский Metaphone (в том смысле что транслитерация не понадобится), Caverphone, и не сможем сделать Double Metaphone.

Реализация подойдёт как для использования на платформе Sphinx Search, так и Manticore Search.

В конце, посмотрим как Metaphone воспримет "ракомакофон".

Продолжаем...

Недополученная прибыль на бирже из-за отключенного робота и лени

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

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

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

Читать далее

Рекомендации с обоснованием (2020). Часть первая

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

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

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

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

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

Читать далее

Кватернионы. Решение одной навигационной задачи

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

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

Читать далее

Группа разработчиков создала постквантовый алгоритм шифрования

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

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

Читать далее

DialoGPT на русском

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

(Кадр из фильма "Я, робот")

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

Читать далее

Как новый алгоритм преодолевает ограничение скорости решения линейных уравнений

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

Сантош Вемпала и Ричард Пенг из Технологического института Джорджии, придумали новый, более быстрый способ решения некоторых систем линейных уравнений, «рабочую лошадку современных вычислений». Используя случайность, новый алгоритм предлагает принципиально новый — и более быстрый — способ выполнения одного из самых простых вычислений в математике и информатике.

Читать далее

Дети, русский язык и R

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

Типичная ситуация в нынешнем образовательном процессе в школе. На часах 22:00, в электронном дневнике ребенка появляется новое задание. В лучшем случае на послезавтра, но обычно на завтра.


Вариантов реакции три:


  • не делать вовсе;
  • «не заметить» и отложить решение вопроса на потом;
  • попробовать сделать.

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


Выбирая третий вариант, в отдельных случах даже задания по русскому языку можно попробовать решить с помощью R, принимая во внимание, что на все про все есть 15-20 минут максимум. 5 минут на «экстремальное программирование», 10-15 минут на чистовое оформление. Когда принципиально задача решена оформление можно уже и утром сделать


Является продолжением серии предыдущих публикаций.

Читать дальше →

3D реконструкция лица, или как получить своего цифрового двойника (Часть 1)

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

Поговорим о методах 3D восстановления лица человека, которое почти не отличить от фотографий. Тема лицевой 3D реконструкции вот уже 2 года практически не освещается на Хабре. Тем временем область 3D digital human не только не теряет свою актуальность, но и переживает бурный научно-технологический рост. Так что будем регулярно выкладывать обзоры статей и результаты разных методов восстановления 3D-моделей человека по фотографиям.

Читать далее

Свой AR. Маркеры

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


Привет, Хабр.


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

Как преобразовать текст в алгебру

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

Как пишут тексты в Большой Академии в Лагадо

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

Читать далее

Свой AR. Основы векторной алгебры

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


В настоящий момент появилось достаточно большое количество библиотек дополненной реальности с богатым функционалом (ARCore, ARKit, Vuforia). Тем не менее я решил начать свой открытый проект, попутно описывая как это работает изнутри. Если повезет, то позже получится добавить какой-то особый интересный функционал, которого нет в других библиотеках. В качестве целевых платформ пока возьмем Windows и Android. Библиотека пишется на C++, и сторонние библиотеки будут задействованы по минимуму, т.е. преимущественно не будет использовано ничего готового. Фокус в статьях будет направлен на алгоритмы и математику, которые постараюсь описать максимально доступно и подробно. В этой статье пойдет речь про основы векторной алгебры.

Читать дальше →

Ближайшие события

Часть 1. MPI — Введение и первая программа

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

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

В основном используют 2 типа оптимизации, либо их смесь: Векторизация и распараллеливание вычислений. Чем же они отличаются?

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

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

Далее вы узнаете, что такое параллелизация и как пользоваться MPI на практике.

Читать статью далее

Решение Fizzbuzz при помощи теоремы Эйлера

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

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

Напишите функцию, выводящую список целых чисел от 1 до 100, но вместо каждого числа, кратного 3, она должна выводить «Fizz», а вместо каждого числа, кратного 5, выводить «Buzz». Вместо чисел, кратных и 3, 5, программа должна выводить «FizzBuzz»; все остальные числа должны выводиться без изменений.

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

  1. Имеющие делитель 3, но не 5
  2. Имеющие делитель 5, но не 3
  3. Имеющие делитель и 3, и 5
  4. Не имеющие делитель 3 и 5

Нам нужна функция, которая будет возвращать:

  • «Fizz», если $n \equiv 0 \pmod 3$ и $n$ является взаимно простым с 5
  • «Buzz», если $n \equiv 0 \pmod 5$ и $n$ является взаимно простым с 3
  • «FizzBuzz», если $n \equiv 0 \pmod 3$ и $n \equiv 0 \pmod 5$
  • $n$ во всех остальных случаях.

Рассмотрим реализацию такой функции на Python:

[(lambda n: { 1: n, 6: "Fizz", 10: "Buzz", 0: "FizzBuzz" }[n**4%15])(n+1) for n in range(100)]

Та же функция на Ruby:

(1..100).map{|n| {1 => n, 6 => "Fizz", 10 => "Buzz", 0 => "FizzBuzz"}[n**4%15] }

Как мы и ожидали, каждая из этих функций возвращает список целых чисел от 1 до 100 с подставленными в нужные места «Fizz», «Buzz» и «FizzBuzz».

Но почему? Откуда взялись постоянные значения 0, 6, 10 и 1? Почему $n^4 \mod 15$ возвращает 6 для чисел, кратных 3, но не 5, 10 для чисел, кратных 5, но не 3, 0 для чисел, кратных 5 и 3 и 1 во всех остальных случаях? И самое важное — справедливо ли это для любого $n$, которое мы выберем?
Читать дальше →

Детская сказка программисту на ночь

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

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


Репка - медаль

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

Читать дальше →

Устройство поисковых систем: базовый поиск и инвертированный индекс

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

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

В статье описано устройство поиска, инвертированного индекса и его оптимизаций с отсылками к теории. В качестве подопытного кролика взят Tantivy — реализация архитектуры Lucene на Rust. Статья получилась концентрированной, математикосодержащей и несовместимой с расслабленным чтением хабра за чашкой кофе, осторожно!
Читать дальше →

Разбиваем строку на подстроки по разделяющим символам своими руками

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

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

Вообще говоря, сама задача разбиения строк на подстроки, каждая из которых отделена в исходной строке определённым символом, является довольно распространённой. Очень часто необходимо извлечь из строки слова, разделённые пробелами. Конечно, в стандартной библиотеке языка Си уже есть функция strtok (заголовочный файл <string.h>), но она имеет свои побочные эффекты, перечисленные ниже.

Читать далее

Создание образа Мона Лизы в Игре «Жизнь»

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

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

Интернационализация поиска по городским адресам. Реализуем русскоязычный Soundex на Sphinx Search

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

Как много в вашем городе иностранных туристов? В моём мало, но встречаются, как правило стоят потерянные посреди улицы и повторяют одно единственное слово – название чего бы то ни было. А прохожие пытаются им на пальцах объяснить куда пройти, а когда «моя твоя не понимать» – берут за руку и ведут к пункту назначения. Как это не удивительно, обычно цель в пяти минутах ходьбы, т.е. какое-то примерное представление о городе эти туристы всё же имели. Может по бумажной карте ориентировались.

А как часто лично вы оказывались в такой ситуации, в незнакомом городе в другой стране?

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

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

В публикации опишу как реализовать фонетические алгоритмы поиска Soudex на движке Sphinx Search. Одной транслитерацией здесь не обойдётся, хотя и без неё никуда. Получившийся конфигурационный файл, доступен на GitHub Gist.

Длиннопост

Вклад авторов