SSブログ

SPSS Clementine でユーザーベースの協調フィルタリングを実装する方法 [データサイエンス、統計モデル]

SPSS Clementine でユーザーベースの協調フィルタリングを実装する方法

SPSS Clementine(PASW Modeler)でユーザーベースの協調フィルタリングを作った。

モデルに使ったデータは、
 ユーザ数:5,000
 アイテム数:40
 レコード数:12,000行
だ。

ここで、クラスタを作成することで計算時間を早くすることを考える。
 クラスタ数:20
 1クラスタあたり、250人程度。

処理にかかった実行時間としては、約15秒~20秒程度。
クラスタをかまさないと、約3分程度かかってしまった。

さて、Clementine への実装方法だが、まず下記の様な raw data を考える。

Cluster のフィールドがついているが、あらかじめ用意しておく。
どうやってクラスタを作るかは今回省略。

類似度の計算は、下記の様なストリーム(プログラミング)で計算できる。


では、一つ一つノードの中身を見ていく。
今回、計算に用いたアルゴリズムとしては、コサイン類似度を使っている。

【①の部分】
派生フィールド: num_2


レコード集計


派生フィールド: mag_vec


フィルタ


【②の部分】
レコード結合

※クラスタがない場合は、user だけで内部結合すれば、OK。

フィルタ


レコード結合


派生フィールド: norm


【③の部分】
レコード集計


派生フィールド: cos_theta


【結果】
ユーザとユーザとの類似度は、

と計算できる。

同じユーザのレコードは、類似度は、1.000になるので、同一ユーザのレコードは削除して使えばよい。

このように類似度が計算できれば、ここから先は、これらを重みに考えて、itemのscoreを計算するだけとなる。

以下の実装過程は省略。

~ その他、過去の参考ブログ ~
★ アイテムベースの協調フィルタリングの話 ★
・アイテムベースの協調フィルタリングの作り方 その1
http://skellington.blog.so-net.ne.jp/2009-08-20

・アイテムベースの協調フィルタリングの作り方 その2
http://skellington.blog.so-net.ne.jp/2009-08-21

★ ユーザーベースでの協調フィルタリングの話 ★
・ユーザベースの協調フィルタリングの一般的な原理
http://skellington.blog.so-net.ne.jp/2009-08-26

・ユーザベースの協調フィルタリングの拡張
http://skellington.blog.so-net.ne.jp/2009-08-27

nice!(1) 
共通テーマ:学問

nice! 1