0

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

4

1 に答える 1

1

あなたはあなたが説明していることを行うことができ、大まかにそれをどのように説明しているか. ユーザーの類似性メトリックを強化するデータ セットは、推奨が行われるデータ セットと実際には異なる可能性があります。実際、ユーザーの類似性メトリックは、好きなものに基づいている可能性があります.

ただし、推奨を行うために使用されるデータ セット内の任意のペアについて、ユーザー間の類似性を生成できる必要があります。UserSimilarity1 人のユーザーが不明な場合に 0 または何かを返すように、実装でこれを単に特別なケースにすることをお勧めします。

于 2012-09-27T20:38:35.250 に答える