機械学習勉強会 #3 9章 クラスタリング10章 k近傍法を用いた推薦システム
@ketancho
アジェンダ
1. クラスタリングとは(9章)
2. k近傍法とは(10.1)
3. k近傍法を用いた推薦システムとは(10.2)
4. 私のやりたかった推薦について皆さんに逆質問するコーナー
1. クラスタリングとは(9章)
2. k近傍法とは(10.1)
3. k近傍法を用いた推薦システムとは(10.2)
4. 私のやりたかった推薦について皆さんに逆質問するコーナー
クラスタリング #とは
・ある集団における各メンバの類似度を知りたい・ex. 「この人と女性の趣味があうかを知りたい」
クラスタリング #やってみた
S氏 普通 うーん まぁまぁ うーん うーん 好きや!G氏 ふつー 好き! うーん。 ふつー ふつー 大好き!・・K氏 うーん ふつー うーん うーん 大好き 好きや! (私)
クラスタリング #やってみた
S氏 0 -1 0 -1 0 1G氏 0 1 -1 0 0 1・・K氏 -1 0 -1 -1 1 1 (私)
クラスタリング #やってみた
1. 評価を符号化(+1, 0, -1)して行列化する
クラスタリング #やってみた
2. 行列を作って転置したものと掛け合わせる
※(互いの同意の数ー非同意の数)になる →値が正なら同意見が多く、負なら反対意見が多い
クラスタリング #やってみた
3. 人ごとのn次元ユークリッド距離を求める(今回は n = 7)
クラスタリング #やってみた
4. 可視化してみる
1. クラスタリングとは(9章)
2. k近傍法とは(10.1)
3. k近傍法を用いた推薦システムとは(10.2)
4. 私のやりたかった推薦について皆さんに逆質問するコーナー
k近傍法 #とは
・単純な線形の決定線境界を引けないときもある
?
k近傍法 #とは
・k近傍法 => 入力に最も近いk個の点の多数決で予測を行う
k=3 の場合は○(k=1 の場合は△)
?
k近傍法 10.1でやってること
100個の x, y, label(0 or 1) のデータがある→各点ごとの x, y から k近傍法でlabelを予想し、予想と事実の差異を比較
k近傍法 10.1でやってること
1. 各点ごとの距離を表すテーブル(100x100)を作成する
2. 各点ごとに自分に近い点の順に並び替え、 上位25個(k=25)の点のLabelで多数決を取る
3. 2. で行ったk近傍法の予測値を元テーブルに付与する
4. Label と 予測値の合致率を求める →このデータでは合致率93%
私のやりたかったレコメンドとイメージが違う。。
(余談)私のやりたかったレコメンド #とは
友人A氏「さしこが好きで、ゆきりんはあまりタイプじゃないんだけど、 他に可愛いメンバ紹介してよ。」
私「(Bもさしこ好きで、ゆきりんあんまりって言ってて、 たしかあいつさや姉も好きって言ってたな。) 山本彩っていう子がオススメだよ! あと松井玲奈ちゃんがめっちゃかわいい! 」
とか言っててもしょうがないので、10.2を読んでみました。
1. クラスタリングとは(9章)
2. k近傍法とは(10.1)
3. k近傍法を用いた推薦システムとは(10.2)
4. 私のやりたかった推薦について皆さんに逆質問するコーナー
k近傍法 10.2でやってること
アイテムベースの方法を用いて、Rプログラマ50人が使用しているパッケージ情報を元に、あるユーザが各パッケージをインストールしているかどうかを、そのユーザがインストールした他のパッケージの情報を用いて予測する。
ユーザ(50人)ごとにパッケージ(2,487件)を入れているか否かのデータ
k近傍法 10.2でやってること
1. 元データが縦長のデータになっているので、50 x 2,487 のテーブルに変換
2. 類似度の指標として、各列の相関係数テーブルを求める ※ 2,487 x 2,487 のテーブル(-1 ~ 1の実数が入っている)
ユーザ
パッケージ
k近傍法 10.2でやってること
3. k近傍法を使うために類似度(相関)を距離に変換する。 類似度1を距離0、類似度-1を距離∞に変換する
4. k近傍を取得する関数を作る
k近傍法 10.2でやってること
5. 4. の関数を用い、各パッケージごとに25つの近傍パッケージ(★)を取得。 各ユーザが★をインストールしているかを調べ、 (★の中でインストールしているパッケージの総数)/25 をそのパッケージをインストールしている確率にする
ユーザ1はパッケージ1の★のうち19パッケージをインストール済なので、 パッケージ1をインストールしている確率は 0.76 となる
k近傍法 10.2でやってること
6. 全てのパッケージについてインストールされている確率を計算し、 確率をソートして、上位のパッケージを推薦する
やっぱり私のやりたいレコメンドとは違った。既に分かっていることを推薦するのって意味ないんじゃ?
1. クラスタリングとは(9章)
2. k近傍法とは(10.1)
3. k近傍法を用いた推薦システムとは(10.2)
4. 私のやりたかった推薦について皆さんに逆質問するコーナー
・「協調フィルタリング」 →他の人の嗜好を蓄積しておき、似ている人を見つけ、ユーザに推薦を行う
※まさに「さしこが好きで、ゆきりんが・・」の方法
・「内容ベースフィルタリング」 →推薦の対象物(例えばAKBGのメンバ)の特徴から、ユーザに推薦を行う
※「黒髪の子がいい」とか「背が155cmより低い子がいい」とか?
私がやりたいレコメンド #やってみた
私がやりたいレコメンド #やってみた
・「アイテムベース」 →蓄積したデータから「セットで好まれる数」を計算し、推薦する
※「さしことさや姉両方好きって言う人が多い」 「この人さしこ好きらしい」 →さや姉を紹介する?
・「ユーザベース」 →好みの一致割合からユーザとの類似度を計算する
私がやりたいレコメンド #やってみた
私がやりたいレコメンド #やってみた
課題 ・類似度の出し方ってこれでいいの?
・類似度が同じだったときに、推薦対象は多数決で決めていいの?
・精度を上げるには蓄積データを増やす必要があるけど、 増やしすぎると処理時間かなり増えそう
・そもそも序盤のデータ蓄積どうするの? 何件あればそれなりの精度になるの?
なにかと課題は多そうですが、スモールスタートでサービス作ってみます。