区间内数字之间的邻近度


Proximity between numbers in an Interval

我有一组介于x = 1和y = 9之间的(浮点)数字:

$numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

如何在给定的时间间隔内计算数字 A 和数字 B 之间的邻近度度量?


我尝试过什么

如果上述集合的振幅(max - min9 - 1 = 8我能够使用公式(n - min) / (max - min)计算任何数的相对值,计算所有值得到:

  • (1 - 1) / (9 - 1) = 0
  • (2 - 1) / (9 - 1) = 0.125
  • (3 - 1) / (9 - 1) = 0.25
  • (4 - 1) / (9 - 1) = 0.375
  • (5 - 1) / (9 - 1) = 0.5
  • (6 - 1) / (9 - 1) = 0.625
  • (7 - 1) / (9 - 1) = 0.75
  • (8 - 1) / (9 - 1) = 0.875
  • (9 - 1) / (9 - 1) = 1

将最小相对值(在 A 和 B 之间)除以最大相对值(也在 A 和 B 之间)似乎会产生我正在寻找的那种指标。以下是一些示例:

var_dump(min(0.875, 0.25) / max(0.875, 0.25));   // 0.286 between 8 and 3
var_dump(min(0.875, 0.375) / max(0.875, 0.375)); // 0.429 between 8 and 4
var_dump(min(0.875, 0.75) / max(0.875, 0.75));   // 0.857 between 8 and 7
var_dump(min(0.875, 0.875) / max(0.875, 0.875)); // 1 between 8 and 8
var_dump(min(0.25, 0.25) / max(0.25, 0.25));     // 1 between 3 and 3

问题所在

每当集合的最小值发挥作用时,结果将始终0

var_dump(min(0.875, 0) / max(0.875, 0));         // 0 between 8 and 1
var_dump(min(0.125, 0) / max(0.125, 0));         // 0 between 2 and 1
var_dump(min(0, 0) / max(0, 0));                 // 0 between 1 and 1 (ERR!)

关于如何解决这个问题的任何想法?

我建议这样的事情:

<?php
function prox($a,$b)
{
    return(abs($a-$b) / abs(1-9));
}
printf("%f'n", prox(1,2)); // 0.125000 
printf("%f'n", prox(2,3)); // 0.125000
printf("%f'n", prox(1,1)); // 0.000000
printf("%f'n", prox(1,9)); // 1.000000
1 和 2

之间的接近度与 2 和 3 相同。 这似乎是有道理的。

当您指定的数字是预定义范围的边界时,您将获得的最大邻近性。

您获得的最小邻近度是您指定的数字相等时。

如果你想让相反的情况是正确的(我想这更好地反映了接近性,你可以这样做:

<?php
function prox($a,$b)
{
    return(1 - (abs($a-$b) / abs(1-9)));
}
printf("%f'n", prox(1,2));
printf("%f'n", prox(2,3));
printf("%f'n", prox(1,1));
printf("%f'n", prox(1,9));

这将输出:

0.875000
0.875000
1.000000
0.000000

现在,相同的数字产生您指定的 1,边界产生 0,因为它们是最不接近的值对。 (1,2)、(2,3)、(3,4) 等组合都产生相同的值,(2,4)、(3,5)、(4,6) 等组合也是如此。