Как стать автором
Обновить
4
0.1
Отправить сообщение

Линейный дискриминантный анализ (LDA). Принцип работы и реализация с нуля на Python

Уровень сложности Сложный
Время на прочтение 7 мин
Количество просмотров 3.5K

Линейный дискриминантный анализ (Linear Discriminant Analysis или LDA) — алгоритм классификации и понижения размерности, позволяющий производить разделение классов наилучшим образом. Основная идея LDA заключается в предположении о многомерном нормальном распределении признаков внутри классов и поиске их линейного преобразования, которое максимизирует межклассовую дисперсию и минимизирует внутриклассовую. Другими словами, объекты разных классов должны иметь нормальное распределение и располагаться как можно дальше друг от друга, а одного класса — как можно ближе.

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

Курс «PostgreSQL для начинающих»: #3 — Сложные SELECT

Уровень сложности Средний
Время на прочтение 12 мин
Количество просмотров 23K

Продолжаю публикацию расширенных транскриптов лекционного курса "PostgreSQL для начинающих", подготовленного мной в рамках "Школы backend-разработчика" в "Тензоре".

В этой лекции углубимся в расширенные возможности команды SELECT : как можно "сложить" и "вычесть" выборки (UNION/INTERSECT/EXCEPT), или запомнить и использовать в рекурсивных запросах (CTE), что дают оконные функции (WINDOW) и соединения (JOIN).

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

Читать далее
Всего голосов 36: ↑35 и ↓1 +34
Комментарии 7

История компьютерных стратегий. Часть 8. «Age of Empires»: шедевр геймдева, от которого бомбит у любителей истории

Уровень сложности Простой
Время на прочтение 15 мин
Количество просмотров 23K

В 1997 году в соревнование между Blizzard и Westwood Studios внезапно для всех ворвался новичок в лице Ensemble Studios. Её «Age of Empires» незамедлительно обозвали смесью «Warcraft» и «Civilization», и не случайно. Впервые в истории жанра RTS-игра претендовала на историчность и даже познавательность. Создатели предлагали игроку пройти путь развития за одну из двенадцати цивилизаций — от неолита до вынесенной в заголовок «эпохи империй», развитого железного века. Как итог, игра не просто зашла со свистом и стала основой для развивающейся по сей день серии, но и потеснила непобедимых, казалось бы, конкурентов. И всё же, при ближайшем рассмотрении, она способна погубить не один диван историка и просто любителя исторической науки путём неудержимого воспламенения штанов.
Читать дальше →
Всего голосов 99: ↑98 и ↓1 +97
Комментарии 18

Разработка стековой виртуальной машины и компилятора под неё (часть I)

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

Так сложилось, что за последние 18 лет, не приходилось писать на C/C++. На работе использовалась Java, да и ввиду должностей деятельность больше была связана с предпринимательством - переговоры, корпоративные продажи, выстраивание производственных операций и структурирование инвестиционных сделок. Захотелось в свободное от работы время восстановить навыки, размять часть мозга которую не напрягал все 18 лет и, естественно, начать с самых основ. Осталось придумать себе задачу.

В универе преподаватели, молодость которых приходилась на 70-80е годы, до объектно-ориентированного программирования убивались по теме разработке собственных языков (интерпретаторов, компиляторов) под предметные области. Всё это казалось мне невостребованным "старьём", но появление новых языков за последнее десятилетие (Go, Kotlin и множества других) повысили мой интерес к этой теме.

Решил в качестве хобби написать 32-bit стековую виртуальную машину и компилятор C подобного языка под неё, чтобы восстановить базовые навыки. Такая классическая Computer Science задачка для заполнения вечеров с пивом. Как предприниматель, я четко понимаю, что она никому не нужна, но такая практика нужна мне для эстетического инженерного удовольствия. Плюс когда об этом рассказываешь сам понимаешь глубже. С целью и мотивами определился. Начнём.

Так как это виртуальная машина, мне нужно определиться с её характеристиками:

CPU: 32-bitный набор команд, так как машина стековая, в основном операнды команд храним в стеке, из регистров только IP (Instruction Pointer) и SP (Stack Pointer), пока работаем с целыми числами со знаком (__int32), позже добавим остальные типы данных.

RAM: пусть памяти пока будет 65536 ячеек по 32-bit`а. Которую организуем просто. С нижних адресов в верх будут идти код (code/text) и данные (data, heap), а с верхних адресов вниз будет расти стек (stack). Дёшево и сердито.

Читать далее
Всего голосов 20: ↑17 и ↓3 +14
Комментарии 15

Задача коммивояжера (TSP) точное решение — метод ветвей и границ

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

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

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

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

Читать далее
Всего голосов 32: ↑32 и ↓0 +32
Комментарии 42

Лабиринты: классификация, генерирование, поиск решений

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

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

Классификация лабиринтов


Лабиринты в целом (а значит, и алгоритмы для их создания) можно разбить по семи различным классификациям: размерности, гиперразмерности, топологии, тесселяции, маршрутизации, текстуре и приоритету. Лабиринт может использовать по одному элементу из каждого класса в любом сочетании.
Читать дальше →
Всего голосов 82: ↑82 и ↓0 +82
Комментарии 13

Чёрная магия трансформов, или об оптимизации анимаций на CSS

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

Иногда Frontend-разработчики сталкиваются с тем, что для оптимизации производительности нужно написать волшебное свойство translateZ(0) или will-change. Анимации перестанут зависать, ничего не будет лагать и мир станет чуть ярче. ✨

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Комментарии 3

Недооцененная альтернатива для HOC’ов и кастомных хуков в react и при чем здесь React.CloneElement?

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

При создании react-приложений часто появляется необходимость расширить функционал уже существующего компонента или переиспользовать общий кусок логики между компонентами, желательно минимально не вмешиваясь в реализацию целевого компонента. У большинства разработчиков в таком случае мысль в первую очередь обращается к использованию HOC (hight order component или по-русски компонент высшего порядка) или же кастомных хуков. Однако у меня нет никакого желания пересказывать вам уже всем давно известные паттерны, которые вы, вероятно, знаете даже лучше меня.

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

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Комментарии 15

Карманная книга по TypeScript. Часть 4. Подробнее о функциях

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

image


Я продолжаю серию публикаций адаптированного и дополненного перевода "Карманной книги по TypeScript".

Другие части:



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


Функции — это основные строительные блоки любого приложения, будь то функции, импортируемые из другого модуля, или методы класса. В TS существует несколько способов описания того, как фукнции вызываются.


Тип функции в форме выражения (function type expressions)


Простейшим способом описания типа функции является выражение. Такие типы похожи на стрелочные функции:

Читать дальше →
Всего голосов 25: ↑22 и ↓3 +19
Комментарии 6

Заметка о Mapped Types и других полезных возможностях современного TypeScript

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


Привет, друзья!


Представляю вашему вниманию перевод 2 статей:


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

Заметка о полезных возможностях современного CSS

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


Привет, друзья!


В данной заметке я расскажу вам о некоторых полезных возможностях, предоставляемых современным CSS. Также мы немного поговорим о полезных "фичах", которые ждут нас в ближайшие 2 года.


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

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

Занимательные задачки, рождённые венгерской математической школой

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


Венгрия по праву может считаться математической сверхдержавой – и не только из-за «кубика Рубика», придуманного венгром Эрнё Рубиком. В 1894 году Венгрия первой в мире начала проводить математические олимпиады для подростков – за четыре десятилетия до того, как они стали проводиться где-то ещё. В том же году там начали издавать математический журнал KöMaL для учеников средней школы, в котором содержались различные задачки и приёмы для их решения. Олимпиада и журнал существуют до сих пор, с перерывами на мировые войны.

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

Директор американской математической олимпиады, венгр Бела Байнок, поделился с редакцией The Guardian «трёхмерными логическими загадками»: в таких задачках решение нужно искать при помощи трёхмерной решётки. Он сказал, что никогда не сталкивался с такими задачками за пределами Венгрии.
Читать дальше →
Всего голосов 26: ↑25 и ↓1 +24
Комментарии 8

TypeScript. Все еще без номинативной типизации

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

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

Наследство JavaScript

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

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

Читать далее
Всего голосов 2: ↑1 и ↓1 0
Комментарии 4

Язык программирования типов, скрытый в TypeScript. Utility Types

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

TypeScript — это язык, расширяющий JavaScript, добавляя в последний типизацию. Правда, так как TypeScript не имеет runtime-а (почти), он транслируется в JavaScript, в процессе чего, вся типизация теряется. Такую типизацию можно назвать лишь инструментом статического анализа кода. Тем не менее — это очень мощный инструмент. К тому же, помимо проверки кода, типизация также и документирует его.

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

Читать далее
Всего голосов 23: ↑22 и ↓1 +21
Комментарии 3

TypeScript: Раскладываем tsconfig по полочкам. Часть 2 — Всё про строгость

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

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

Читать далее
Всего голосов 16: ↑16 и ↓0 +16
Комментарии 5

TypeScript: Раскладываем tsconfig по полочкам. Часть 1

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

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

Читать далее
Всего голосов 30: ↑29 и ↓1 +28
Комментарии 4

Информация

В рейтинге
2 358-й
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность

Специализация

Frontend Developer
Senior
JavaScript
TypeScript
React
HTML
CSS
Web development
Redux
MobX
Webpack