我有一张这样的桌子;所有列都是数字:
表测试
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,但我认为它与机器学习有关。
我有一张这样的桌子;所有列都是数字:
表测试
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,但我认为它与机器学习有关。
这个问题可以实现为最小化输入“损失”的查询。如果使用“均方误差”损失,损失计算将如下所示:
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 按与列表头部最接近的接近度对输出进行排序。如果两个数据行产生相同的比较值,则不确定哪个将位于列表的头部。