我在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!)
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
我建议这样的事情:
<?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)这样的组合,等等。