我正在阅读“编程集体智慧”一书,并试图将我所学到的东西应用于Northwind数据库。虽然我对所提出的算法的理解还不够自信,但我开始了解一般概念。
使用Northwind数据库,我试图使用以下伪逻辑显示“购买此产品的客户也购买了XYZ”的列表:
我正在使用以下查询:
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个客户匹配,而不是购买我的产品的所有客户。任何人都可以提供任何指示吗?我是朝着正确的方向前进的吗?我应该完全采取不同的方向吗?
此时,我的目标是性能超过准确性,因为我知道我还没有将这些算法应用于最大利益的经验。我只是想尝试应用这个概念。一旦我满意,我就能理解它,我打算用更实际的客户数据对更大的数据库测试这个查询。
答案 0 :(得分:2)
这通常被称为“市场购物篮”分析或“亲和力分组”,并不像听起来那么简单,主要是由于大量的组合。首先要考虑的是导致阳性检测的最小病例数。例如,假设我们有1M篮子,10个人购买产品A也在同一个篮子里买了产品B. 10个案例足以说“买A的人还买了B”?因此,使用“近期”购买有点棘手。想法是创建一个产品对表,但是如果我们有N个产品,组合的数量是N *(N-1),那么对于1000个产品的商店,我们将有999000个组合,因此修剪这个的算法是不简单。
还需要考虑的是物品的顺序和每个物品的价值。例如,购买自行车的顾客可能经常购买(添加)“LED灯”。但是,如果将LED灯放在篮子里,系统应该在列表中提供自行车吗?
考虑到您使用的是SQL服务器,我会指向 Analysis Services Data Mining ,为此目的使用“MS关联算法”。通过使用相同的数据,您可以将结果与“商业解决方案”进行比较。