我的网站有多个Project对象。每个项目都有(例如):
我想根据上述标准编写一个方法来获取所有“类似”项目。我可以轻松地为上述每个项目(即类似大小的项目或共享类别的项目等)检索类似的项目,但我希望它更聪明,然后只选择具有以上所有共同点的项目,或至少具有上述共同之一的项目。
理想情况下,我想对每个标准进行加权,即具有共同标记的项目不那么“相似”,然后是大小接近的项目等。具有两个共同标记的项目更相似而不是一个共同有一个标签的项目等。
我可以采取什么方法(实际上和数学上)来做到这一点?
答案 0 :(得分:4)
处理此问题的常用方法(至少在机器学习中)是创建一个衡量相似度的指标 - 考虑到您有类型,类别,标签,A Jaccard metric似乎是一个很好的匹配,等等,这些不是真正的数字。
一旦有了指标,只要您的指标服从三角形不等式(d(a,b)< d(d),就可以使用KD树,vp树或其他指标树结构加快搜索类似项目的速度。 a,c)+ d(c,b))
答案 1 :(得分:1)
问题是,显然有无数种方法可以解决这个问题。
首先,为每个属性定义一个相似性度量(标签相似度,类别相似度,描述相似性......)
然后尝试将所有这些相似性标准化以使用通用比例,例如0到1,0是最相似的,并且值具有相似的分布。
接下来,为每个要素指定权重。例如。标签相似性比描述相似性更重要。
最后,计算组合相似度作为各个相似度的加权和。
有无数种方法,因为你可以明显地分配任意权重,已经有单一属性相似性的各种选择,无限多种方法来规范化各个值。等等。
有学习权重的方法。请参阅整体方法。但是,要学习权重,您需要让用户输入什么是好结果和什么不是。你有这样的训练数据吗?
答案 2 :(得分:0)
减少项目比较低于初始O(n ^ 2)的可能性(即将每个项目相互比较)在很大程度上取决于具体情况。它可能是您软件的真正关键,或者如果n
较低,则可能根本没有必要。