17

请耐心等待我的写作,因为我的英语不熟练。

作为一名程序员,我想了解在推荐系统或相关系统下实现的算法或机器学习智能。例如,最明显的例子来自亚马逊。他们有一个非常好的推荐系统。他们知道:如果你喜欢这个,你可能也喜欢那个,或者其他类似的东西:有多少人喜欢这个那个

当然,我知道亚马逊是一个大网站,他们在这些系统上投入了大量的精力和金钱。但是,在最基本的核心上,我们如何在我们的数据库中实现类似的东西?我们如何确定一个对象与另一个对象的关系?我们如何建立一个处理这种事情的统计单元?

如果有人能指出一些算法,我将不胜感激。或者,基本上,指出一些我们都可以学习的好的直接参考/书籍。谢谢你们!

4

4 回答 4

18

这是 2 种不同类型的推荐引擎。

最简单的是基于项目的,即“购买了产品 A 的客户也购买了产品 B”。这很容易实现。存储一个稀疏对称矩阵 nxn(其中 n 是项目数)。每个元素 (m[a][b]) 是任何人同时购买商品“a”和商品“b”的次数。

另一种是基于用户的。那就是“像你这样的人经常喜欢这样的事情”。这个问题的一个可能的解决方案是 k-means 聚类。即构建一组聚类,将具有相似品味的用户放置在同一聚类中,并根据同一聚类中的用户提出建议。

一种更好但更复杂的解决方案是一种称为受限玻尔兹曼机的技术。这里有他们的介绍

于 2010-11-20T10:13:27.333 回答
3

第一次尝试可能如下所示:

//First Calculate how often any product pair was bought together
//The time/memory should be about Sum over all Customers of Customer.BoughtProducts^2
Dictionary<Pair<ProductID,ProductID>> boughtTogether=new Dictionary<Pair<ProductID,ProductID>>();
foreach(Customer in Customers)
{
    foreach(product1 in Customer.BoughtProducts)
        foreach(product2 in Customer.BoughtProducts)
            {
                int counter=boughtTogether[Pair(product1,product2)] or 0 if missing;
                counter++;
                boughtTogether[Pair(product1,product2)]=counter;
            }
}

boughtTogether.GroupBy(entry.Key.First).Select(group.OrderByDescending(entry=>entry.Value).Take(10).Select(new{key.Second as ProductID,Value as Count}));

首先,我计算每对产品一起购买的频率,然后按产品对它们进行分组,并选择与它一起购买的前 20 种其他产品。结果应放入某种由产品 ID 键入的字典中。

对于大型数据库,这可能会变得太慢或占用太多内存。

于 2010-11-20T10:14:29.967 回答
0

我认为,您谈论的是知识库系统。我不记得编程语言(可能是 LISP),但有实现。另外,看看OWL

于 2010-11-20T10:13:42.883 回答
0

如果您正在寻找开源解决方案或像mag3llan.com这样的 SaaS 解决方案,还有prediction.io

于 2015-09-03T15:30:05.217 回答