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

为了澄清,我有许多维度的数据集,可能有数百甚至数千维,可能需要进行归一化处理。

我想计算最近邻图中到第k个邻居的距离。对于这个数据集,我计算了第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的值


回答:

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

首先,我相信你的计算是正确的。这是我的代码,用于计算相同的东西。

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] 80398191552summary(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数据之间有两个主要区别。你的数据包含不同尺度的属性,而所有的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函数,我称之为标准化。还有其他方法来缩放数据。我并不是暗示标准化是最好的。我的回答只是为了指出你看到的行为的原因,并指明解决问题的方向。你的数据包含不同尺度的变量,并且你正在计算距离。这会使得小尺度的变量几乎对结果没有影响。这可能不是你想要的。标准化是解决这个问题的自然首选尝试。你可能可以用它来获得更好的距离度量,并希望能更好地理解你的变量是如何相互作用的。但你的数据可能还需要其他或额外的转换。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注