2010-11-30 2 views
8

Мой вектор-функция имеет как непрерывные (или широкомасштабные), так и двоичные компоненты. Если я просто использую эвклидово расстояние, то непрерывные компоненты будут иметь гораздо больший эффект:Как использовать как двоичные, так и непрерывные функции в алгоритме k-Nearest-Neighbor?

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

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

ответ

9

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

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

1

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

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