2017-03-20 22 views
1

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は、ユーザが特定のを購入したことを示し

Sample.csv

果物、逆に0は、ユーザが特定の果物を購入しなかったことを示す

私はこの上記のコードを実行して、私が得るものです:

行は果物や列です

results1

は(降順で)類似ランクされています。この例では、PearAppleに最も類似しており、Melonは2番目によく似ています。

Adjusted Cosine Similarityでthis postを見つけました。そのアプローチを自分のコードに統合しようとしました。この場合、データは、果物にユーザーによって与えられたスコアを評価されています

ratings

ここに私の試みです:

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] 

しかし、私はこだわっています。私の質問は、どのように調整されたコサインの類似性がこのサンプルにうまく適用できますか?

+1

あなたが求めている質問は広すぎます - 機械学習技術をうまく適用するためには何千もの要因があります。もっと具体的な質問をする必要があります。具体的な質問は、人々があなたを助ける現実的なチャンスを持つところです。また、「それは止まった」とはどういう意味ですか? –

+0

@Horia Coman、コメントありがとうございました。私はこのサンプルで調整された余弦類似度をうまく適用する方法を尋ねることを意味します。新しい行には "ValueError:配列を持つ配列要素を設定する"という行があります。 –

+1

ああ。私は "###エラー"のコメントが表示されませんでした。 squareformは数字のシーケンスを生成し、それを配列要素に割り当てようとしています。これは単一の数値です。おそらく、その行にデバッガーを踏み出し、それがどのような出力を生成するのかを見てみよう。あるいは、一連の印刷ステートメントを追加します。 –

答えて

1

ここでは、問題に対するNumPyベースの解決方法を示します。アレイに

まずストア評価データ:

M_u = M.mean(axis=1) 
item_mean_subtracted = M - M_u[:, None] 
similarity_matrix = 1 - squareform(pdist(item_mean_subtracted.T, 'cosine')) 

そして最後に、我々は、類似性の降順に検索結果を並べ替える:

fruits = np.asarray(['Apple', 'Orange', 'Pear', 'Grape', 'Melon']) 
M = np.asarray(data.loc[:, fruits]) 

はその後、我々は、調整余弦類似度行列を計算

indices = np.fliplr(np.argsort(similarity_matrix, axis=1)[:,:-1]) 
result = np.hstack((fruits[:, None], fruits[indices])) 

デモ

In [49]: M 
Out[49]: 
array([[ 0, 10, 0, 1, 0], 
     [ 6, 0, 0, 0, 2], 
     [ 1, 0, 20, 0, 1], 
     [ 0, 3, 6, 0, 18], 
     [ 3, 0, 2, 0, 0], 
     [ 0, 2, 0, 5, 0]]) 

In [50]: np.set_printoptions(precision=2) 

In [51]: similarity_matrix 
Out[51]: 
array([[ 1. , 0.01, -0.41, 0.48, -0.44], 
     [ 0.01, 1. , -0.57, 0.37, -0.26], 
     [-0.41, -0.57, 1. , -0.56, -0.19], 
     [ 0.48, 0.37, -0.56, 1. , -0.51], 
     [-0.44, -0.26, -0.19, -0.51, 1. ]]) 

In [52]: result 
Out[52]: 
array([['Apple', 'Grape', 'Orange', 'Pear', 'Melon'], 
     ['Orange', 'Grape', 'Apple', 'Melon', 'Pear'], 
     ['Pear', 'Melon', 'Apple', 'Grape', 'Orange'], 
     ['Grape', 'Apple', 'Orange', 'Melon', 'Pear'], 
     ['Melon', 'Pear', 'Orange', 'Apple', 'Grape']], 
     dtype='|S6') 
+0

仕事に協力していただきありがとうございます!私は両方の投票をして答えを選んだ(時差があるので、遅く返事を申し訳ありません:)。 –

+0

しかし、私がここに来ているのは、すべて "nan"です。 –

+1

'M = np.asarray(data.loc [:、fruits])'によって 'M = np.asarray(data_ibs.loc [:、fruits])'を置き換える必要があります。私はそれに応じて私の答えを編集しました。 – Tonechas

関連する問題