推荐系统实验

时间:2009-12-01 14:52:22

标签: sql-server recommendation-engine collective-intelligence

我正在阅读“编程集体智慧”一书,并试图将我所学到的东西应用于Northwind数据库。虽然我对所提出的算法的理解还不够自信,但我开始了解一般概念。

使用Northwind数据库,我试图使用以下伪逻辑显示“购买此产品的客户也购买了XYZ”的列表:

  1. 查找同时购买我的商品的其他客户
  2. 查找这些客户购买的所有其他商品
  3. 根据购买次数排名项目
  4. 返回上一步中的前N项
  5. 我正在使用以下查询:

    declare 
        @customerid nchar(5),
        @productid int;
    
    set @customerid = 'ALFKI';
    set @productid = 59;
    
    -- find other products from customers who
    -- also purchased my productid
    
    select top 10
        od.productid, c.categoryname, p.productname, p.unitsonorder, count(od.productid)
    from
        [order details] od
            inner join orders o on o.orderid = od.orderid
            inner join products p on p.productid = od.productid
            inner join categories c on c.categoryid = p.categoryid
    where
        o.customerid <> @customerid and
        od.productid <> @productid and 
        p.discontinued = 0
    group by
        od.productid, c.categoryname, p.productname, p.unitsonorder
    order by 5 desc,4 desc
    

    我认为我的下一步是打破查询,以便我可以根据最近的购买(而不是所有历史购买)进行过滤,并限制客户与N个客户匹配,而不是购买我的产品的所有客户。任何人都可以提供任何指示吗?我是朝着正确的方向前进的吗?我应该完全采取不同的方向吗?

    此时,我的目标是性能超过准确性,因为我知道我还没有将这些算法应用于最大利益的经验。我只是想尝试应用这个概念。一旦我满意,我就能理解它,我打算用更实际的客户数据对更大的数据库测试这个查询。

1 个答案:

答案 0 :(得分:2)

这通常被称为“市场购物篮”分析或“亲和力分组”,并不像听起来那么简单,主要是由于大量的组合。首先要考虑的是导致阳性检测的最小病例数。例如,假设我们有1M篮子,10个人购买产品A也在同一个篮子里买了产品B. 10个案例足以说“买A的人还买了B”?因此,使用“近期”购买有点棘手。想法是创建一个产品对表,但是如果我们有N个产品,组合的数量是N *(N-1),那么对于1000个产品的商店,我们将有999000个组合,因此修剪这个的算法是不简单。

还需要考虑的是物品的顺序和每个物品的价值。例如,购买自行车的顾客可能经常购买(添加)“LED灯”。但是,如果将LED灯放在篮子里,系统应该在列表中提供自行车吗?

考虑到您使用的是SQL服务器,我会指向 Analysis Services Data Mining ,为此目的使用“MS关联算法”。通过使用相同的数据,您可以将结果与“商业解决方案”进行比较。