我有一组介于x = 1和y = 9之间的(浮点)数字:
$numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
如何在给定的时间间隔内计算数字 A 和数字 B 之间的邻近度度量?
我尝试过什么
如果上述集合的振幅(max - min
)9 - 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) 等组合也是如此。