具有连续变量和二进制变量的K最近邻


10

我有一个带有列a b c(3个属性)的数据集。a是数值型和连续型的,b并且c分别具有两个级别。我使用的是K-近邻方法进行分类abc。因此,为了能够测量距离,我通过删除b和添加b.level1和来变换数据集b.level2。如果观察ib类别中处于第一级,则b.level1[i]=1b.level2[i]=0

现在,我可以在新数据集中测量距离了: a b.level1 b.level2

从理论/数学角度来看:可以同时对二进制数据和连续数据执行K最近邻(KNN)吗?

FNN在R和功能中使用包knn()


我几乎没有KNN经验,但是我看不出二进制变量对建立距离有多大帮助。我很好奇您为什么偏向这种方法。
rolando2

因为我看不到将数字变量与分类变量进行比较的更好方法。欢迎提出更好的方法:)
k.dkhk

Answers:


11

可以结合使用分类变量和连续变量(功能)。

不知何故,诸如k-NN的方法没有太多的理论基础。启发式方法是,如果两个点彼此接近(根据某个距离),则它们在输出方面会有一些共同点。可能是,可能不是。这取决于您使用的距离。

(a,b,c)(a,b,c)

  • aa(aa)2
  • bb
  • cc

这对应于隐式给每个特征赋予权重。

aaaaa

您可以通过以下方式对行为进行归一化:将每个特征除以其标准偏差。这适用于连续变量和二进制变量。您也可以提供自己的首选权重。

请注意,R函数kNN()为您完成了此操作:https : //www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

第一次尝试,基本上使用norm = true(规范化)。这样可以避免在组合连续和分类特征时可能出现的大多数废话。


很好的答案(+1),但是,您可能会提到,如果维数很高,并且有许多离散变量,则具有欧几里得距离的knn可能效果不佳。
海涛杜

6

是的,您当然可以将KNN与二进制数据和连续数据一起使用,但是在进行此操作时应注意一些重要的注意事项。

相对于实值结果(对于0-1缩放的未加权向量)之间的离散度,二进制拆分将极大地告知结果,如下所示:

实值和二进制变量的分离

在此示例中,您可以看到,与距离相比,单个观测值最接近的邻居比由缩放后的实值变量更能充分了解二进制变量。

此外,这扩展到多个二进制变量-如果我们将实值变量之一更改为二进制,我们可以看到,通过匹配所涉及的所有二进制变量,距离将比实际值的接近程度更能告知信息:

实值和二进制变量的分离

您将只想包含关键的二进制变量-实际上,您是在询问“与二进制变量的此配置(如果有)匹配的所有观察结果中,这些观察值具有最接近的实数值?” 这是可以用KNN解决的许多问题的合理表述,而其他问题的表述却很差。

#code to reproduce plots:
library(scatterplot3d) 

scalevector <- function(x){(x-min(x))/(max(x)-min(x))}

x <- scalevector(rnorm(100))
y <- scalevector(rnorm(100))
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')

x <- scalevector(rnorm(100))
y <- ifelse(sign(rnorm(100))==-1, 0, 1)
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.