List of usage examples for org.apache.mahout.cf.taste.impl.common FastIDSet size
public int size()
From source file:com.buddycloud.channeldirectory.search.handler.common.mahout.ChannelRecommender.java
License:Apache License
/** * Recommends a list of jids of channels that are * similar to a given channel.//from ww w . j a va2 s . c om * * @param channelJid The channel jid * @param howMany The number of recommendations * @return A list of similar channels' jids * @throws TasteException * @throws SQLException */ public RecommendationResponse getSimilarChannels(String channelJid, int howMany) throws TasteException, SQLException { Long itemId = recommenderDataModel.toChannelId(channelJid); if (itemId == null) { return new RecommendationResponse(new LinkedList<ChannelData>(), 0); } TopItems.Estimator<Long> estimator = new MostSimilarEstimator(itemId, itemSimilarity, null); MostSimilarItemsCandidateItemsStrategy candidateStrategy = new PreferredItemsNeighborhoodCandidateItemsStrategy(); FastIDSet possibleItemIDs = candidateStrategy.getCandidateItems(new long[] { itemId }, recommenderDataModel.getDataModel()); List<RecommendedItem> recommended = TopItems.getTopItems(howMany, possibleItemIDs.iterator(), null, estimator); List<ChannelData> recommendedChannels = new LinkedList<ChannelData>(); for (RecommendedItem recommendedItem : recommended) { recommendedChannels.add(recommenderDataModel.toChannelData(recommendedItem.getItemID())); } return new RecommendationResponse(recommendedChannels, possibleItemIDs.size()); }
From source file:com.buddycloud.channeldirectory.search.handler.common.mahout.ChannelRecommender.java
License:Apache License
private int getPreferenceCount(long theUserId) throws TasteException { FastIDSet possibleItemIDs = new FastIDSet(); long[] theNeighborhood = userNeighborhood.getUserNeighborhood(theUserId); DataModel dataModel = recommenderDataModel.getDataModel(); for (long userID : theNeighborhood) { possibleItemIDs.addAll(dataModel.getItemIDsFromUser(userID)); }/*from w w w . ja va 2s . c o m*/ possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserId)); return possibleItemIDs.size(); }
From source file:com.msiiplab.recsys.implicit.TanimotoIDF2CoefficientSimilarity.java
License:Apache License
@Override public double userSimilarity(long userID1, long userID2) throws TasteException { DataModel dataModel = getDataModel(); FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1); FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2); int xPrefsSize = xPrefs.size(); int yPrefsSize = yPrefs.size(); if (xPrefsSize == 0 && yPrefsSize == 0) { return Double.NaN; }// www . ja v a2s . c om if (xPrefsSize == 0 || yPrefsSize == 0) { return 0.0; } double intersection = 0.0; double union = 0.0; for (LongPrimitiveIterator it_item = xPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = (double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID); if (yPrefs.contains(itemID)) { intersection += weight; union -= weight; } union += weight; } for (LongPrimitiveIterator it_item = yPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = (double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID); union += weight; } return Math.log(intersection) / Math.log(union); }
From source file:com.msiiplab.recsys.implicit.TanimotoIDF3CoefficientSimilarity.java
License:Apache License
@Override public double userSimilarity(long userID1, long userID2) throws TasteException { DataModel dataModel = getDataModel(); FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1); FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2); int xPrefsSize = xPrefs.size(); int yPrefsSize = yPrefs.size(); if (xPrefsSize == 0 && yPrefsSize == 0) { return Double.NaN; }//from www. j a v a 2 s . c om if (xPrefsSize == 0 || yPrefsSize == 0) { return 0.0; } double intersection = 0.0; double union = 0.0; for (LongPrimitiveIterator it_item = xPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = (double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID); if (yPrefs.contains(itemID)) { intersection += weight; union -= weight; } union += weight; } for (LongPrimitiveIterator it_item = yPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = (double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID); union += weight; } return intersection / union; }
From source file:com.msiiplab.recsys.implicit.TanimotoIDFCoefficientSimilarity.java
License:Apache License
@Override public double userSimilarity(long userID1, long userID2) throws TasteException { DataModel dataModel = getDataModel(); FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1); FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2); int xPrefsSize = xPrefs.size(); int yPrefsSize = yPrefs.size(); if (xPrefsSize == 0 && yPrefsSize == 0) { return Double.NaN; }/*from ww w.j a v a2s . co m*/ if (xPrefsSize == 0 || yPrefsSize == 0) { return 0.0; } double intersection = 0.0; double union = 0.0; for (LongPrimitiveIterator it_item = xPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = Math.log((double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID)); if (yPrefs.contains(itemID)) { intersection += weight; union -= weight; } union += weight; } for (LongPrimitiveIterator it_item = yPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = Math.log((double) getDataModel().getNumUsers() / mItemPrefNum.get(itemID)); union += weight; } return intersection / union; }
From source file:com.msiiplab.recsys.implicit.TanimotoLFMCoefficientSimilarity.java
License:Apache License
@Override public double userSimilarity(long userID1, long userID2) throws TasteException { DataModel dataModel = getDataModel(); FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1); FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2); int xPrefsSize = xPrefs.size(); int yPrefsSize = yPrefs.size(); if (xPrefsSize == 0 && yPrefsSize == 0) { return Double.NaN; }//from www . ja v a 2s . co m if (xPrefsSize == 0 || yPrefsSize == 0) { return 0.0; } double intersection = 0.0; double union = 0.0; for (LongPrimitiveIterator it_item = xPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = mItemPrefEntropy.get(itemID); if (yPrefs.contains(itemID)) { intersection += weight; union -= weight; } union += weight; } for (LongPrimitiveIterator it_item = yPrefs.iterator(); it_item.hasNext();) { long itemID = (long) it_item.nextLong(); double weight = mItemPrefEntropy.get(itemID); union += weight; } return intersection / union; }
From source file:com.msiiplab.recsys.rwr.GLRecommenderIRStatsEvaluator.java
License:Apache License
public GLIRStatisticsImpl evaluate(RecommenderBuilder recommenderBuilder, List<DataModel> trainingDataModels, List<DataModel> testingDataModels, IDRescorer rescorer, int at, double relevanceThreshold, double evaluationPercentage) throws TasteException { Preconditions.checkArgument(recommenderBuilder != null, "recommenderBuilder is null"); Preconditions.checkArgument(trainingDataModels != null, "trainingDataModels is null"); Preconditions.checkArgument(testingDataModels != null, "testingDataModels is null"); Preconditions.checkArgument(testingDataModels.size() == trainingDataModels.size(), "trainingDataModels.size must equals testingDataModels.size"); Preconditions.checkArgument(at >= 1, "at must be at least 1"); Preconditions.checkArgument(evaluationPercentage > 0.0 && evaluationPercentage <= 1.0, "Invalid evaluationPercentage: %s", evaluationPercentage); // num of train/test pair: num of cross validation folds int numFolds = trainingDataModels.size(); RunningAverage CrossValidationPrecision = new GLRunningAverage(); RunningAverage CrossValidationRPrecision = new GLRunningAverage(); RunningAverage CrossValidationRecall = new GLRunningAverage(); RunningAverage CrossValidationFallOut = new GLRunningAverage(); RunningAverage CrossValidationNDCG = new GLRunningAverage(); RunningAverage CrossValidationRNDCG = new GLRunningAverage();//rating-nDCG RunningAverage CrossValidationReach = new GLRunningAverage(); RunningAverage CrossValidationMacroDOA = new GLRunningAverage(); RunningAverage CrossValidationMicroDOA = new GLRunningAverage(); RunningAverage CrossValidationMacroInnerDOA = new GLRunningAverage(); RunningAverage CrossValidationMicroInnerDOA = new GLRunningAverage(); for (int i_folds = 0; i_folds < numFolds; i_folds++) { log.info("fold {}", i_folds); DataModel trainDataModel = trainingDataModels.get(i_folds); DataModel testDataModel = testingDataModels.get(i_folds); FastIDSet MovieIDs = new FastIDSet(); LongPrimitiveIterator it_train_temp = trainDataModel.getItemIDs(); LongPrimitiveIterator it_test_temp = testDataModel.getItemIDs(); while (it_train_temp.hasNext()) { MovieIDs.add(it_train_temp.nextLong()); }//from www . j av a2 s .co m while (it_test_temp.hasNext()) { MovieIDs.add(it_test_temp.nextLong()); } int numTrainItems = trainDataModel.getNumItems(); int numTestItems = testDataModel.getNumItems(); int numItems = numTestItems + numTrainItems; RunningAverage precision = new GLRunningAverage(); RunningAverage rPrecision = new GLRunningAverage(); RunningAverage recall = new GLRunningAverage(); RunningAverage fallOut = new GLRunningAverage(); RunningAverage nDCG = new GLRunningAverage(); RunningAverage rNDCG = new GLRunningAverage(); RunningAverage macroDOA = new GLRunningAverage(); RunningAverage microDOA1 = new GLRunningAverage(); RunningAverage microDOA2 = new GLRunningAverage(); RunningAverage macroInnerDOA = new GLRunningAverage(); RunningAverage microInnerDOA1 = new GLRunningAverage(); RunningAverage microInnerDOA2 = new GLRunningAverage(); int numUsersRecommendedFor = 0; int numUsersWithRecommendations = 0; long start = System.currentTimeMillis(); // Build recommender Recommender recommender = recommenderBuilder.buildRecommender(trainDataModel); LongPrimitiveIterator it_user = testDataModel.getUserIDs(); while (it_user.hasNext()) { long userID = it_user.nextLong(); log.info("user {}", userID); // Use all in testDataModel as relevant FastIDSet learnedItemIDs; FastIDSet relevantItemIDs; try { learnedItemIDs = trainDataModel.getItemIDsFromUser(userID); relevantItemIDs = testDataModel.getItemIDsFromUser(userID); } catch (NoSuchUserException e1) { continue; } // We excluded zero relevant items situation int numRelevantItems = relevantItemIDs.size(); if (numRelevantItems <= 0) { continue; } // We excluded all prefs for the user that has no pref record in // training set try { trainDataModel.getPreferencesFromUser(userID); } catch (NoSuchUserException nsee) { continue; // Oops we excluded all prefs for the user -- just // move on } // Recommend items List<RecommendedItem> recommendedItems = recommender.recommend(userID, at, rescorer); List<RecommendedItem> recommendedItemsAtRelNum = recommender.recommend(userID, numRelevantItems, rescorer); PreferenceArray userPreferences = testDataModel.getPreferencesFromUser(userID); FastByIDMap<Preference> userPreferenceMap = getPrefereceMap(userPreferences); userPreferences.sortByValueReversed(); // relevantItemIDsAtN only consider top N items as relevant items FastIDSet relevantItemIDsAtN = new FastIDSet(); Iterator<Preference> it_pref = userPreferences.iterator(); int num_pref = 0; while (it_pref.hasNext()) { relevantItemIDsAtN.add(it_pref.next().getItemID()); num_pref++; if (num_pref >= at) { break; } } // Compute intersection between recommended items and relevant // items int intersectionSize = 0; int numRecommendedItems = recommendedItems.size(); for (RecommendedItem recommendedItem : recommendedItems) { if (relevantItemIDs.contains(recommendedItem.getItemID())) { intersectionSize++; } } // Precision double prec = 0; if (numRecommendedItems > 0) { prec = (double) intersectionSize / (double) numRecommendedItems; } precision.addDatum(prec); log.info("Precision for user {} is {}", userID, prec); // Recall double rec = (double) intersectionSize / (double) numRelevantItems; recall.addDatum(rec); log.info("Recall for user {} is {}", userID, rec); // R-precision double rprec = 0; int intersectionSizeAtRelNum = 0; int numRecommendedItemsAtRelNum = recommendedItemsAtRelNum.size(); for (RecommendedItem recommendedItem : recommendedItemsAtRelNum) { if (relevantItemIDs.contains(recommendedItem.getItemID())) { intersectionSizeAtRelNum++; } } if (numRecommendedItemsAtRelNum > 0) { rprec = (double) intersectionSizeAtRelNum / (double) numRelevantItems; } rPrecision.addDatum(rprec); log.info("RPrecision for user {} is {}", userID, rprec); double F1 = 0; if (prec + rec > 0) { F1 = 2 * prec * rec / (prec + rec); } log.info("F1 for user {} is {}", userID, F1); // Fall-out double fall = 0; int size = numRelevantItems + trainDataModel.getItemIDsFromUser(userID).size(); if (numRelevantItems < size) { fall = (double) (numRecommendedItems - intersectionSize) / (double) (numItems - numRelevantItems); } fallOut.addDatum(fall); log.info("Fallout for user {} is {}", userID, fall); // nDCG // In computing, assume relevant IDs have relevance ${rating} and others // 0 PreferenceArray userPredictions = getPreferenceArray(recommendedItems, userID); double userNDCG = computeNDCG(userPreferences, userPredictions, relevantItemIDs, userPreferenceMap, at); double userRNDCG = computeRNDCG(userPreferences, userPredictions, relevantItemIDs, userPreferenceMap, at); nDCG.addDatum(userNDCG); rNDCG.addDatum(userRNDCG); log.info("NDCG for user {} is {}", userID, userNDCG); log.info("RNDCG for user {} is {}", userID, userRNDCG); // Reach numUsersRecommendedFor++; if (numRecommendedItems > 0) { numUsersWithRecommendations++; } // DOA // [Siegel and Castellan, 1988] and [Gori and Pucci, 2007] // LongPrimitiveIterator it_movies = MovieIDs.iterator(); LongPrimitiveIterator it_movies = trainDataModel.getItemIDs(); long numNW = 0; long sumCheckOrder = 0; while (it_movies.hasNext()) { long itemID = it_movies.nextLong(); if (!learnedItemIDs.contains(itemID) && !relevantItemIDs.contains(itemID)) { // itemID is in NW_{u_i} numNW++; LongPrimitiveIterator it_test = relevantItemIDs.iterator(); while (it_test.hasNext()) { long testItemID = it_test.nextLong(); float itemPref = 0; float testItemPref = 0; try { itemPref = recommender.estimatePreference(userID, itemID); } catch (NoSuchItemException e) { } try { testItemPref = recommender.estimatePreference(userID, testItemID); } catch (NoSuchItemException e) { } if (itemPref <= testItemPref) { sumCheckOrder++; } } } } if (numNW > 0 && relevantItemIDs.size() > 0) { macroDOA.addDatum((double) sumCheckOrder / (double) (relevantItemIDs.size() * numNW)); microDOA1.addDatum((double) sumCheckOrder); microDOA2.addDatum((double) (relevantItemIDs.size() * numNW)); } // log.info( // "sumCheckOrder / (numNW * numRelevant) = {} / ({} * {})", // sumCheckOrder, numNW, relevantItemIDs.size()); // InnerDOA: only check the agreement of order in test set LongPrimitiveIterator it_test1 = relevantItemIDs.iterator(); long sumCheckInnerOrder = 0; long sumAll = 0; while (it_test1.hasNext()) { long itemID1 = it_test1.nextLong(); LongPrimitiveIterator it_test2 = relevantItemIDs.iterator(); while (it_test2.hasNext()) { long itemID2 = it_test2.nextLong(); if (itemID1 != itemID2) { try { float pref_v1 = testDataModel.getPreferenceValue(userID, itemID1); float pref_v2 = testDataModel.getPreferenceValue(userID, itemID2); float predict_v1 = recommender.estimatePreference(userID, itemID1); float predict_v2 = recommender.estimatePreference(userID, itemID2); if ((pref_v1 >= pref_v2 && predict_v1 >= predict_v2) || (pref_v1 <= pref_v2 && predict_v1 <= predict_v2)) { sumCheckInnerOrder++; } sumAll++; } catch (NoSuchItemException e) { // do nothing, just ignore } } } } if (relevantItemIDs.size() > 1) { macroInnerDOA.addDatum((double) sumCheckInnerOrder / (double) sumAll); microInnerDOA1.addDatum((double) sumCheckInnerOrder); microInnerDOA2.addDatum((double) sumAll); } // log.info( // "sumCheckInnerOrder / (|T| * (|T|-1) ) = {} / ({} * {}) = ", // sumCheckInnerOrder, relevantItemIDs.size(), relevantItemIDs.size()-1); } long end = System.currentTimeMillis(); CrossValidationPrecision.addDatum(precision.getAverage()); CrossValidationRPrecision.addDatum(rPrecision.getAverage()); CrossValidationRecall.addDatum(recall.getAverage()); CrossValidationFallOut.addDatum(fallOut.getAverage()); CrossValidationNDCG.addDatum(nDCG.getAverage()); CrossValidationRNDCG.addDatum(rNDCG.getAverage()); CrossValidationReach.addDatum((double) numUsersWithRecommendations / (double) numUsersRecommendedFor); CrossValidationMacroDOA.addDatum(macroDOA.getAverage()); CrossValidationMicroDOA.addDatum(microDOA1.getAverage() / microDOA2.getAverage()); CrossValidationMacroInnerDOA.addDatum(macroInnerDOA.getAverage()); CrossValidationMicroInnerDOA.addDatum(microInnerDOA1.getAverage() / microInnerDOA2.getAverage()); log.info("Evaluated with training/testing set # {} in {}ms", i_folds, end - start); System.out.printf("Evaluated with training/testing set # %d in %d ms \n", i_folds, end - start); log.info( "Precision/R-Precision/recall/fall-out/nDCG/rNDCG/reach/macroDOA/microDOA/macroInnerDOA/microInnerDOA: {} / {} / {} / {} / {} / {} / {} / {} / {} / {} / {}", precision.getAverage(), rPrecision.getAverage(), recall.getAverage(), fallOut.getAverage(), nDCG.getAverage(), rNDCG.getAverage(), (double) numUsersWithRecommendations / (double) numUsersRecommendedFor, macroDOA.getAverage(), microDOA1.getAverage() / microDOA2.getAverage(), macroInnerDOA.getAverage(), microInnerDOA1.getAverage() / microInnerDOA2.getAverage()); System.out.printf( "Precision/R-Precision/recall/fall-out/nDCG/rNDCG/reach/macroDOA/microDOA/macroInnerDOA/microInnerDOA: %f / %f / %f / %f / %f / %f / %f / %f / %f / %f / %f \n", precision.getAverage(), rPrecision.getAverage(), recall.getAverage(), fallOut.getAverage(), nDCG.getAverage(), rNDCG.getAverage(), (double) numUsersWithRecommendations / (double) numUsersRecommendedFor, macroDOA.getAverage(), microDOA1.getAverage() / microDOA2.getAverage(), macroInnerDOA.getAverage(), microInnerDOA1.getAverage() / microInnerDOA2.getAverage()); } log.info( "Cross Validation Precision/R-Precision/recall/fall-out/nDCG/rNDCG/reach/macroDOA/microDOA: {} / {} / {} / {} / {} / {} / {} / {} / {} / {} / {}", CrossValidationPrecision.getAverage(), CrossValidationRPrecision.getAverage(), CrossValidationRecall.getAverage(), CrossValidationFallOut.getAverage(), CrossValidationNDCG.getAverage(), CrossValidationRNDCG.getAverage(), CrossValidationReach.getAverage(), CrossValidationMacroDOA.getAverage(), CrossValidationMicroDOA.getAverage(), CrossValidationMacroInnerDOA.getAverage(), CrossValidationMicroInnerDOA.getAverage()); System.out.printf( "Cross Validation: \nPrecision/R-Precision/recall/fall-out/nDCG/rNDCG/reach/macroDOA/microDOA: %f / %f / %f / %f / %f / %f / %f / %f / %f / %f / %f\n", CrossValidationPrecision.getAverage(), CrossValidationRPrecision.getAverage(), CrossValidationRecall.getAverage(), CrossValidationFallOut.getAverage(), CrossValidationNDCG.getAverage(), CrossValidationRNDCG.getAverage(), CrossValidationReach.getAverage(), CrossValidationMacroDOA.getAverage(), CrossValidationMicroDOA.getAverage(), CrossValidationMacroInnerDOA.getAverage(), CrossValidationMicroInnerDOA.getAverage()); return new GLIRStatisticsImpl(CrossValidationPrecision.getAverage(), CrossValidationRPrecision.getAverage(), CrossValidationRecall.getAverage(), CrossValidationFallOut.getAverage(), CrossValidationNDCG.getAverage(), CrossValidationRNDCG.getAverage(), CrossValidationReach.getAverage(), CrossValidationMacroDOA.getAverage(), CrossValidationMicroDOA.getAverage(), CrossValidationMacroInnerDOA.getAverage(), CrossValidationMicroInnerDOA.getAverage()); }
From source file:com.predictionmarketing.itemrecommend.CliMF.java
License:Apache License
private void splitReplyIDs(long userID, Usersitemidset idset) throws TasteException { FastIDSet itemids = dataModel.getItemIDsFromUser(userID); FastIDSet replyids = new FastIDSet(); FastIDSet noreplyids = new FastIDSet(); for (long item : itemids) { long writer = postwriter.get(item); if (dataModel.getPreferenceValue(userID, item) > 0) { if (testuser == userID && writer == coveruser) {//testusercoveruser information Total_Test_records++;//from w w w .j ava 2s . com } else { replyids.add(item); } } else { noreplyids.add(item); } } if (userID == testuser) { left_records += replyids.size(); } Total_records += replyids.size(); idset.setReplyidset(replyids.toArray()); idset.setNoreplyidset(noreplyids.toArray()); }
From source file:com.predictionmarketing.itemrecommend.RatingSGDFactorizer.java
License:Apache License
public Factorization weighted_factorize() throws TasteException { //aggregate aggregated writer feature produce a new user-write vectors replace itemVectors double[][] writerVectors = new double[WriterdataModel.getNumUsers()][numFeatures]; LongPrimitiveIterator it = WriterdataModel.getUserIDs(); while (it.hasNext()) { long userid = it.nextLong(); int userIndex = userIndex(userid); for (int i = 0; i < numFeatures; i++) { writerVectors[userIndex][i] = 0.0; }//from w ww . j a v a 2 s . c o m FastIDSet updateset = WriterdataModel.getItemIDsFromUser(userid); int post_count = updateset.size(); for (long item : updateset) { int itemIndex = itemIndex(item); if (itemIndex < dataModel.getNumItems()) { double[] weight_array = new double[numFeatures]; HashMap<Integer, Double> itemvaluemap = new HashMap<Integer, Double>(); for (int i = 0; i < numFeatures; i++) { //find max feature itemvaluemap.put(i, itemVectors[itemIndex][i]); weight_array[i] = 1; } if (post_count > 1) { SortedSet<Map.Entry<Integer, Double>> sorted_map = entriesSortedByValues(itemvaluemap); int i = 0; for (Map.Entry<Integer, Double> entry : sorted_map) { weight_array[entry.getKey()] += 1; i++; if (i > 0) { break; } } } for (int i = 0; i < numFeatures; i++) { //aggregate writerVectors[userIndex][i] = weight_array[i] * itemVectors[itemIndex][i]; } } } if (post_count > 0) { //unit vector writerVectors[userIndex] = unitvectorize(writerVectors[userIndex]); writerVectors[userIndex][USER_BIAS_INDEX] /= post_count; writerVectors[userIndex][ITEM_BIAS_INDEX] /= post_count; } } return createFactorization(userVectors, writerVectors); }
From source file:com.predictionmarketing.itemrecommend.SUSSGDFactorizer.java
License:Apache License
@Override public Factorization factorize() throws TasteException { prepareTraining();//from w w w.j a va2 s . c om double currentLearningRate = learningRate; HashSet<Long> DMusers = new HashSet<Long>(); LongPrimitiveIterator ud = dataModel.getUserIDs(); while (ud.hasNext()) { DMusers.add(ud.nextLong()); } for (int it = 0; it < numIterations; it++) { FastIDSet friends_idset = new FastIDSet(); double Suvpv_array[]; // System.out.println("imawa no."+it); for (long userID : DMusers) { //useriteration if (SocialIDset.contains(userID)) { friends_idset = SocialdataModel.getItemIDsFromUser(userID); } Suvpv_array = generateSuvpv(userID, friends_idset); double len = vectorlength(Suvpv_array); assert len < 1.01; assert len > 0.99; int friends_amount = (testuser == userID) ? friends_idset.size() - 1 : friends_idset.size(); //testuser friends?-1 () double mother = (double) friends_amount / 250 + 1; double alpha = (double) 1 - (1 / mother); // double alpha=0.1;//(double)1-(1/mother); // social degree // double alpha=0; assert alpha < 0.5; updateParameters(userID, currentLearningRate, Suvpv_array, alpha); friends_idset.clear(); } currentLearningRate *= learningRateDecay; } //end learning iteration //System.out.println("Total records"+Total_records/10); //aggregate writer feature produce a new user-write vectors replace itemVectors double[][] writerVectors = new double[WriterdataModel.getNumUsers()][numFeatures]; LongPrimitiveIterator it = WriterdataModel.getUserIDs(); while (it.hasNext()) { long userid = it.nextLong(); int userIndex = userIndex(userid); for (int i = 0; i < numFeatures; i++) { writerVectors[userIndex][i] = 0.0; } int post_count = 0; for (long item : WriterdataModel.getItemIDsFromUser(userid)) { int itemIndex = itemIndex(item); if (itemIndex < dataModel.getNumItems()) { post_count++; for (int i = 0; i < numFeatures; i++) { writerVectors[userIndex][i] += itemVectors[itemIndex][i]; } } } if (post_count > 0) { //unit vector writerVectors[userIndex] = unitvectorize(writerVectors[userIndex]); writerVectors[userIndex][USER_BIAS_INDEX] /= post_count; writerVectors[userIndex][ITEM_BIAS_INDEX] /= post_count; } } int n = (int) (Math.random() * dataModel.getNumUsers()); //System.out.println("writer"+n+" user bias:"+writerVectors[n][USER_BIAS_INDEX]); // System.out.println("writer"+n+"item bias:"+writerVectors[n][ITEM_BIAS_INDEX]); assert writerVectors[n][USER_BIAS_INDEX] > 0.99; assert writerVectors[n][USER_BIAS_INDEX] < 1.01; return createFactorization(userVectors, writerVectors);//(userVectors, itemVectors); }