製品分類に基づいてコンテンツ ベースの類似性をシミュレートするカスタム アイテムの類似性を作成しました。次の 2 つのアイテムだけを気に入っているユーザーがいます。
UserId ItemId Preference
7656361 1449133 1.00
7656361 18886199 8.00
私のカスタムitemSimilarity
は [-1,1] の値を返します。ここで、1 は強い類似性を意味し、-1 は強い非類似性を意味します。ユーザーが気に入った 2 つのアイテムには、分類ツリー内で最も低い共通の祖先がないため、値が 1 ではありません。ただし、一部のアイテムでは 0、0.20、および 0.25 の値になります。
私は次の方法で推奨事項を作成します。
ItemSimilarity similarity = new CustomItemSimilarity(...);
Recommender recommender = new GenericItemBasedRecommender(model, similarity);
List<RecommendedItem> recommendations = recommender.recommend(7656361, 10);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
私は次の結果を得ています:
RecommendedItem[item:899604, value:4.5]
RecommendedItem[item:1449081, value:4.5]
RecommendedItem[item:1449274, value:4.5]
RecommendedItem[item:1449259, value:4.5]
RecommendedItem[item:715796, value:4.5]
RecommendedItem[item:3255539, value:4.5]
RecommendedItem[item:333440, value:4.5]
RecommendedItem[item:1450204, value:4.5]
RecommendedItem[item:1209464, value:4.5]
RecommendedItem[item:1448829, value:4.5]
一見誰かが言うだろう、それはレコメンデーションを生成します。ペアごとのアイテム間の比較を行うため、 から値を出力しようとしましたitemSimilarity
が、次の驚くべき結果が得られました。
ItemID1 ItemID2 Similarity
899604 1449133 -1.0
899604 18886199 -1.0
1449081 1449133 -1.0
1449081 18886199 -1.0
1449274 1449133 -1.0
1449274 18886199 -1.0
1449259 1449133 -1.0
1449259 18886199 -1.0
715796 1449133 -1.0
715796 18886199 -1.0
3255539 1449133 -1.0
3255539 18886199 -1.0
333440 1449133 -1.0
333440 18886199 -1.0
1450204 1449133 -1.0
1450204 18886199 -1.0
1209464 1449133 -1.0
1209464 18886199 -1.0
1448829 1449133 -1.0
1448829 18886199 -1.0
228964 1449133 -1.0
228964 18886199 0.25
57648 1449133 -1.0
57648 18886199 0.0
899573 1449133 -1.0
899573 18886199 0.2
950062 1449133 -1.0
950062 18886199 0.25
5554642 1449133 -1.0
5554642 18886199 0.0
...
そして、さらにいくつかあります。それらは製造オーダーにはありません。要点を言いたかっただけです。-1 の非常に強い非類似性を持つアイテムはすべて推奨され、0.0、0.2、および 0.25 の類似性を持つアイテムはまったく推奨されません。これはどのように可能ですか?itemSimilarity
インターフェイスのメソッドにItemSimilarity
は、次の説明があります。
このインターフェースの実装は、2 つのアイテム間の類似性の概念を定義します。実装は、-1.0 から 1.0 の範囲の値を返す必要があります。1.0 は完全な類似性を表します。
[0,1] 間の類似性を使用すると、次の推奨事項が得られます。
RecommendedItem[item:228964, value:8.0]
RecommendedItem[item:899573, value:8.0]
RecommendedItem[item:950062, value:8.0]
ペアごとの類似度は次のとおりです (それらのツリーのみ、他のツリーは 0):
228964 1449133 0.0
228964 18886199 0.25
950062 1449133 0.0
950062 18886199 0.25
228964 1449133 0.0
228964 18886199 0.25
EDIT1449133, 18886199
: with:に最もよく似たアイテムも印刷しました(GenericItemBasedRecommender)delegate).mostSimilarItems(new long[]{1449133, 18886199}, 10)
。[RecommendedItem[item:228964, value:0.125], RecommendedItem[item:950062, value:0.125], RecommendedItem[item:899573, value:0.1]]
アイテム 18886199 のみ、(GenericItemBasedRecommender)delegate).mostSimilarItems(new long[]{18886199}, 10)
を入手し[RecommendedItem[item:228964, value:0.25]]
ました。似たような商品は1449133
ありません。
なぜそれが強い相違点で機能しないのかわかりませんか?もう 1 つの疑問は、予測された選好値がすべて8.0
またはである理由4.5
です。18886199
おすすめ商品と商品だけが類似しているのがわかりますが、 の場合の類似度に 8.0 の値を掛けて、 の代わりに の0.25
値を求める方法はありますか?これは、ユーザーがまだわからないため、類似度を計算している間は実行できませんが、推奨段階で実行する必要があると思います。これはレコメンダーがどのように機能するべきか、またはカスタムのレコメンダーを作成してカスタムの方法でジョブを実行する必要があるのではないでしょうか?2.0
8.0
Mahout コミュニティの誰かが私に指示を与えることができれば、本当に感謝しています。