Как использовать как двоичные, так и непрерывные функции в алгоритме k-Nearest-Neighbor? - PullRequest
9 голосов
/ 30 ноября 2010

Мой вектор характеристик имеет как непрерывные (или широко распространенные), так и двоичные компоненты.Если я просто использую евклидово расстояние, непрерывные компоненты будут иметь гораздо большее влияние:

Представление симметричного и асимметричного в виде 0 и 1 и некоторого менее важного отношения в диапазоне от 0 до 100, переход от симметричного к асимметричному имеетнезначительное влияние на расстояние по сравнению с изменением соотношения на 25.

Я могу добавить больше веса к симметрии (например, установив 0 или 100), но есть ли лучший способ сделать это?

Ответы [ 3 ]

10 голосов
/ 30 ноября 2010

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

Он просто масштабирует каждую функцию (непрерывную или дискретную) по ее стандартному отклонению. Это более надежно, чем, скажем, масштабирование по диапазону (max-min), как предлагает другой автор.

1 голос
/ 03 декабря 2010

Вы также можете попробовать расстояние Махаланобиса вместо евклидова.

1 голос
/ 30 ноября 2010

Если я правильно понимаю ваш вопрос, то нормализация (или «изменение масштаба») каждого измерения или столбца в наборе данных является обычной техникой для работы с измерениями с избыточным весом, например,

ev_scaled = (ev_raw - ev_min) / (ev_max - ev_min)

Например, в R вы можете написать эту функцию:

ev_scaled = function(x) {
    (x - min(x)) / (max(x) - min(x))
}  

, который работает так:

# generate some data: 
# v1, v2 are two expectation variables in the same dataset 
# but have very different 'scale':
> v1 = seq(100, 550, 50)
> v1
  [1] 100 150 200 250 300 350 400 450 500 550
> v2 = sort(sample(seq(.1, 20, .1), 10))
> v2
  [1]  0.2  3.5  5.1  5.6  8.0  8.3  9.9 11.3 15.5 19.4
> mean(v1)
  [1] 325
> mean(v2)
  [1] 8.68

# now normalize v1 & v2 using the function above:
> v1_scaled = ev_scaled(v1)
> v1_scaled
  [1] 0.000 0.111 0.222 0.333 0.444 0.556 0.667 0.778 0.889 1.000
> v2_scaled = ev_scaled(v2)
> v2_scaled
  [1] 0.000 0.172 0.255 0.281 0.406 0.422 0.505 0.578 0.797 1.000
> mean(v1_scaled)
  [1] 0.5
> mean(v2_scaled)
  [1] 0.442
> range(v1_scaled)
  [1] 0 1
> range(v2_scaled)
  [1] 0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...