Pythonを使った協調フィルタリング手法
協調フィルタリングは、ユーザーが気に入りそうなアイテムを予測するために使用されるレコメンデーションシステムのアルゴリズムです。Pythonではnumpyやpandasなどのライブラリを使用して協調フィルタリングアルゴリズムを実装できます。
ユーザベースの協調フィルタリングは一般的な協調フィルタリングアルゴリズムの1つであり、その手順を以下に示します。
- ユーザーとアイテムの評価行列を作成します。評価行列とは2次元行列です。行がユーザーを表し、列がアイテムを表します。各要素はアイテムに対するユーザーの評価を表します。
- ユーザー同士の類似度を計算します。余弦類似度やピアソン相関係数などの方法でユーザー同士の類似度を計算します。
- 似通性に基づき、対象ユーザーに最も似通った K 個のユーザーを検索します。ヒープソートや優先キューなどのデータ構造を使用して、最も似通性の高い K 個のユーザーを検索します。
- 類似ユーザーの評価に基づき、対象ユーザーが評価していないアイテムへの評価を予測する。加重平均や加重和などの手法を用いて予測することができる。
numpyとpandasを使ってユーザーベースの協調フィルタリングを実装した例を以下に示します。
import numpy as np
import pandas as pd
# 构建评分矩阵
ratings = np.array([[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4]])
# 计算用户之间的相似度
similarity = np.dot(ratings, ratings.T) + 1e-9
norms = np.array([np.sqrt(np.diagonal(similarity))])
similarity = similarity / (norms * norms.T)
# 找到与目标用户最相似的K个用户
target_user_index = 0
K = 2
similar_users = np.argsort(similarity[target_user_index])[::-1][1:K+1]
# 预测目标用户对未评分物品的评分
target_user_ratings = ratings[target_user_index]
predicted_ratings = np.zeros_like(target_user_ratings)
for item_index in range(len(target_user_ratings)):
if target_user_ratings[item_index] == 0:
ratings_sum = 0
similarity_sum = 0
for user_index in similar_users:
if ratings[user_index][item_index] != 0:
ratings_sum += similarity[target_user_index][user_index] * ratings[user_index][item_index]
similarity_sum += similarity[target_user_index][user_index]
if similarity_sum != 0:
predicted_ratings[item_index] = ratings_sum / similarity_sum
# 输出预测评分
print(predicted_ratings)
上のコード中、最初にレーティング行列を作成し、NumPyを使用してユーザー間の類似度を計算しました。次に、ターゲットユーザーに最も類似したK人のユーザーを見つけ、類似ユーザーのレーティングに基づいて、ターゲットユーザーが未レーティングアイテムに与えるレーティングを予測します。最後に、予測レーティングを出力します。
類似度を重み付けしたり、結果の後処理を行ったりする必要が生じるかもしれません。また、アイテム系の協調フィルタリングなどの他のタイプの協調フィルタリングアルゴリズムもあるので、具体的なニーズに応じて適切なアルゴリズムの実装を選択してください。