2010-11-20 189 views
17

请耐心等待我的写作,因为我的英文不够精通。作为程序员,我想了解在推荐系统或相关系统下实现的算法或机器学习智能。例如,最明显的例子就是亚马逊。他们有一个非常好的推荐系统。搞懂:如果你喜欢这个,你也可能会喜欢,或别的东西,如:像在一起的人占多大比例。如何实现推荐引擎?

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

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

+0

亚马逊的[专利](http://www.google.com/patents/US7113917)详细介绍了他们的方法。 – arao6 2015-05-02 16:11:27

回答

18

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

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

另一种是基于用户的。那就是“像你这样的人经常喜欢这样的事情”。这个问题的一个可能的解决方案是k均值聚类。即构建一组集合,其中类似品味的用户被放置在同一集群中并基于同一集群中的用户提出建议。

更好的解决方案,但更复杂的解决方案是一种称为限制玻尔兹曼机器的技术。有对他们的介绍here

+4

@ HTA:@dan_waterworth绘制的“客户相似性”和“产品相似性”之间的区别是推荐引擎策略中最基本的分界线。 然而,“限制玻尔兹曼机器”和“k均值聚类”应该被视为“你想使用的任何机器学习技术”的替身。 客户相似度或产品相似度都可以用矩阵来完成,并且可以用A.I来完成。/stats/M.L.你可以阅读关于维基百科的内容。 – isomorphismes 2011-03-09 08:56:16

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键入的某种字典中。

这可能会变得太慢或为大型数据库花费太多内存。