2 セットのブール値の設定データを使用して、単純なレコメンデーション エンジンを作成しようとしています。1 つのデータ セットを使用して UserSimilarity と UserNeighborhoods を計算し、それらの近傍を使用して 2 番目のブール値の嗜好データ セットから推奨事項を作成したいと考えています。
私はこれが機能しているようですが、問題は、推奨を計算するときに、ユーザーが最初のデータセットに基づいて隣人を持っているが、2番目のデータセットに存在しない場合 (隣人は存在しますが)、推奨が生成されないことです。 .
RecommendationBuilder コードは次のとおりです。
recommenderBuilder = new RecommenderBuilder() {
public Recommender buildRecommender(DataModel recommendationModel) throws TasteException {
UserSimilarity similarity = new LogLikelihoodSimilarity(trainingModel);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, 0.7, similarity, recommendationModel);
return new GenericBooleanPrefUserBasedRecommender(recommendationModel, neighborhood, similarity);
}
};
これが trainingModel ファイルのサンプルです
1,111
2,222
2,111
2,222
3,111
3,222
そしてrecommendModelファイル
1,91
1,92
2,91
これを実行すると、ユーザー 2 には 92 が推奨されますが、ユーザー 3 に到達すると a がスローNoSuchUserException
されます。
Sol... すべてのユーザーが 2 番目のデータ セットに存在する必要なく、別のデータ セットで計算された類似性に基づいて、1 つのデータ セットからレコメンデーションを作成する方法はありますか?
これが私が今取り組んでいる完全なコードです:
private DataModel trainingModel;
private DataModel recommendationModel;
private RecommenderEvaluator evaluator;
private RecommenderIRStatsEvaluator evaluator2;
private RecommenderBuilder recommenderBuilder;
private DataModelBuilder modelBuilder;
@Override
public void afterPropertiesSet() throws IOException, TasteException {
trainingModel = new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel.toDataMap(new FileDataModel(new File("/music.csv")))
);
recommendationModel = new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel.toDataMap(new FileDataModel(new File("/movies.csv")))
);
evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
evaluator2 = new GenericRecommenderIRStatsEvaluator();
recommenderBuilder = new RecommenderBuilder() {
public Recommender buildRecommender(DataModel model) throws TasteException {
UserSimilarity similarity = new LogLikelihoodSimilarity(trainingModel);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, 0.7, similarity, model);
return new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
}
};
modelBuilder = new DataModelBuilder() {
public DataModel buildDataModel( FastByIDMap<PreferenceArray> trainingData ) {
return new GenericBooleanPrefDataModel( GenericBooleanPrefDataModel.toDataMap(trainingData) );
}
};
}
そして、このメソッドを実行します
@Override
public void testData() throws TasteException {
double score = evaluator.evaluate(recommenderBuilder, modelBuilder, trainingModel, 0.9, 1.0);
System.out.println("calculated score: " + score);
try {
IRStatistics stats = evaluator2.evaluate(
recommenderBuilder, modelBuilder, trainingModel, null, 2,
0.0,
1.0
);
System.out.println("recall: " + stats.getRecall());
System.out.println("precision: " + stats.getPrecision());
} catch (Throwable t) {
System.out.println("throwing " + t);
}
List<RecommendedItem> recommendations = recommenderBuilder.buildRecommender(recommendationModel).recommend(1,2);
System.out.println("user 1");
for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation);}
recommendations = recommenderBuilder.buildRecommender(recommendationModel).recommend(2,2);
System.out.println("user 2");
for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation);}
try {
recommendations = recommenderBuilder.buildRecommender(recommendationModel).recommend(3,2);
System.out.println("user 3");
for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation);}
} catch (Throwable t) {
System.out.println("throwing " + t);
}
}
次の出力が生成されます。
計算されたスコア: 0.7033357620239258 再現: 1.0 精度: 1.0 ユーザー 1 ユーザー 2