1

私は「集合知プログラミング」という本を読んでいて、学んだことをノースウィンドデータベースに適用しようとしています。提示されたアルゴリズムについての理解にはまだ自信がありませんが、一般的な概念については理解し始めています。

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万個のバスケットがあり、製品Aを購入した10人が同じバスケットで製品Bも購入したとします。「Aを買った人はBも買った」と言うのに10件で十分ですか?このため、「最近の」購入を使用するのは少し注意が必要です。アイデアは製品ペアのテーブルを作成することですが、N個の製品がある場合、組み合わせの数はN *(N-1)であるため、1000個の製品のストアの場合、999000個の組み合わせになるため、これを削除するアルゴリズムは次のようになります。単純ではありません。

もう1つ考慮すべきことは、アイテムの順序と各アイテムの価値です。たとえば、自転車を購入する顧客は、「LEDライト」を購入(追加)することがよくあります。しかし、LEDライトをバスケットに入れる場合、システムはリストに自転車を提供する必要がありますか?

SQLサーバーを使用していることを考慮して、この目的で「MSアソシエーションアルゴリズム」を使用するAnalysisServicesデータマイニングを紹介します。同じデータを使用することで、結果を「商用ソリューション」と比較できます。

于 2009-12-01T15:17:13.753 に答える