http://www.yoheim.net/blog.php?q=20160313
のサイトを参考にレコメンドシステムを作っています。
import numpy as np from scipy.spatial.distance import cosine from scipy.spatial.distance import pdist from scipy.spatial.distance import squareform x = np.array([ [1,1,1,0,0,0], [1,1,0,0,0,0], [0,0,1,0,1,0], [0,0,1,1,1,0], [0,1,1,0,0,0], [1,1,0,1,1,0], [1,0,1,0,0,0], [0,0,0,0,0,1] ]) #列に変換 #print(x.T[0]) #print(x.T[1]) #コサイン類似度 item1 = x.T[0] item2 = x.T[1] sim = 1 - cosine(item1, item2) #全てのアイテムのコサイン類似度 # アイテムを行に、ユーザーを列に転置する x = x.T #print(x) # 行ごと(=つまりアイテムごと)の距離を計算する d = pdist(x, 'cosine') #print(d) # 「類似度 = 1 - 距離」 d = 1 - d #結果をベクトルから行列に変換 d = squareform(d) #推薦結果を作成する # 自分自身は対象外にしたいので、優先度を下げる me = np.eye(d.shape[0]) d = d - me # item1〜6まで、類似度の高い順に3つ推薦対象とする for idx in range(x.shape[0]): item1_sim = d[:,idx] item1_rel = [] for i in range(item1_sim.shape[0]): item1_rel.append(('item%d'%(i+1), item1_sim[i])) item1_rel = sorted(item1_rel, key=lambda d:d[1], reverse=True) # 3件に絞る item1_rel = item1_rel[:3] print(item1_rel) print(" ", item1_rel) print("") print(item1) print(item2)
とコードを書いて実行すると見本と同じ動きをさせることができました。
でも、
# item1〜6まで、類似度の高い順に3つ推薦対象とする for idx in range(x.shape[0]): item1_sim = d[:,idx] item1_rel = [] for i in range(item1_sim.shape[0]): item1_rel.append(('item%d'%(i+1), item1_sim[i])) item1_rel = sorted(item1_rel, key=lambda d:d[1], reverse=True)
の部分がわかりません。まず、
x.shape[0]
と
item1_sim.shape[0]
の.shape配列のインデックス0指定で何をしているのかがわかりません。
shape は,スカラーや,タプルによって配列の各次元の大きさを表す属性です. 例えば,大きさが 5 のベクトルはスカラー 5 によって, 2×3 の行列はタプル (2, 3) となります.
http://www.kamishima.net/mlmpyja/nbayes2/shape.html
とあるように、
配列の大きさをメソッドチェーンで変数にくっつけて何ができるのかな、と。
あと、
類似度の高い順に3つ推薦対象とするのにfor文を2回使う理由がわかりません。どうしてここではfor文を2回使っているのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。