最近邻居图中第 k 个邻居的奇怪距离

Posted

技术标签:

【中文标题】最近邻居图中第 k 个邻居的奇怪距离【英文标题】:Strange distance for the k-th neighbour in the nearest neighbor graph 【发布时间】:2019-06-05 16:51:29 【问题描述】:

为了澄清,我有很多维度的数据集,比如成百上千,可能需要标准化。

我想计算最近邻图中第 k 个邻居的距离。 对于这个data set,我计算了第 k 个最近邻居的平均距离,但结果太大而且很奇怪!例如,当我使用 k = 5 时,结果平均距离为 2147266047,而当 k 增加到 12 时,平均距离增加到 4161197373 !我确定有问题,但我不知道究竟是为什么!可能是因为使用了欧几里得距离,或者我需要在计算距离之前对数据进行归一化。

更让我困惑的是,该方法在将其应用于另一个数据集(如 iris)时效果很好。在我的代码下方

data(iris)
iris <- as.matrix(iris[,1:4])
distance<- ppx(iris) %>% nndist(k = 3)
as.vector(distance)
avg<-(sum(distance)/length(distance))
avg

我的第一个问题:获得像 Epsilon 这样的大值是否正常,或者处理数据时出现问题。

另一个问题:是否有其他方法可以估算 Epsilon 的值

【问题讨论】:

你需要对你的数据进行归一化来做任何类型的KNN,否则规模最大的变量会主导其他变量。很好地讨论了here。对于您链接到的数据,您是否使用所有 309 个特征来计算最近邻?如果是这样,请查找the curse of dimensionality,因为最近的邻居会被高维数据分解 感谢您的链接。是的,我需要使用 309 特征为数据集构建 kNN 图。我读过关于维度诅咒的文章,但在使用 kNN 时我没有找到解决大量维度的另一种解决方案。 【参考方案1】:

不是一个完整的答案,但也许我们可以迭代并到达那里:

    当维度很大时,欧几里得 2 范数变得非常大是正常的。想想单位正方形的对角之间的距离是 sqrt(2),单位立方体的对角距离是 sqrt(3) 等等。在hypercubes 上查看***。

    一个建议可能是为您的最近邻启发式使用不同的规范或距离度量。 2-范数关注最大的差异。试试 1 范数?或者可能会丢弃一些功能?

最后,您可能会注意到 Athanasios 的电子邮件是在 UCI 网站上提供的;他们可能会亲自回答您的问题。

【讨论】:

感谢您的回答和建议。我使用 cccd 包中的 nng 函数来构建我的 kNN 图,不幸的是,无法更改距离度量!您是否推荐 R 中可以控制距离的另一个函数? 对不起,我不写 R!【参考方案2】:

我认为您在很大程度上已经回答了您自己的问题。

首先,我相信您计算正确。这是我计算相同事​​物的代码。

library(dbscan)
summary(kNNdist(as.matrix(LSVT), 5))
       1                   2                   3                   4                   5            
 Min.   :2.326e+07   Min.   :5.656e+07   Min.   :9.132e+07   Min.   :1.316e+08   Min.   :1.981e+08  
 1st Qu.:1.104e+08   1st Qu.:2.178e+08   1st Qu.:3.041e+08   1st Qu.:3.811e+08   1st Qu.:5.201e+08  
 Median :2.231e+08   Median :3.783e+08   Median :4.964e+08   Median :6.183e+08   Median :7.723e+08  
 Mean   :7.414e+08   Mean   :1.195e+09   Mean   :1.557e+09   Mean   :1.849e+09   Mean   :2.147e+09  
 3rd Qu.:4.633e+08   3rd Qu.:9.285e+08   3rd Qu.:1.189e+09   3rd Qu.:1.391e+09   3rd Qu.:1.533e+09  
 Max.   :1.861e+10   Max.   :3.379e+10   Max.   :3.512e+10   Max.   :3.795e+10   Max.   :4.600e+10  

请注意,第 5 个最近邻的平均值是 2.147e+09,这就是你得到的。

这个值应该令人惊讶吗?不,您的某些个人维度包含巨大的变化。 例如,仅使用维度 189

max(LSVT[,189]) - min(LSVT[,189])
[1] 80398191552

summary(kNNdist(as.matrix(LSVT[,189]), 5))
       1                   2                   3                   4                   5            
 Min.   :4.098e+04   Min.   :3.259e+07   Min.   :4.034e+07   Min.   :5.791e+07   Min.   :7.772e+07  
 1st Qu.:3.163e+07   1st Qu.:1.016e+08   1st Qu.:1.657e+08   1st Qu.:2.309e+08   1st Qu.:2.909e+08  
 Median :7.078e+07   Median :1.877e+08   Median :2.502e+08   Median :3.561e+08   Median :4.610e+08  
 Mean   :3.580e+08   Mean   :8.389e+08   Mean   :1.112e+09   Mean   :1.345e+09   Mean   :1.623e+09  
 3rd Qu.:1.928e+08   3rd Qu.:5.211e+08   3rd Qu.:6.996e+08   3rd Qu.:9.491e+08   3rd Qu.:1.008e+09  
 Max.   :1.036e+10   Max.   :2.787e+10   Max.   :2.888e+10   Max.   :3.126e+10   Max.   :3.770e+10

这些超大规模的维度将完全压倒小规模的维度。 因此,您几乎可以肯定地对数据进行规范化。

summary(kNNdist(scale(as.matrix(LSVT)), 5))
       1                2                3                4                5         
 Min.   : 7.002   Min.   : 7.511   Min.   : 7.742   Min.   : 7.949   Min.   : 8.047  
 1st Qu.: 8.701   1st Qu.: 9.261   1st Qu.: 9.501   1st Qu.: 9.664   1st Qu.: 9.851  
 Median :10.010   Median :10.425   Median :10.626   Median :10.890   Median :11.172  
 Mean   :11.456   Mean   :12.417   Mean   :12.927   Mean   :13.306   Mean   :13.551  
 3rd Qu.:11.622   3rd Qu.:12.176   3rd Qu.:12.492   3rd Qu.:12.876   3rd Qu.:13.093  
 Max.   :70.220   Max.   :76.359   Max.   :83.243   Max.   :87.601   Max.   :88.197  

为什么这与虹膜数据不同? 您的数据和虹膜数据之间有两个很大的区别。 您的数据包含不同尺度的属性, 而所有 iris 属性的大小都相当。 二、iris数据的值都在一个数量级之内 的 1. 您的数据具有越来越小和大得多的值。

summary(LSVT[,c(27,189)])
 Jitter..pitch_TKEO_prc75 entropy_shannon2_10_coef
 Min.   :-4.799e-09       Min.   :-8.233e+10      
 1st Qu.:-1.582e-11       1st Qu.:-1.831e+10      
 Median : 1.987e-11       Median :-1.090e+10      
 Mean   : 3.901e-10       Mean   :-1.576e+10      
 3rd Qu.: 1.164e-10       3rd Qu.:-6.748e+09      
 Max.   : 9.440e-09       Max.   :-1.934e+09 


summary(iris[,1:4])
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

对评论的回应

使用 R scale 函数就是我所说的标准化。还有其他方法可以扩展数据。我并不是说标准化是最好的。我对这个答案的意图只是指出为什么你会看到你所看到的行为并指出如何解决它的方向。您的数据具有不同尺度的变量,并且您正在计算距离。这将使小范围的变量对结果几乎没有影响。可能不是你想要的。 标准化是解决这个问题的自然第一次尝试。您可能可以使用它来获得更好的距离度量,并希望更好地理解变量如何相互作用。但其他或额外的 可能需要对您的数据进行转换。

【讨论】:

感谢这些解释和工作。所以你认为规范化数据只会解决问题,但是你推荐一些特别的东西,我的意思是一般来说只是规范化或预处理数据。正如我在文献中看到的,有很多方法可以扩展数据,规范化就是其中之一,这取决于你的目标,你想要 kNN 的数据还是什么。 回复太长,无法评论。添加到答案。

以上是关于最近邻居图中第 k 个邻居的奇怪距离的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用用户定义的距离度量来选择 scikits 学习中的 k 个最近邻居?

机器学习:KNN算法Python实现

kNN - 如何根据计算出的距离在训练矩阵中定位最近的邻居

R语言学习笔记—K近邻算法

001-神经网络基础-K近邻算法

高维数据中的最近邻?