我需要解决一个问题,其中项目a 必须与数千个其他项目进行比较,并找出哪些项目与项目a最相似。
我想根据它们与项目a 的相似程度为每个项目分配权重。各种标准将决定最终的权重。例如,如果item1.someProperty == otherItem.someProperty
,那么我增加5个权重,如果item1.anotherProperty == otherItem.anotherProperty
,那么我只增加1个权重,因为someProperty
比anotherProperty
更重要。
我描述这些的原因是,我想知道是否有任何理论可以帮助我创建这个系统。特别是,如何选择每个标准的权重,如何计算项目的最终权重,以及如何构建所有这些。
有谁知道有什么理论可以帮助吗?或者也许有更好的方法来做我想做的事?
您可以将属性视为维度,并从中组成距离。如果属性之间存在相关性,您也可以将其考虑在内(谷歌马氏距离)。
但是基本上它会转到
float distance(a, b) {
return w1 * ABS(a.x - b.x)
+ w2 * ABS(a.y - b.y)
...
;
}
你可以不把这些项相加,而是把它们的平方相加(以惩罚大的差异),任何事情都可以。
顺便说一句,对于标称数据,你可以使用一些基于熵的差异度量。
这至少在表面上与信息检索(IR)的向量空间模型(VSM)相似。这通常是基于词袋的,但也可以适用于其他数据表示。
你所描述的权重对应于VSM IR中所谓的"场增强"。
但也可参见最近邻搜索
你可以读任何与机器学习相关的书,比如这本。算法KNN (K近邻)解决你的问题。你必须为你的问题定义一个距离度量,然后比较这些距离。