亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

mahout in action推薦系統代碼解釋

2019-11-10 23:37:53
字體:
來源:轉載
供稿:網友

這里的代碼屬于mahout in action中的內容,只是我不了解其中的注解,所以就特意想學習一下相關的內容。

package mia.recommender.ch02;//=分析導入包可以看出mahout的包分為主要類以及它們的實現類=import org.apache.mahout.cf.taste.impl.model.file.*;import org.apache.mahout.cf.taste.impl.neighborhood.*;import org.apache.mahout.cf.taste.impl.recommender.*;import org.apache.mahout.cf.taste.impl.similarity.*;import org.apache.mahout.cf.taste.model.*;import org.apache.mahout.cf.taste.neighborhood.*;import org.apache.mahout.cf.taste.recommender.*;import org.apache.mahout.cf.taste.similarity.*;import java.io.*;import java.util.*;class RecommenderIntro {  public static void main(String[] args) throws Exception { //=如何從csv的文件中構建mahout的數據表示,DataModel就是來表示<user,item,rating>的知識的=    DataModel model = new FileDataModel(new File("intro.csv"));//=user-based的第一步就是找相似用戶,所以要定義用戶的相似性,包括用什么相似性度量,以及鄰居的參數=    UserSimilarity similarity = new PearsonCorrelationSimilarity(model);    UserNeighborhood neighborhood =  new NearestNUserNeighborhood(2, similarity, model);//=一旦確定了相鄰用戶,那么一個普通的user-based推薦器就可以被構建起來了=    Recommender recommender = new GenericUserBasedRecommender(        model, neighborhood, similarity);//=我們可以來使用它,這里是向用戶1推薦1個商品=    List<RecommendedItem> recommendations =        recommender.recommend(1, 1);//=推薦的結果可以輸出,這里是:RecommendedItem[item:104, value:4.257081]=    for (RecommendedItem recommendation : recommendations) {      System.out.PRintln(recommendation);    }  }}復制代碼復制代碼二, Evaluation復制代碼復制代碼package mia.recommender.ch02;import org.apache.mahout.cf.taste.impl.model.file.*;import org.apache.mahout.cf.taste.impl.neighborhood.*;import org.apache.mahout.cf.taste.impl.recommender.*;import org.apache.mahout.cf.taste.impl.similarity.*;import org.apache.mahout.cf.taste.model.*;import org.apache.mahout.cf.taste.neighborhood.*;import org.apache.mahout.cf.taste.recommender.*;import org.apache.mahout.cf.taste.similarity.*;import java.io.*;import java.util.*;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.eval.RecommenderBuilder;import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;import org.apache.mahout.common.RandomUtils;/** * * @author wentingtu <wentingtu09 at Gmail dot com> */public class RecommenderEvalu{    public static void main(String[] args) throws IOException, TasteException    {        //=導入org.apache.mahout.common.RandomUtils;=        //這個是產生唯一的種子使得在劃分訓練和測試數據的時候具有唯一性=         RandomUtils.useTestSeed();               DataModel model = new FileDataModel(new File("intro.csv"));        //構建評估器,這里用到的性能度量是每個sum( |預測值 - 真實值| ) / 值的個數        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();        //=導入 org.apache.mahout.cf.taste.eval.RecommenderBuilder;=        //這里要涉及用到了一個定義推薦器構造方法的類:RecommenderBuilder        RecommenderBuilder builder = new RecommenderBuilder()        {        //使用方法是重載buildRecommender函數,函數里是構造推薦器的方法            @Override            public Recommender buildRecommender(DataModel model)                    throws TasteException            {                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);                UserNeighborhood neighborhood =                        new NearestNUserNeighborhood(2, similarity, model);                return new GenericUserBasedRecommender(model, neighborhood, similarity);            }        };    //=導入 org.apache.mahout.cf.taste.eval.RecommenderEvaluator;=   //調用評估器,輸入有上面構造的推薦器方法,數據模型,訓練/全部 比例,驗證數據/數據 比例       double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);   //輸出評價結果:1.0 證明最后的估計結果是  AverageAbsoluteDifference = 1.0     System.out.println(score);    }}復制代碼復制代碼復制代碼復制代碼package mia.recommender.ch02;import org.apache.mahout.cf.taste.impl.model.file.*;import org.apache.mahout.cf.taste.impl.neighborhood.*;import org.apache.mahout.cf.taste.impl.recommender.*;import org.apache.mahout.cf.taste.impl.similarity.*;import org.apache.mahout.cf.taste.model.*;import org.apache.mahout.cf.taste.neighborhood.*;import org.apache.mahout.cf.taste.recommender.*;import org.apache.mahout.cf.taste.similarity.*;import java.io.*;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.eval.IRStatistics;import org.apache.mahout.cf.taste.eval.RecommenderBuilder;import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;import org.apache.mahout.common.RandomUtils;/** * * @author Administrator */public class RecommenderEvaluPrecisionRecall {    public static void main(String[] args) throws IOException, TasteException {        RandomUtils.useTestSeed();        DataModel model = new FileDataModel(new File("intro.csv"));        //=導入org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;=        //構建評估器        RecommenderIRStatsEvaluator evaluator =                new GenericRecommenderIRStatsEvaluator();                RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {            @Override            public Recommender buildRecommender(DataModel model)                    throws TasteException {                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);                UserNeighborhood neighborhood =                        new NearestNUserNeighborhood(2, similarity, model);                return new GenericUserBasedRecommender(model, neighborhood, similarity);            }        };        //使用評估器,并設定評估期的參數        //2表示"precision and recall at 2"即相當于推薦top2,然后在top-2的推薦上計算準確率和召回率        //既然涉及到準確率和召回率,這里就有一個"hit"的定義,就是怎樣的一個推薦算是good        //下面的參數設置是這樣定義"good"的:利用閾值threshold = μ + σ         //即 user's average preference value μ plus one standard deviation σ        //如果一個推薦,它的真實分值是高于threshold的,那么它就是"good"        IRStatistics stats = evaluator.evaluate(                recommenderBuilder, null, model, null, 2,                GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,                1.0);        //輸出為0.75 1.0        System.out.println(stats.getPrecision());        System.out.println(stats.getRecall());    }}復制代碼復制代碼三,Set preference復制代碼復制代碼package mia.recommender.ch03;import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;import org.apache.mahout.cf.taste.model.Preference;import org.apache.mahout.cf.taste.model.PreferenceArray;/** * * @author Administrator */public class SetPrefinPreferenceArray {    /**     * @param args the command line arguments     */    public static void main(String[] args) {        PreferenceArray user1Prefs = new GenericUserPreferenceArray(2);        user1Prefs.setUserID(0, 1L);        user1Prefs.setItemID(0, 101L);        user1Prefs.setValue(0, 2.0f);        user1Prefs.setItemID(1, 102L);        user1Prefs.setValue(1, 3.0f);        Preference pref = user1Prefs.get(1);    }}復制代碼復制代碼四,User-based CF復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.eval.RecommenderBuilder;import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity;import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;import org.apache.mahout.cf.taste.recommender.Recommender;import org.apache.mahout.cf.taste.similarity.UserSimilarity;import org.apache.mahout.common.RandomUtils;/** * * @author Administrator */public class UserBasedCF {    public static void recommenderModelEvaluation(DataModel model) throws TasteException {        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();        RandomUtils.useTestSeed();        RecommenderBuilder builder = new RecommenderBuilder() {            //=============實驗參數設置===============            //1.K近鄰 or 閾值近鄰            //近鄰:K?            //閾值近鄰:threshold?            //2.相似度量:Euclidean , Pearson , Log-likelihood , Tanimoto             char similarityPattern = 'E';//'E' or 'P' or 'L' or 'T'            char neighborhoodPattern = 'K';//'K' or 'T'            int k = 2;            double threshold = 0.5;            @Override            public Recommender buildRecommender(DataModel dm) throws TasteException {                UserSimilarity similarity = null;                UserNeighborhood neighborhood = null;                switch (similarityPattern) {                    case 'E': {                        similarity = new EuclideanDistanceSimilarity(dm);                    }                    case 'P': {                        similarity = new PearsonCorrelationSimilarity(dm);                    }                    case 'L': {                        similarity = new LogLikelihoodSimilarity(dm);                    }                    case 'T': {                        similarity = new TanimotoCoefficientSimilarity(dm);                    }                }                switch (neighborhoodPattern) {                    case 'K': {                        neighborhood = new NearestNUserNeighborhood(k, similarity, dm);                    }                    case 'T': {                        neighborhood = new ThresholdUserNeighborhood(threshold, similarity, dm);                    }                }                return new GenericUserBasedRecommender(dm, neighborhood, similarity);            }        };        double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);        System.out.println(score);    }    /**     * @param args the command line arguments     */    public static void main(String[] args) throws IOException, TasteException {        DataModel model = new FileDataModel(new File("data/dating/ratings.dat"));        recommenderModelEvaluation(model);    }}復制代碼復制代碼五,Item-based CF復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.eval.RecommenderBuilder;import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity;import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.recommender.Recommender;import org.apache.mahout.cf.taste.similarity.ItemSimilarity;import org.apache.mahout.common.RandomUtils;/** * * @author Administrator */public class ItemBasedCF {   public static void recommenderModelEvaluation(DataModel model) throws TasteException {        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();        RandomUtils.useTestSeed();        RecommenderBuilder builder = new RecommenderBuilder() {            //=============實驗參數設置===============            //1.K近鄰 or 閾值近鄰            //近鄰:K?            //閾值近鄰:threshold?            //2.相似度量:Euclidean , Pearson , Log-likelihood , Tanimoto             char similarityPattern = 'E';//'E' or 'P' or 'L' or 'T'            @Override            public Recommender buildRecommender(DataModel dm) throws TasteException {                ItemSimilarity similarity = null;                switch (similarityPattern) {                    case 'E': {                        similarity = new EuclideanDistanceSimilarity(dm);                    }                    case 'P': {                        similarity = new PearsonCorrelationSimilarity(dm);                    }                    case 'L': {                        similarity = new LogLikelihoodSimilarity(dm);                    }                    case 'T': {                        similarity = new TanimotoCoefficientSimilarity(dm);                    }                }                return new GenericItemBasedRecommender(dm, similarity);            }        };        double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);        System.out.println(score);    }    /**     * @param args the command line arguments     */    public static void main(String[] args) throws IOException, TasteException {        DataModel model = new FileDataModel(new File("data/dating/ratings.dat"));        recommenderModelEvaluation(model);    }}復制代碼復制代碼六,Slope one CF復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.common.Weighting;import org.apache.mahout.cf.taste.eval.RecommenderBuilder;import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.impl.recommender.slopeone.MemoryDiffStorage;import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.recommender.Recommender;import org.apache.mahout.cf.taste.recommender.slopeone.DiffStorage;import org.apache.mahout.common.RandomUtils;/** * * @author Administrator */public class SlopeOneCF {    public static void recommenderModelEvaluation(DataModel model) throws TasteException {        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();        RandomUtils.useTestSeed();        RecommenderBuilder builder = new RecommenderBuilder() {            long diffStorageNb = 100000;            @Override            public Recommender buildRecommender(DataModel dm) throws TasteException {                DiffStorage diffStorage = new MemoryDiffStorage(dm, Weighting.WEIGHTED, diffStorageNb);                return new SlopeOneRecommender(dm, Weighting.WEIGHTED, Weighting.WEIGHTED, diffStorage);            }        };    }    /**     * @param args the command line arguments     */    public static void main(String[] args) throws IOException, TasteException {        DataModel model = new FileDataModel(new File("data/dating/ratings.dat"));        recommenderModelEvaluation(model);    }}復制代碼復制代碼七,一個示例復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import java.util.List;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;import org.apache.mahout.cf.taste.impl.model.PlusAnonymousUserDataModel;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.model.PreferenceArray;import org.apache.mahout.cf.taste.recommender.RecommendedItem;/** * * @author Administrator */public class LibimsetiWithAnonymousRecommender extends LibimsetiRecommender {    private final PlusAnonymousUserDataModel plusAnonymousModel;    public LibimsetiWithAnonymousRecommender()            throws TasteException, IOException {        this((DataModel) new FileDataModel(new File("data/dating/ratings.dat")));    }    public LibimsetiWithAnonymousRecommender(DataModel model)            throws TasteException, IOException {        //調用父類LibimsetiRecommender的構造函數        super(new PlusAnonymousUserDataModel(model));        //得到PlusAnonymousUserDataModel對象        plusAnonymousModel =                (PlusAnonymousUserDataModel) getDataModel();    }    //設計這個推薦器的recommend方法:輸入:匿名用戶的評分信息 輸出:對此匿名用戶的推薦    public synchronized List<RecommendedItem> recommend(            PreferenceArray anonymousUserPrefs, int topN)            throws TasteException {        //利用PlusAnonymousUserDataModel對象的setTempPrefs方法為將匿名用戶加入到數據中,        //并且利用PlusAnonymousUserDataModel.TEMP_USER_ID作為其userID        plusAnonymousModel.setTempPrefs(anonymousUserPrefs);        //調用父類LibimsetiRecommender的recommend方法        //userID現在被PlusAnonymousUserDataModel.TEMP_USER_ID所代替了        List<RecommendedItem> recommendations =                recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, topN, null);        //刪除PlusAnonymousUserDataModel.TEMP_USER_ID與匿名用戶的關聯        plusAnonymousModel.clearTempPrefs();        return recommendations;    }    //創建當前匿名用戶的偽數據    public PreferenceArray creatAnAnonymousPrefs() {        PreferenceArray anonymousPrefs =                new GenericUserPreferenceArray(3);        anonymousPrefs.setUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);        anonymousPrefs.setItemID(0, 123L);        anonymousPrefs.setValue(0, 1.0f);        anonymousPrefs.setItemID(1, 123L);        anonymousPrefs.setValue(1, 3.0f);        anonymousPrefs.setItemID(2, 123L);        anonymousPrefs.setValue(2, 2.0f);        return anonymousPrefs;    }    public static void main(String[] args) throws Exception {        LibimsetiWithAnonymousRecommender recommender =                new LibimsetiWithAnonymousRecommender();        List<RecommendedItem> recommendations =                recommender.recommend(recommender.creatAnAnonymousPrefs(), 10);        System.out.println(recommendations);    }}復制代碼復制代碼復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import java.util.Collection;import java.util.List;import org.apache.mahout.cf.taste.common.Refreshable;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.impl.common.FastIDSet;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;import org.apache.mahout.cf.taste.recommender.IDRescorer;import org.apache.mahout.cf.taste.recommender.RecommendedItem;import org.apache.mahout.cf.taste.recommender.Recommender;import org.apache.mahout.cf.taste.similarity.UserSimilarity;/** * * @author Administrator */public class LibimsetiRecommender implements Recommender {    private final Recommender libimsetiRecommender;    private final DataModel model;    private final FastIDSet men;    private final FastIDSet women;    //構造函數:一般而言,一個普適的自定義推薦器的輸入應該是:DataModel和額外的知識    //應該將獨立于數據的東西構建好:基本的pure CF推薦器    public LibimsetiRecommender() throws TasteException, IOException {        this((DataModel) new FileDataModel(new File("data/dating/ratings.dat")));    }   //應該將獨立于數據的東西構建好:基本的pure CF推薦器,即將libimsetiRecommender設為pure CF    public LibimsetiRecommender(DataModel model) throws TasteException, IOException {        UserSimilarity similarity = new EuclideanDistanceSimilarity(model);        UserNeighborhood neighborhood =                new NearestNUserNeighborhood(2, similarity, model);        libimsetiRecommender = new GenericUserBasedRecommender(model, neighborhood, similarity);        this.model = model;        FastIDSet[] menWomen = GenderRescorer.generateMenWomen(                new File(("gender.dat")));        men = menWomen[0];        women = menWomen[1];    }   //用libimsetiRecommender進行推薦時就加入了由gender信息定義的GenderRescorer    public List<RecommendedItem> recommend(long userID, int topN) throws TasteException {        IDRescorer rescorer = new GenderRescorer(men, women, userID, model);        return libimsetiRecommender.recommend(userID, topN, rescorer);             }   //用libimsetiRecommender也提供了自定義IDRescorer進行推薦的方法    public List<RecommendedItem> recommend(long userID, int topN, IDRescorer idr) throws TasteException {       return libimsetiRecommender.recommend(userID, topN, idr);     }   //這里要注意,由于libimsetiRecommender真正進行preference的估計是要受到GenderRescorer的rescore的影響的    public float estimatePreference(long userID, long itemID) throws TasteException {         IDRescorer rescorer = new GenderRescorer(men, women, userID, model);     return (float) rescorer.rescore(         itemID, libimsetiRecommender.estimatePreference(userID, itemID));    }   //這個可以直接借助于libimsetiRecommender的setPreference    public void setPreference(long userID, long itemID, float value) throws TasteException {        libimsetiRecommender.setPreference(userID, itemID, value);    }   //這個可以直接借助于libimsetiRecommender的removePreference    public void removePreference(long userID, long itemID) throws TasteException {        libimsetiRecommender.removePreference(userID, itemID);    }   //這個可以直接借助于libimsetiRecommender的getDataModel    public DataModel getDataModel() {        return libimsetiRecommender.getDataModel();     }   //這個可以直接借助于libimsetiRecommender的refresh    public void refresh(Collection<Refreshable> alreadyRefreshed) {        libimsetiRecommender.refresh(alreadyRefreshed);    }}復制代碼復制代碼復制代碼復制代碼package mia.recommender.ch05;import java.io.File;import java.io.IOException;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.impl.common.FastIDSet;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.model.PreferenceArray;import org.apache.mahout.cf.taste.recommender.IDRescorer;import org.apache.mahout.common.iterator.FileLineIterable;/** * * @author Administrator */public class GenderRescorer implements IDRescorer {    private final FastIDSet men;//存放當前數據模型對應的所有male selectableUser    private final FastIDSet women;//存放當前數據模型對應的所有female selectableUser    private final FastIDSet usersRateMoreMen;//    private final FastIDSet usersRateLessMen;    private final boolean likeMen;//表明針對一個用戶(userID定義)一個profileID是否應該過濾    public GenderRescorer(            FastIDSet men,            FastIDSet women,            long userID, DataModel model)            throws TasteException {        this.men = men;        this.women = women;        this.usersRateMoreMen = new FastIDSet();        this.usersRateLessMen = new FastIDSet();        this.likeMen = ratesMoreMen(userID, model);    }    //產生數據對應的men和women集合    public static FastIDSet[] generateMenWomen(File genderFile)            throws IOException {        FastIDSet men = new FastIDSet(50000);        FastIDSet women = new FastIDSet(50000);        for (String line : new FileLineIterable(genderFile)) {            int comma = line.indexOf(',');            char gender = line.charAt(comma + 1);            if (gender == 'U') {                continue;            }            long profileID = Long.parseLong(line.substring(0, comma));            if (gender == 'M') {                men.add(profileID);            } else {                women.add(profileID);            }        }        men.rehash();        women.rehash();        return new FastIDSet[]{men, women};    }    //判斷userID對應的用戶是不是更喜歡男性,從他/她評過分的那些用戶的性別來統計    private boolean ratesMoreMen(long userID, DataModel model)            throws TasteException {        if (usersRateMoreMen.contains(userID)) {            return true;        }        if (usersRateLessMen.contains(userID)) {            return false;        }        PreferenceArray prefs = model.getPreferencesFromUser(userID);        int menCount = 0;        int womenCount = 0;        for (int i = 0; i < prefs.length(); i++) {            long profileID = prefs.get(i).getItemID();            if (men.contains(profileID)) {                menCount++;            } else if (women.contains(profileID)) {                womenCount++;            }        }        boolean ratesMoreMen = menCount > womenCount;        if (ratesMoreMen) {            usersRateMoreMen.add(userID);        } else {            usersRateLessMen.add(userID);        }        return ratesMoreMen;    }   //對于需要過濾的推薦,設置其值為NaN,這是因為他們不是不能推薦的,而是最差的推薦    public double rescore(long profileID, double originalScore) {        return isFiltered(profileID) ? Double.NaN : originalScore;    }    //如果一個用戶是喜歡男性的,而推薦的又是女性,則這個推薦是應該過濾掉的,反之亦然    public boolean isFiltered(long profileID) {        return likeMen ? women.contains(profileID) : men.contains(profileID);    }}復制代碼復制代碼復制代碼復制代碼package mia.recommender.ch05;import java.util.Collection;import org.apache.mahout.cf.taste.common.Refreshable;import org.apache.mahout.cf.taste.common.TasteException;import org.apache.mahout.cf.taste.impl.common.FastIDSet;import org.apache.mahout.cf.taste.similarity.ItemSimilarity;/** * * @author Administrator */public class GenderItemSimilarity  implements ItemSimilarity  {  private final FastIDSet men;   private final FastIDSet women;    public GenderItemSimilarity(FastIDSet men, FastIDSet women) {     this.men = men;     this.women = women;   }      public double itemSimilarity(long profileID1, long profileID2) throws TasteException {    Boolean profile1IsMan = isMan(profileID1);     if (profile1IsMan == null) {       return 0.0;     }     Boolean profile2IsMan = isMan(profileID2);     if (profile2IsMan == null) {       return 0.0;     }     return profile1IsMan == profile2IsMan ? 1.0 : -1.0;     }        private Boolean isMan(long profileID) {     if (men.contains(profileID)) {       return Boolean.TRUE;     }     if (women.contains(profileID)) {       return Boolean.FALSE;     }     return null;   }     public double[] itemSimilarities(long itemID1, long[] itemID2s) throws TasteException{    double[] result = new double[itemID2s.length];     for (int i = 0; i < itemID2s.length; i++) {       result[i] = itemSimilarity(itemID1, itemID2s[i]);     }     return result;   }      public long[] allSimilarItemIDs(long l) throws TasteException {        throw new UnsupportedOperationException("Not supported yet.");    }    public void refresh(Collection<Refreshable> clctn) {        throw new UnsupportedOperationException("Not supported yet.");    }    }頂0


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲va欧美va国产综合久久| 久久夜色精品国产| 国产成人激情小视频| 久久亚洲成人精品| 亚洲成人久久电影| 精品亚洲男同gayvideo网站| 国产精品视频成人| 欧美精品精品精品精品免费| 欧美日韩国产成人| 欧美黄色片免费观看| 精品久久久免费| 亚洲欧美日韩国产中文| 亚洲欧美一区二区三区情侣bbw| 欧美有码在线观看视频| 亚洲国产日韩欧美综合久久| 欧美日韩激情视频| 欧美丰满少妇xxxxx| 亚洲欧美色图片| 国产精品久久色| 欧美性xxxxxxx| 国产精品人成电影在线观看| 日韩免费在线视频| 欧美电影在线观看高清| 日韩精品极品毛片系列视频| 2018国产精品视频| 欧美另类极品videosbestfree| 26uuu久久噜噜噜噜| 蜜臀久久99精品久久久久久宅男| 2019精品视频| 亚洲美女免费精品视频在线观看| 国产精品久久久久免费a∨大胸| 狠狠躁夜夜躁人人躁婷婷91| 欧美三级xxx| 国产婷婷成人久久av免费高清| 国产日韩av在线| 久久国产精品网站| 欧美性做爰毛片| 国产日韩在线视频| 欧美国产精品va在线观看| 欧美高清视频在线观看| 7777精品视频| 中国日韩欧美久久久久久久久| 亚洲欧美制服综合另类| 久久久久久久久综合| 亚洲大尺度美女在线| 国产精品久久久久久中文字| 欧美激情在线一区| 国产日韩欧美视频在线| 国产最新精品视频| 成人a免费视频| 色偷偷噜噜噜亚洲男人的天堂| 日韩电影网在线| 欧美成人精品不卡视频在线观看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲精品第一页| 久久久国产一区二区| 日韩中文在线中文网在线观看| 深夜福利国产精品| 日本精品视频在线观看| 久久免费高清视频| 亚洲成avwww人| 57pao成人永久免费视频| 18久久久久久| 欧美激情视频网址| 亚洲国产成人久久综合一区| 精品无人国产偷自产在线| 国产激情综合五月久久| 亚洲男人的天堂在线| 久久视频免费在线播放| 日韩av在线播放资源| 欧美精品18videos性欧美| 亚洲国产中文字幕在线观看| 在线视频欧美性高潮| 91精品国产色综合久久不卡98| 欧美亚洲日本网站| 91极品视频在线| 国产精品久久久久久久av大片| 欧美性猛交xxxx乱大交极品| 中文综合在线观看| 成人在线视频网| 久久夜色精品国产亚洲aⅴ| 欧美高清在线播放| 91国自产精品中文字幕亚洲| 亚洲第一网站免费视频| 欧美激情视频免费观看| 国产丝袜视频一区| 宅男66日本亚洲欧美视频| 欧美亚洲成人免费| 美女撒尿一区二区三区| 欧美资源在线观看| 亚洲视频自拍偷拍| 欧美午夜影院在线视频| 91最新在线免费观看| 久久久精品视频成人| 久久天天躁狠狠躁夜夜躁2014| 日韩精品视频在线| 亚洲色图欧美制服丝袜另类第一页| 欧美日韩国产页| 亚洲激情视频网站| 国产成人拍精品视频午夜网站| 色偷偷噜噜噜亚洲男人的天堂| 欧美成人免费一级人片100| 国产欧美在线看| www.久久色.com| 久久国产精品免费视频| 国产欧美日韩丝袜精品一区| 91福利视频在线观看| 亚洲国产精品美女| 欧美国产精品人人做人人爱| 亚洲精美色品网站| 国产精品人成电影在线观看| 久久夜精品香蕉| 国产视频丨精品|在线观看| 久久久亚洲国产天美传媒修理工| 亚洲欧美日韩国产精品| 久久精品国亚洲| 欧美午夜影院在线视频| 欧美激情免费在线| 成人欧美一区二区三区黑人| 欧美电影在线观看高清| 成人黄在线观看| 日韩av影视在线| 欧美视频在线观看免费网址| 欧美视频专区一二在线观看| 欧美日韩亚洲一区二区| 欧美一级黑人aaaaaaa做受| 一区二区三欧美| 欧美性生交xxxxxdddd| 美女啪啪无遮挡免费久久网站| 日韩在线视频国产| 在线观看免费高清视频97| 国产精品偷伦一区二区| 不卡中文字幕av| 久久久久久中文| 青青草国产精品一区二区| 亚洲成人动漫在线播放| 91在线视频成人| 91亚洲国产成人久久精品网站| 欧美激情视频在线观看| 欧美日本啪啪无遮挡网站| 国语自产精品视频在线看抢先版图片| 欧美午夜精品久久久久久浪潮| 亚洲日本欧美中文幕| 国产精品色悠悠| 欧洲一区二区视频| 中文字幕视频一区二区在线有码| 国产亚洲一区二区在线| 亚洲国产私拍精品国模在线观看| 在线电影中文日韩| 日韩在线观看你懂的| 亚洲人精品午夜在线观看| 神马国产精品影院av| 91免费电影网站| 精品美女国产在线| 91九色精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久网| 久久国产精品久久久久久久久久| 欧美www视频在线观看| 日韩有码在线视频| 97超级碰碰人国产在线观看| 国产午夜精品麻豆| 亚洲图片欧美日产| 日本欧美一二三区|