我的平台是 Ruby - 一个特别使用 Rails 3.2 的网络应用程序。
我正在尝试根据对象(人)对某些项目的评分来匹配对象(人)。人们可能会对与其他人相同的所有项目、某些项目或不对任何项目进行评价。评分是 0 到 5 之间的整数。可评分的项目数量和用户数量都可以被认为是重要的。
快速说明 -
蛮力方法是遍历所有人,计算每个项目的差异。在 Ruby 风格的伪代码中 -
MATCHES = {}
for each (PERSON in (people except USER)) do
for each (RATING that PERSON has made) do
if (USER has rated the item that RATING refers to) do
MATCHES[PERSON's id] += difference between PERSON's rating and USER's rating
end
end
end
lowest values in MATCHES are the best matches for USER
这里的问题是,随着项目、评级和人数的增加,这段代码将花费非常长的时间来运行,暂时忽略缓存,这是必须运行很多次的代码,因为这个匹配是我的应用程序的主要功能。
我对更聪明的算法和更聪明的数据库持开放态度来实现这一目标,但通过算法来实现并因此允许我将所有内容保存在 MySQL 或 PostgreSQL 中会让我的生活变得更加轻松。我唯一要说的是数据确实需要持久化。
如果需要更多详细信息,请随时询问。非常感谢任何帮助!
最佳答案
查看 KD-Tree .它专门设计用于加速 N 维空间中的邻居查找,例如您的评级系统(第 1 个人是 X 轴上的 3 个单位,Y 轴上的 4 个单位,依此类推)。
您可能必须使用实际的编程语言来执行此操作。一些数据库有空间索引,但它们通常是为地理工作而设计的,比如 PostGIS (使用 GiST 索引),并且仅支持两个或三个维度。
也就是说,我确实找到了 this tantalizing blog post在 PostGIS 上。然后我找不到任何其他引用资料,但也许你的运气会比我好......
希望对您有所帮助!
关于ruby-on-rails - 是否有比蛮力更聪明的 Ruby 算法来查找多维数据中的相关性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864071/