ユーザーの好みを決定するための類似性に基づいて、Python実装映画推薦システム

コンテンツ推薦システムと協調フィルタリング(CF)系の2つの最も一般的なタイプ。製品に向けて、ユーザの態度に基づく協調フィルタリングは、推奨を生成する属性ベースのコンテンツ推薦システムの類似性に基づいてアイテムをお勧めします。CFメモリは、協調フィルタリング、およびモデルベースの協調フィルタリングに基づいて分割することができます。

私たちは、実装時に設定され、最も一般的なデータの一つであり、テストのリコメンデーション・エンジンが使用されている、943人のユーザーとスコアの選択から1682年の映画が含まれているMovieLensデータセットを、使用することができます。

インポートnumpyのライブラリとパンダ


import numpy as np

import pandas as pd

u.dataデータファイルを読みます


header = ['user_id', 'item_id', 'rating', 'timestamp']

df = pd.read_csv('u.data', sep = '\t', names = header)

ユーザーや映画の数を確認してください


n_users = df.user_id.unique().shape[0]

n_items = df.item_id.unique().shape[0]

print 'Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items)


Number of users = 943 | Number of movies = 1682

トレーニングセットとテストセットに分割されたデータセットを使用してライブラリをScikit学習、呼び出しCross_validation.train_test_split二つのデータセットに試験サンプル(test_size)データシャッフリングおよび分割の比率に応じ。


from sklearn import cross_validation as cv

train_data,test_data = cv.train_test_split(df, test_size = 0.25)

協調フィルタリングメモリに基づいて、

- と協調フィルタリング製品 - 製品協調フィルタリングユーザ:メモリベースの協調フィルタリング方法は、2つの部分に分割されてもよいです。ユーザー - 協調フィルタリング製品は、ユーザーのユーザーに見られるものと類似している類似性スコアに基づいて特定のユーザーを選択し、製品のようなその類似ユーザをお勧めします。 - 製品の協調フィルタリングでは、製品を選択し、製品のユーザーのように見つけ、とも言っています、これらのユーザーに似た他の製品を検索します。

ユーザー - 協調フィルタリング製品:「のようにこのようなものを愛する人々......」

- 製品の協調フィルタリング:「あなたのような人々はまた、好き......」

両方の場合において、ユーザアイテム行列は、全体のデータセットから構築します。

ユーザー製品マトリックスの例:

類似度を算出し、類似性マトリックスを作成します。

製品 - 製品をフィルタリング製品の共同の間の類似性は、二つの製品を得点、すべてのユーザーを観察することによって測定されます。

ユーザ - 協調フィルタリング製品との間のユーザ類似度は、同時に2つの製品を得点すべてのユーザーを観察することによって測定されます。

スコアリングは、n次元空間内のベクトルとして見られている前記距離マトリックスは、一般に、コサイン類似度は、推薦システムで使用され、類似度を算出ベクトル間の角度に基づいています。

テストとトレーニングデータのためのユーザ製品マトリックスデータを作成し、二つの行列を作成します。


train_data_matrix = np.zeros((n_users,n_items))

for line in train_data.itertuples():

train_data_matrix[line[1]-1, line[2]-1] = line[3]

test_data_matrix = np.zeros((n_users, n_items))

for line in test_data.itertuples():

test_data_matrix[line[1]-1, line[2]-1] = line[3]

これはpairwise_distances sklearn関数のコサイン類似度を用いて計算されます。


from sklearn.metrics.pairwise import pairwise_distances

user_similarity = pairwise_distances(train_data_matrix, metric = "cosine")

item_similarity = pairwise_distances(train_data_matrix.T, metric = "cosine")

作成された類似度行列を持つ:user_similarityとitem_similarityは、それゆえ、以下の式を適用することにより、ユーザーのCFに基づいて予測を行うことができます。

スコアは1と5との間に位置するように、ユーザ権限とユーザkとの類似性は、最終的に予測することを試みるために、正規化された値が必要な同様のユーザ(ユーザ訂正評価)スコアを乗じた量とすることができるように平均スコアは、ユーザーを合計します。

次の製品CFアプリケーションの会社に基づいて平均予測スコア、ユーザーを修正する必要がなく、この時間


def predict(rating, similarity, type = 'user'):

if type == 'user':

mean_user_rating = rating.mean(axis = 1)

rating_diff = (rating - mean_user_rating[:,np.newaxis])

pred = mean_user_rating[:,np.newaxis] + similarity.dot(rating_diff) / np.array([np.abs(similarity).sum(axis=1)]).T

elif type == 'item':

pred = rating.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])

return pred


item_prediction = predict(train_data_matrix, item_similarity, type = 'item')

user_prediction = predict(train_data_matrix, user_similarity, type = 'user')

評価します

ここでは根二乗誤差(RMSE)を意味予測スコアの精度を測定するために、

もし前記MSE RMSEの平方根のみ、sklearnのmean_square_error(MSE)関数で使用することができます。


from sklearn.metrics import mean_squared_error

from math import sqrt

def rmse(prediction, ground_truth):

prediction = prediction[ground_truth.nonzero()].flatten()

ground_truth = ground_truth[ground_truth.nonzero()].flatten()

return sqrt(mean_squared_error(prediction, ground_truth))


print 'User based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix))

print 'Item based CF RMSe: ' + str(rmse(item_prediction, test_data_matrix))


User based CF RMSE: 3.12466203536

Item based CF RMSe: 3.45056350625

図から分かるように、内容に基づくアルゴリズムを実装し、合理的な予測品質を生成することは容易です。

ベースの協調フィルタリングモデル

ベースの協調フィルタリングモデルは行列因数分解(MF)に基づいており、マトリックス分解推薦システムが広く使用され、それはメモリベースCF以上であると、より優れたスケーラビリティとスパース性を有しています。MFの目標は、ユーザーの知ら好みや潜在的な得点潜在的な製品の属性から学ぶこと、そして潜在的なユーザーや製品のドット製品特性によって、未知のスコアを予測することです。

計算MovieLensデータセットスパース:


sparsity = round(1.0 - len(df) / float(n_users*n_items),3)

print 'The sparsity level of MovieLen100K is ' + str(sparsity * 100) + '%'


The sparsity level of MovieLen100K is 93.7%

SVD

与えられたM * nの行列X:

Uは、(M * r)は直交行列であります

Sは対角非負実数(R * R)の対角行列であります

V ^ Tは、(R * n)が直交行列であります

Sの対角要素は、Xの特異値と呼ばれています

Xは、行列U、SおよびVに分解することができます Uは、特性行列隠れユーザ空間の特性に対応する行列を表し、行列Vは、隠された空間の行列積の特性に対応する特性を示しています。

今は、U、Sとの内積のV ^ Tによって予測することができます。


import scipy.sparse as sp

from scipy.sparse.linalg import svds

u, s, vt = svds(train_data_matrix, k = 20)

s_diag_matrix = np.diag(s)

x_pred = np.dot(np.dot(u,s_diag_matrix),vt)

print 'User-based CF MSE: ' + str(rmse(x_pred, test_data_matrix))


User-based CF MSE: 2.72035726617

要約:

コンテンツベースのCFとCFベースのモデルを含め、シンプルな協調フィルタリング手法を実現するために、

モデルは、コサイン類似度を用いた製品に基づいてユーザーまたは、間のコンテンツの類似性に基づいています。

CDベースのモデルは、マトリックスを分解するためにSVDを使用して、マトリックス分解に基づいています

コールドスタートの面に難実行標準協調フィルタリング方法。

参考資料

Pythonで独自の推薦システムの実装

これらは、私たちが持って来るように人気のPython推薦システムコード小扁のいくつかの今日です。
私は学校の友人エディターズチョイスラーニングで学習する方法がわからない混乱してありますPythonの学習qun 315 -346- 913一緒に学ぶ一緒に学び、進歩することができます!無料動画を共有

 

おすすめ

転載: blog.csdn.net/weixin_44995023/article/details/92074987