導入
パーソナライズされた推奨システムは、現代のデジタル時代において重要な役割を果たしており、ユーザーが興味を持ちそうな情報、製品、メディア コンテンツを発見できるように支援します。協調フィルタリングは、パーソナライズされたレコメンデーション システムで最も一般的で効果的なアルゴリズムの 1 つです。
目次
協調フィルタリングアルゴリズムの原理
ユーザーベースの協調フィルタリング
ユーザー類似度の計算
ユーザー間の類似性を計算する場合、通常、コサイン類似度やピアソン相関係数などの尺度が使用されます。
コサイン類似度
コサイン類似度は、2 つの非ゼロ ベクトル間の角度を測定する類似度の尺度です。協調フィルタリングでは、ユーザーをベクトルとして見ることができます。各次元は項目を表し、値はその項目に対するユーザーの評価を表します。
コサイン類似度の計算手順は次のとおりです。
- 2 つのユーザー ベクトルの内積 (内積) を計算します。
- 各ユーザー ベクトルのノルム (モジュロ) を計算します。
- コサイン類似度は、ドット積とノルムの積を使用して計算されます。
コサイン類似度の式は次のとおりです。
デモ
import numpy as np
# 两个用户的评分向量
user1_ratings = np.array([5, 4, 0, 0, 1])
user2_ratings = np.array([0, 0, 5, 4, 2])
# 计算余弦相似度
cosine_similarity = np.dot(user1_ratings, user2_ratings) / (np.linalg.norm(user1_ratings) * np.linalg.norm(user2_ratings))
print(f"余弦相似度: {cosine_similarity}")
ピアソン相関係数
ピアソン相関係数は、2 つの変数間の線形関係の強さと方向を測定するために使用される統計的尺度です。協調フィルタリングでは、ユーザー評価間の相関関係を測定するために使用されます。
ピアソン相関係数を計算する手順は次のとおりです。
- ユーザー評価の 2 つのベクトルの平均を計算します。
- 各ユーザー評価ベクトルの平均からの差を計算します。
- 差のピアソン相関係数を計算します。
ピアソン相関係数の式は次のとおりです。
デモ
import numpy as np
# 两个用户的评分向量
user1_ratings = np.array([5, 4, 0, 0, 1])
user2_ratings = np.array([0, 0, 5, 4, 2])
# 计算均值
mean_user1 = np.mean(user1_ratings)
mean_user2 = np.mean(user2_ratings)
# 计算差异
diff_user1 = user1_ratings - mean_user1
diff_user2 = user2_ratings - mean_user2
# 计算皮尔逊相关系数
pearson_correlation = np.sum(diff_user1 * diff_user2) / (np.sqrt(np.sum(diff_user1**2)) * np.sqrt(np.sum(diff_user2**2)))
print(f"皮尔逊相关系数: {pearson_correlation}")
近隣ユーザーの選択
類似性の尺度
類似ユーザーを選択する場合、まず類似度の測定方法を定義する必要があります。一般的に使用される類似度の測定方法には、コサイン類似度、ピアソン相関係数、ジャッカード類似度などが含まれます。適切な類似性尺度の選択は、データの性質と問題の特性によって異なります。コサイン類似度は通常、評価データに使用されますが、Jaccard 類似度は通常、バイナリ データ (ユーザーが項目を気に入ったかクリックしたかどうか) に使用されます。
ユーザーの隣人の選択
類似性測定方法を選択したら、次のステップは、選択する類似ユーザーの数を決定することです。通常、選択される類似ユーザーの数は、「最近傍ユーザー」と呼ばれるパラメーター k によって制御されます。k を増やすとカバレッジが向上しますが、より多くのユーザーに類似性の低いユーザーが含まれる可能性があるため、精度が低下する可能性があります。適切な k の選択はトレードオフの問題であり、相互検証などの手法によって決定できます。
閾値フィルタリング
k ベースの選択に加えて、しきい値フィルタリングを使用して同様のユーザーを選択することもできます。例えば、対象ユーザとの類似度が一定の閾値以上であるユーザのみを選択する。このアプローチは、類似性の低いユーザーを除外し、推奨の精度を向上させるのに役立ちます。しきい値の選択は通常、実際の問題とデータに基づいて調整する必要があります。
パーソナライズされた類似性の重み
場合によっては、異なるユーザー間の類似性が異なる重要性を持つことがあります。たとえば、特定のユーザーは、特定のドメインまたは期間におけるターゲット ユーザーの行動により関連している可能性があります。したがって、同様の各ユーザーには、その貢献をより適切に反映するために個別の類似度の重みを割り当てることができます。
スコア予測
まず、過去にターゲット ユーザーと同様の行動をとった類似ユーザーのセットを選択する必要があります。コサイン類似度やピアソン相関係数など、事前に計算された類似性尺度を使用して、ユーザー間の類似性を測定できます。
類似ユーザーが選択されたら、まだ評価されていないアイテムについて、これらの類似ユーザーの過去の評価データを取得する必要があります。これらの評価データは、対象ユーザーの評価を予測するために使用されます。
次に、類似ユーザーの過去の評価データを使用して、まだ評価されていないアイテムに対するターゲット ユーザーの予測評価を計算します。
加重平均法または加重回帰に基づく方法を使用できます。
注: 以下の部分は詳細には展開されませんが、開始に基づいて展開できます。
アイテムベースの協調フィルタリング
- アイテムの類似性の計算: コサイン類似度などの尺度を使用して、アイテム間の類似性を計算する方法について詳しく説明します。
- 近隣アイテムの選択: ターゲット ユーザーが評価したアイテムに類似したアイテムを見つけて、より正確な推奨事項を生成する方法についての詳細な議論。
- 評価の予測: これらの類似アイテムの過去の評価に基づいて最終的な推奨事項を生成する方法について説明します。
協調フィルタリングのさまざまなバリエーション
- 暗黙的フィードバックに基づく協調フィルタリング: ユーザーの閲覧履歴やクリック記録などの暗黙的フィードバック データを処理します。
- 深層学習における協調フィルタリング: 深層学習モデルを使用して協調フィルタリングのパフォーマンスを向上させます。
- 時間的協調フィルタリング: 時間的要因を考慮して、ユーザーの行動と興味の進化を予測します。
データの前処理
- データの準備: ユーザー項目の評価データを準備します。通常は DataFrame の形式で表されます。
- データ クリーニング: 欠損値、外れ値、重複データを処理して、データの品質を確保します。
- データ分割: モデルのトレーニングと評価のために、データセットをトレーニング、検証、およびテスト セットに分割します。
Pythonの例
ユーザー項目評価マトリクスの作成
import pandas as pd
# 创建用户-项目评分矩阵
ratings = pd.DataFrame({
'User1': [5, 4, 0, 0, 1],
'User2': [0, 0, 5, 4, 2],
'User3': [4, 5, 0, 0, 0],
'User4': [0, 0, 4, 5, 0]
}, index=['Item1', 'Item2', 'Item3', 'Item4', 'Item5'])
ユーザーベースの協調フィルタリング
from sklearn.metrics.pairwise import cosine_similarity
# 计算用户之间的相似性(余弦相似度)
user_similarity = cosine_similarity(ratings.fillna(0))
# 选择目标用户和要推荐的项目
target_user = 'User1'
target_item = 'Item3'
# 预测目标用户对目标项目的评分
target_user_ratings = ratings.loc[:, target_user]
similar_users = user_similarity[ratings.index == target_item]
predicted_rating = (similar_users @ target_user_ratings) / sum(similar_users[0])
print(f"预测用户{target_user}对项目{target_item}的评分为: {predicted_rating[0]}")
アイテムベースの協調フィルタリング
# 预测目标用户对目标项目的评分
target_item_ratings = ratings.loc[target_item, :]
similar_items = item_similarity[ratings.columns == target_item]
predicted_rating = (similar_items @ target_item_ratings) / sum(similar_items[0])
print(f"预测用户{target_user}对项目{target_item}的评分为: {predicted_rating[0]}")
パフォーマンスの最適化とスケーリング
この例に基づいて、次の方向で最適化を行うこともできます。
- モデルの改善: 協調フィルタリング モデルを改善します。これには、重み付きスコアリングの使用、時間要素の考慮などが含まれ、レコメンデーションの品質を向上させます。
- 大規模データ処理: 大量のユーザーやアイテムの評価データを処理するために、分散コンピューティングと分散ストレージの使用を含む大規模なデータ セットを処理します。
- リアルタイム レコメンデーション: ユーザーの当面のニーズを満たすために、協調フィルタリング アルゴリズムをリアルタイム レコメンデーション システムに適用する方法を紹介します。