1

我正在阅读 Programming Collective Intelligence 一书,并尝试将我学到的知识应用于 Northwind 数据库。虽然我对我对所提出的算法的理解还没有信心,但我开始对一般概念有所了解。

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

  1. 查找也购买了我的商品的其他客户
  2. 查找这些客户购买的所有其他商品
  3. 根据购买次数对商品进行排名
  4. 从上一步返回前 N 个项目

我正在使用以下查询:

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 个客户,而不是购买我产品的所有客户。任何人都可以提供任何指示吗?我是否朝着正确的方向前进?我应该完全采取不同的方向吗?

在这一点上,我的目标是性能而不是准确性,因为我知道我还没有将算法应用到最大收益的经验。我只是想应用这个概念。一旦我对它的理解感到满意,我打算针对具有更真实客户数据的更大数据库测试此查询。

4

1 回答 1

2

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

要考虑的另一件事是项目的顺序和每个项目的价值。例如,购买自行车的客户可能经常购买(添加)“LED 灯”。但是,如果将 LED 灯放在篮子里,系统是否应该在列表中提供一辆自行车?

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

于 2009-12-01T15:17:13.753 回答