Collaborative Filtering with Pythonをコサイン類似度から調整コサイン類似度に変換したいと考えています。調整されたコサイン類似度に対するPython、Cosineの類似度
コサイン類似度ベースの実装は次のようになります
import pandas as pd
import numpy as np
from scipy.spatial.distance import cosine
from scipy.spatial.distance import pdist, squareform
data = pd.read_csv("C:\\Sample.csv")
data_germany = data.drop("Name", 1)
data_ibs = pd.DataFrame(index=data_germany.columns,columns=data_germany.columns)
for i in range(0,len(data_ibs.columns)) :
for j in range(0,len(data_ibs.columns)) :
data_ibs.ix[i,j] = 1-cosine(data_germany.ix[:,i],data_germany.ix[:,j])
data_neighbours = pd.DataFrame(index=data_ibs.columns,columns=range(1,6))
for i in range(0,len(data_ibs.columns)):
data_neighbours.ix[i,:] = data_ibs.ix[0:,i].sort_values(ascending=False)[:5].index
df = data_neighbours.head().ix[:,2:6]
print df
ように見えたSample.csvが使用されている:1
は、ユーザが特定のを購入したことを示し
果物、逆に0
は、ユーザが特定の果物を購入しなかったことを示す
私はこの上記のコードを実行して、私が得るものです:
行は果物や列ですは(降順で)類似ランクされています。この例では、Pear
はApple
に最も類似しており、Melon
は2番目によく似ています。
Adjusted Cosine Similarityでthis postを見つけました。そのアプローチを自分のコードに統合しようとしました。この場合、データは、果物にユーザーによって与えられたスコアを評価されています
はここに私の試みです:
data_ibs = pd.DataFrame(index=data_germany.columns,columns=data_germany.columns)
M_u = data_ibs.mean(axis=1)
M = np.asarray(data_ibs)
item_mean_subtracted = M - M_u[:, None]
for i in range(0,len(data_ibs.columns)) :
for j in range(0,len(data_ibs.columns)) :
data_ibs.ix[i,j] = 1 - squareform(pdist(item_mean_subtracted.T, "cosine")) ### error
data_neighbours = pd.DataFrame(index=data_ibs.columns,columns=range(1,6))
for i in range(0,len(data_ibs.columns)):
data_neighbours.ix[i,:] = data_ibs.ix[0:,i].sort_values(ascending=False)[:5].index
df = data_neighbours.head().ix[:,2:6]
しかし、私はこだわっています。私の質問は、どのように調整されたコサインの類似性がこのサンプルにうまく適用できますか?
あなたが求めている質問は広すぎます - 機械学習技術をうまく適用するためには何千もの要因があります。もっと具体的な質問をする必要があります。具体的な質問は、人々があなたを助ける現実的なチャンスを持つところです。また、「それは止まった」とはどういう意味ですか? –
@Horia Coman、コメントありがとうございました。私はこのサンプルで調整された余弦類似度をうまく適用する方法を尋ねることを意味します。新しい行には "ValueError:配列を持つ配列要素を設定する"という行があります。 –
ああ。私は "###エラー"のコメントが表示されませんでした。 squareformは数字のシーケンスを生成し、それを配列要素に割り当てようとしています。これは単一の数値です。おそらく、その行にデバッガーを踏み出し、それがどのような出力を生成するのかを見てみよう。あるいは、一連の印刷ステートメントを追加します。 –