Просто интересно, знаком ли кто-нибудь с кластеризацией номинальных входов. Я рассматривал SOM как решение, но, видимо, оно работает только с числовыми функциями. Есть ли расширения для категориальных функций? В частности, мне было интересно узнать о «Днях недели» как о возможностях. Конечно, его можно преобразовать в числовую характеристику (т. Е. Пн-Вс, что соответствует номерам 1-7), однако тогда евклидово расстояние между Солнцем и Пн (1 и 7) не будет таким же, как расстояние от Пн до Вт (1 и 2). ). Любые предложения или идеи будут высоко ценится.
11
Ответы:
Фон:
Самый логичный способ преобразования часа - это две переменные, которые качаются взад и вперед несинхронно. Представьте себе положение конца часовой стрелки на 24-часовых часах. В
x
колебании позиции вперед и назад из синхронизации сy
позицией. Для 24-часовой вы можете сделать это сx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Вам нужны обе переменные или правильное движение во времени потеряно. Это связано с тем, что производная от sin или cos изменяется во времени, в то время как
(x,y)
положение изменяется плавно по мере того, как оно перемещается по окружности.Наконец, подумайте, стоит ли добавлять третью функцию для отслеживания линейного времени, которая может быть построена в виде часов (или минут или секунд) от начала первой записи или метки времени Unix или чего-то подобного. Эти три функции затем обеспечивают прокси как для циклической, так и для линейной прогрессии времени, например, вы можете вытянуть циклические явления, такие как циклы сна в движении людей, а также линейный рост, такой как численность и время.
Пример выполнения:
Теперь давайте попробуем это:
Вы едва можете видеть, что есть некоторые после полуночи, включенные в зеленый кластер до полуночи. Теперь давайте уменьшим количество кластеров и покажем, что до и после полуночи можно более подробно подключиться к одному кластеру:
Посмотрите, как синий кластер содержит моменты времени до и после полуночи, которые объединены в одном кластере ...
Вы можете сделать это для времени, или дня недели, или недели месяца, или дня месяца, или сезона, или чего-либо еще.
источник
Обычно номинальные переменные фиктивно кодируются при использовании в SOM (например, одна переменная для с 1 для понедельника 0 для не понедельника, другая для вторника и т. Д.).
Вы можете включить дополнительную информацию, создав комбинированные категории смежных дней. Например: понедельник и вторник, вторник и среда и т. Д. Однако, если ваши данные относятся к поведению людей, часто бывает полезнее использовать Будни и Выходные в качестве категорий.
источник
Для номинальных переменных типичное кодирование в контексте нейронной сети или электротехники называется «горячим» - вектор со всеми 0, с одним в соответствующем положении для значения для переменной. Например, для дней недели есть семь дней, поэтому ваши горячие векторы будут иметь длину семь. Тогда понедельник будет представлен как [1 0 0 0 0 0 0], вторник как [0 1 0 0 0 0 0] и т. Д.
Как намекнул Тим, этот подход можно легко обобщить, чтобы охватить произвольные векторы логических объектов, где каждая позиция в векторе соответствует интересующему объекту в ваших данных, а позиция установлена в 1 или 0, чтобы указать наличие или отсутствие этого характерная черта.
Если у вас есть бинарные векторы, расстояние Хемминга становится естественной метрикой, хотя евклидово расстояние также используется. Для одноразовых двоичных векторов SOM (или другой аппроксиматор функции) будет естественно интерполироваться между 0 и 1 для каждой позиции вектора. В этом случае эти векторы часто рассматриваются как параметры распределения Больцмана или softmax по пространству номинальной переменной; эта процедура дает возможность использовать векторы в некотором сценарии дивергенции KL.
Циклические переменные намного сложнее. Как сказал Артур в комментариях, вам нужно самостоятельно определить метрику расстояния, которая включает циклический характер переменной.
источник
Предполагая, что день недели (dow) исходит из [0, 6], вместо проецирования данных на окружность можно использовать другой вариант:
Чтобы понять почему, рассмотрим dow как часы
Разница между 6 и 1 может быть 6 - 1 = 5 (по часовой стрелке от 1 до 6) или 7 - (6 - 1) = 2. Взятие мин обоих вариантов должно помочь.
В общем, вы можете использовать:
min(abs(diff), range - abs(diff))
источник
Я успешно закодировал Дни недели (и Месяцы года) как кортеж (cos, sin), как указано в его комментарии. Чем использовал евклидово расстояние.
Это пример кода в r:
Евклидово расстояние между 0 и 6 равно 0 и 1.
источник