Я хочу представить переменную как число от 0 до 1. Переменная является неотрицательным целым числом без внутренней границы. Я отображаю 0 на 0, но что я могу сопоставить 1 или числам от 0 до 1?
Я мог бы использовать историю этой переменной, чтобы обеспечить пределы. Это будет означать, что мне придется пересчитать старую статистику, если максимум увеличится. Должен ли я сделать это или есть другие хитрости, о которых я должен знать?
normalization
Рассел Галлоп
источник
источник
Ответы:
Очень распространенная уловка для этого (например, в моделировании коннекциониста) - это использовать гиперболический тангенс танх в качестве «функции сжатия». Она автоматически вписывает все числа в интервал от -1 до 1. Что в вашем случае ограничивает диапазон от От 0 до 1. В
r
иmatlab
вы получите это черезtanh()
.Другая функция сжатия - логистическая функция (спасибо Саймону за имя), предоставляемая , которая ограничивает диапазон от 0 до 1 (с 0, сопоставленным с .5). Таким образом, вам придется умножить результат на 2 и вычесть 1, чтобы подогнать ваши данные к интервалу от 0 до 1.f(x)=1/(1+e−x)
Вот некоторый простой R-код, который отображает обе функции (tanh красным, логистическая синим цветом), так что вы можете увидеть, как обе сквош:
источник
Как и часто, моим первым вопросом было « почему вы хотите это сделать», а потом я увидел, что вы уже ответили на это в комментариях к вопросу: « Я измеряю содержание во многих различных измерениях и хочу быть возможность сравнивать с точки зрения того, насколько релевантен данный фрагмент контента. Кроме того, я хочу отображать значения в этих измерениях, которые можно объяснить и легко понять »
Нет причин для нормализации данных, чтобы максимальное значение было равно 1, а минимальное значение равно нулю, чтобы достичь этого, и я считаю, что в целом это было бы плохой идеей . Максимальные или минимальные значения могут очень легко быть выбросами , которые не представляют распределение населения. Прощальное замечание @osknows об использовании -scoresZ - гораздо лучшая идея . баллы (или стандартные баллы) нормализуют каждую переменную, используя ее стандартное отклонение, а не диапазон. На стандартное отклонение меньше влияют выбросы. Для того, чтобы использовать ZZ z - желательно, чтобы каждая переменная имела примерно нормальное распределение или, по крайней мере, имела примерно симметричное распределение (т.е. не сильно искажено), но при необходимости вы можете сначала применить соответствующее преобразование данных для достижения этого; какое преобразование использовать можно определить, найдя наиболее подходящее преобразование Бокса-Кокса .
источник
mad()
функцию. И если кого-то беспокоит асимметрия, можно использовать ранги данных вместо исходных наблюдений. В R это было бы такrank()
, но если кто-то собирается использовать это для новых данных,ecdf()
будет лучшей альтернативой (ecdf(x)
возвращает новую функцию, которая в основном дает значениеЛюбая сигмовидная функция будет работать:
источник
В дополнение к хорошим предложениям Хенрика и Саймона Бирна, вы можете использовать f (x) = x / (x + 1). Для сравнения, логистическая функция будет преувеличивать различия по мере увеличения x. То есть разница между f (x) и f (x + 1) будет больше с логистической функцией, чем с f (x) = x / (x + 1). Вы можете или не можете хотеть этого эффекта.
источник
В моем предыдущем посте есть метод ранжирования от 0 до 1. Рекомендации по корреляции входных данных классификатора
Тем не менее, в ранжировании, которое я использовал, Tmin / Tmax использует выборку мин / макс, но вы можете найти популяцию мин / макс более подходящей. Также посмотрите Z баллов
источник
Чтобы добавить к другим ответам, предлагающим pnorm ...
Для потенциально оптимального метода выбора параметров я предлагаю это приближение для pnorm.
По сути это нормализация Softmax.
Ссылка Пнорм в крайнем случае
источник
Есть два способа реализовать это, которые я обычно использую. Я всегда работаю с данными в реальном времени, поэтому это предполагает непрерывный ввод. Вот некоторый псевдокод:
Используя обучаемый minmax:
Эта функция требует, чтобы вы либо выполнили начальную фазу обучения (используя
calibrate()
), либо переподготовили либо через определенные промежутки времени, либо в соответствии с определенными условиями. Например, представьте себе такую функцию:Используя исторический минимакс:
источник
Очень простой вариант - делить каждое число в ваших данных на наибольшее число в ваших данных. Если у вас много маленьких чисел и несколько очень больших, это может плохо передать информацию. Но это относительно легко; если вы думаете, что значимая информация теряется при отображении таких данных, вы можете попробовать один из более сложных методов, предложенных другими.
источник