为了澄清,我有许多维度的数据集,可能有数百甚至数千维,可能需要进行归一化处理。
我想计算最近邻图中到第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
函数,我称之为标准化。还有其他方法来缩放数据。我并不是暗示标准化是最好的。我的回答只是为了指出你看到的行为的原因,并指明解决问题的方向。你的数据包含不同尺度的变量,并且你正在计算距离。这会使得小尺度的变量几乎对结果没有影响。这可能不是你想要的。标准化是解决这个问题的自然首选尝试。你可能可以用它来获得更好的距离度量,并希望能更好地理解你的变量是如何相互作用的。但你的数据可能还需要其他或额外的转换。