大约找到最接近的数字

数据挖掘 机器学习 回归 sql
2022-03-06 22:45:05

我有一张这样的桌子;所有列都是数字:

表测试

Col1  Col2  Col3  Col4
  5    6     7     8
 12    6     5     6
  2    3.5   6     1

我想用这些值找到最接近的行:4、5.75、7.2、6。人类可以找到它(第 1 行是答案),但我如何编写查询让计算机找到它?

我正在使用 SQL Server,但我认为它与机器学习有关。

2个回答

这个问题可以实现为最小化输入“损失”的查询。如果使用“均方误差”损失,损失计算将如下所示:

select col1, col2, (col1 - inp1)^2 + (col2 - inp2)^2 as mse_loss, 
from table 

现在,您可以找到 mse_loss 值最小的行

我将使用表值变量,因为它们更容易在演示中使用。这将与临时表或正确表完全相同。

declare @Data table(
    Col1 numeric(5, 2),
    Col2 numeric(5, 2),
    Col3 numeric(5, 2),
    Col4 numeric(5, 2)
);
insert @Data
values
    ( 5, 6  , 7,   8),
    (12, 6  , 5,   6),
    ( 2, 3.5, 6,   1),
    ( 1, 4  , 5, 500);

declare @Probe table(
    Col1 numeric(5, 2),
    Col2 numeric(5, 2),
    Col3 numeric(5, 2),
    Col4 numeric(5, 2)
);
insert @Probe
values
    (4, 5.75, 7.2, 6);

select
    d.Col1,
    d.Col2,
    d.Col3,
    d.Col4,
    Comparison =ABS(d.col1 - p.Col1) +
                ABS(d.Col2 - p.Col2) +
                ABS(d.Col3 - p.Col3) +
                ABS(d.Col4 - p.Col4)
from @Data as d
cross apply @Probe as p
order by Comparison;

我将寻找的值放在一个表(@Probe)中,因为这比查询中的硬编码值更有用。

你没有指定你的距离函数是什么,所以我使用了一个简单的区别。任何其他计算都可以代替“比较”列的定义。

CROSS APPLY 表示“对于左侧的每一行(即@Data),使用右侧的行(即@Probe)”。如果右侧引用允许更复杂计算的 T-SQL 函数,它也可以工作。由于寻求的值是单行,因此 CROSS JOIN 在这里也可以正常工作。

最后,ORDER BY 按与列表头部最接近的接近度对输出进行排序。如果两个数据行产生相同的比较值,则不确定哪个将位于列表的头部。