最近邻图中第 k 个邻居的奇怪距离
Strange distance for the k-th neighbour in the nearest neighbor graph
澄清一下,我有很多维度的数据集,比如成百上千,可能需要归一化。
我想计算到最近邻图中第 k 个邻居的距离。
对于这个 data set,我计算了第 k 个最近邻居的平均距离,但结果太大而且很奇怪!例如,当我使用 k = 5 时,结果平均距离为 2147266047,而当 k 增加到 12 时,平均距离增加到 4161197373!我确定有问题,但我不知道为什么!可能是因为使用了欧氏距离,也可能是我需要在计算距离之前对数据进行归一化。
更让我困惑的是,该方法在应用于其他数据集(如鸢尾花)时效果很好。在我的代码下方
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 的值
不是一个完整的答案,但也许我们可以迭代并到达那里:
维数大的时候欧几里得2-范数变大是正常的。想一想单位正方形的对角之间的距离是 sqrt(2),单位立方体的对角之间的距离是 sqrt(3) 等等。在 hypercubes.
上查看维基百科
一个建议可能是对最近邻启发式算法使用不同的范数或距离度量。 2-范数关注最大的差异。试试 1 范数?或者放弃一些功能?
最后,您可能会注意到 UCI 网站上提供了 Athanasios 的电子邮件;他们可能会亲自回答您的问题。
我认为你在很大程度上已经回答了你自己的问题。
首先,我相信你的计算是正确的。这是我计算相同内容的代码。
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
函数就是我所说的 标准化 。还有其他方法可以缩放数据。我并不是说标准化是最好的。我对这个答案的意图只是指出为什么你会看到你所看到的行为并指出如何解决它的方向。您的数据具有不同尺度的变量,并且您正在计算距离。这将使小范围内的变量对结果几乎没有影响。可能不是你想要的。
标准化是解决这个问题的自然而然的第一次尝试。您可能可以使用它来获得更好的距离度量,并希望更好地了解您的变量如何相互作用。但其他或额外的
可能需要对数据进行转换。
澄清一下,我有很多维度的数据集,比如成百上千,可能需要归一化。
我想计算到最近邻图中第 k 个邻居的距离。 对于这个 data set,我计算了第 k 个最近邻居的平均距离,但结果太大而且很奇怪!例如,当我使用 k = 5 时,结果平均距离为 2147266047,而当 k 增加到 12 时,平均距离增加到 4161197373!我确定有问题,但我不知道为什么!可能是因为使用了欧氏距离,也可能是我需要在计算距离之前对数据进行归一化。
更让我困惑的是,该方法在应用于其他数据集(如鸢尾花)时效果很好。在我的代码下方
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 的值
不是一个完整的答案,但也许我们可以迭代并到达那里:
维数大的时候欧几里得2-范数变大是正常的。想一想单位正方形的对角之间的距离是 sqrt(2),单位立方体的对角之间的距离是 sqrt(3) 等等。在 hypercubes.
上查看维基百科
一个建议可能是对最近邻启发式算法使用不同的范数或距离度量。 2-范数关注最大的差异。试试 1 范数?或者放弃一些功能?
最后,您可能会注意到 UCI 网站上提供了 Athanasios 的电子邮件;他们可能会亲自回答您的问题。
我认为你在很大程度上已经回答了你自己的问题。
首先,我相信你的计算是正确的。这是我计算相同内容的代码。
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
函数就是我所说的 标准化 。还有其他方法可以缩放数据。我并不是说标准化是最好的。我对这个答案的意图只是指出为什么你会看到你所看到的行为并指出如何解决它的方向。您的数据具有不同尺度的变量,并且您正在计算距离。这将使小范围内的变量对结果几乎没有影响。可能不是你想要的。
标准化是解决这个问题的自然而然的第一次尝试。您可能可以使用它来获得更好的距离度量,并希望更好地了解您的变量如何相互作用。但其他或额外的
可能需要对数据进行转换。