2

次のコードの問題点と、匿名ユーザーに推奨事項が生成されない理由を教えてください。
何が問題なのかわかりませんが、PlusAnonymousUserDataModel を使用して匿名ユーザーの推奨事項を取得できません。これはコード例で、匿名ユーザーへの推奨は表示されませんが、モデル内のユーザーにはまったく同様の設定が推奨されます。

public static void main(String[] args) throws Exception {
    DataModel model = new GenericBooleanPrefDataModel(
            GenericBooleanPrefDataModel.toDataMap(new FileDataModel(
                    new File(args[0]))));
    PlusAnonymousUserDataModel plusAnonymousModel = new PlusAnonymousUserDataModel(model);

    UserSimilarity similarity = new LogLikelihoodSimilarity(model);
    UserNeighborhood neighborhood =
            new NearestNUserNeighborhood(
                    Integer.parseInt(args[1]), similarity, model);
    //new ThresholdUserNeighborhood(Float.parseFloat(args[1]), similarity, model);


    System.out.println("Neighborhood=" + args[1]);
    System.out.println("");




    Recommender recommender = new GenericBooleanPrefUserBasedRecommender(model,
            neighborhood, similarity);


    PreferenceArray anonymousPrefs =
            new BooleanUserPreferenceArray(12);
    anonymousPrefs.setUserID(0,
            PlusAnonymousUserDataModel.TEMP_USER_ID);
    anonymousPrefs.setItemID(0, 1105L);
    anonymousPrefs.setItemID(1, 1201L);
    anonymousPrefs.setItemID(2, 1301L);
    anonymousPrefs.setItemID(3, 1401L);
    anonymousPrefs.setItemID(4, 1502L);
    anonymousPrefs.setItemID(5, 1602L);
    anonymousPrefs.setItemID(6, 1713L);
    anonymousPrefs.setItemID(7, 1801L);
    anonymousPrefs.setItemID(8, 1901L);
    anonymousPrefs.setItemID(9, 2002L);
    anonymousPrefs.setItemID(10, 9101L);
    anonymousPrefs.setItemID(11, 9301L);

    synchronized(anonymousPrefs){
        plusAnonymousModel.setTempPrefs(anonymousPrefs);
        List<RecommendedItem> recommendations1 = recommender.recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 20);
        plusAnonymousModel.clearTempPrefs();

        System.out.println("Recm for anonymous:");

        for (RecommendedItem recommendation : recommendations1) {
            System.out.println(recommendation);
        }
        System.out.println("");
    }


    List<RecommendedItem> recommendations = recommender.recommend(
            Integer.parseInt(args[2]), 20);

    System.out.println("Recomedation for user_id="
            + Integer.parseInt(args[2]) + ":");

    for (RecommendedItem recommendation : recommendations) {
        System.out.println(recommendation);
    }
    System.out.println("");

このコードによって生成される出力は次のとおりです。 Neighborhood=100

匿名の場合:

user_id=1680604 の推奨事項: RecommendedItem[item:1701, value:24.363672] ... など。したがって、匿名ユーザー向けの推奨事項はありません。:(

推奨事項を取得するには、「本物」(私の場合はファイルベース) ではなく、永続的な DataModel モデルを使用して、類似性、近隣、およびレコメンダーを構築する必要がありますが、代わりに PlusAnonymousUserDataModel plusAnonymousModel を使用する必要があります!
したがって、Mahout に関する基本的なドキュメント ( https://builds.apache.org/job/Mahout-Quality/javadoc/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.html ) の記述は間違っています。ItemSimilarity similarity = new LogLikelihoodSimilarity(realModel); // not plusModel

以前、SO の他の人が同じ問題を抱えていて、ここで何の回答も得られませんでし た。Sean Owen さん、関心をお寄せいただきありがとうございます。私が見つけた解決策が正しいことを承認していただけますか?

4

0 に答える 0