如何在k-最近邻算法中同时使用二进制和连续特征?

10

我的特征向量包含连续(或范围广泛)和二进制组件。如果我仅使用欧几里得距离,那么连续组件的影响将更大:

将对称和非对称表示为0和1,以及一些不太重要的比率从0到100变化,从对称变为非对称与比率增加25相比,距离影响微不足道。

我可以增加对称性的权重(例如通过将其设置为0或100),但是否有更好的方法呢?

3个回答

11
你可以尝试使用标准化欧几里得距离,它在第一部分的末尾这里进行了描述。
它只是通过其标准偏差来缩放每个特征(连续或离散)。这比按另一个帖子建议的范围(max-min)进行缩放更加稳健。

1

你也可以尝试使用马氏距离而不是欧几里得距离。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接