Re: Why some userId has no recommendations?
hi, does anybody have suggestions for this question Thanks! Regards Jiang 2014-02-12 11:25 GMT+08:00 jiangwen jiang : > Hi, all: > > I try to user mahout api to make recommendations, but I find some userId > has no recommendations, why? > > here is my code > public static void main(String args[]) throws Exception { > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; > DataModel dataModel = new FileDataModel(new File(inFile)); > UserSimilarity userSimilarity = new > PearsonCorrelationSimilarity(dataModel); > UserNeighborhood userNeighborhood = new > NearestNUserNeighborhood(100, userSimilarity, dataModel); > Recommender recommender = new > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); > > for (int i = 1; i < 5; i++) { > List recommendations = > recommender.recommend(i, 1); > > System.out.println("recommend for user:" + i); > for (RecommendedItem recommendation : recommendations) { > System.out.println(recommendation); > } > } > } > > > input data(recsysinput.txt): > 1,101,5.0 > 1,102,3.0 > 1,103,2.5 > 2,101,2 > 2,102,2.5 > 2,103,5 > 2,104,2 > 3,101,2.5 > 3,104,4 > 3,105,4.5 > 3,107,5 > 4,101,5 > 4,103,3 > 4,104,4.5 > 4,106,4 > 5,101,4 > 5,102,3 > 5,103,2 > 5,104,4 > 5,105,3.5 > 5,106,4 > > output: > recommend for user:1 > RecommendedItem[item:104, value:5.0] > recommend for user:2 > RecommendedItem[item:106, value:4.0] > recommend for user:3 > RecommendedItem[item:106, value:4.0] > recommend for user:4 > RecommendedItem[item:105, value:5.0] > recommend for user:5 > > UserId 5 has no recommendations, is it right? > Can I get some recommendations for userId 5, even if the recommendation > results are not good enough? > > thanks > Regards! >
Re: Why some userId has no recommendations?
5 should get 107 as a recommendation, whether user-based or item-based. No clue why you're not getting it. On Wed, Feb 12, 2014 at 11:50 PM, jiangwen jiang wrote: > Hi, all: > > I try to user mahout api to make recommendations, but I find some userId > has no recommendations, why? > > here is my code > public static void main(String args[]) throws Exception { > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; > DataModel dataModel = new FileDataModel(new File(inFile)); > UserSimilarity userSimilarity = new > PearsonCorrelationSimilarity(dataModel); > UserNeighborhood userNeighborhood = new > NearestNUserNeighborhood(100, userSimilarity, dataModel); > Recommender recommender = new > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); > > for (int i = 1; i <= 5; i++) { > List recommendations = > recommender.recommend(i, 1); > > System.out.println("recommend for user:" + i); > for (RecommendedItem recommendation : recommendations) { > System.out.println(recommendation); > } > } > } > > > input data(recsysinput.txt): > 1,101,5.0 > 1,102,3.0 > 1,103,2.5 > 2,101,2 > 2,102,2.5 > 2,103,5 > 2,104,2 > 3,101,2.5 > 3,104,4 > 3,105,4.5 > 3,107,5 > 4,101,5 > 4,103,3 > 4,104,4.5 > 4,106,4 > 5,101,4 > 5,102,3 > 5,103,2 > 5,104,4 > 5,105,3.5 > 5,106,4 > > output: > recommend for user:1 > RecommendedItem[item:104, value:5.0] > recommend for user:2 > RecommendedItem[item:106, value:4.0] > recommend for user:3 > RecommendedItem[item:106, value:4.0] > recommend for user:4 > RecommendedItem[item:105, value:5.0] > recommend for user:5 > > UserId 5 has no recommendations, is it right? > Can I get some recommendations for userId 5, even if the recommendation > results are not good enough? > > thanks > Regards! >
Re: Why some userId has no recommendations?
user 5 has given rating for all 5 books, So there will be no recommendations for him. On 12 February 2014 08:55, jiangwen jiang wrote: > Hi, all: > > I try to user mahout api to make recommendations, but I find some userId > has no recommendations, why? > > here is my code > public static void main(String args[]) throws Exception { > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; > DataModel dataModel = new FileDataModel(new File(inFile)); > UserSimilarity userSimilarity = new > PearsonCorrelationSimilarity(dataModel); > UserNeighborhood userNeighborhood = new > NearestNUserNeighborhood(100, userSimilarity, dataModel); > Recommender recommender = new > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); > > for (int i = 1; i < 5; i++) { > List recommendations = > recommender.recommend(i, 1); > > System.out.println("recommend for user:" + i); > for (RecommendedItem recommendation : recommendations) { > System.out.println(recommendation); > } > } > } > > > input data(recsysinput.txt): > 1,101,5.0 > 1,102,3.0 > 1,103,2.5 > 2,101,2 > 2,102,2.5 > 2,103,5 > 2,104,2 > 3,101,2.5 > 3,104,4 > 3,105,4.5 > 3,107,5 > 4,101,5 > 4,103,3 > 4,104,4.5 > 4,106,4 > 5,101,4 > 5,102,3 > 5,103,2 > 5,104,4 > 5,105,3.5 > 5,106,4 > > output: > recommend for user:1 > RecommendedItem[item:104, value:5.0] > recommend for user:2 > RecommendedItem[item:106, value:4.0] > recommend for user:3 > RecommendedItem[item:106, value:4.0] > recommend for user:4 > RecommendedItem[item:105, value:5.0] > recommend for user:5 > > UserId 5 has no recommendations, is it right? > Can I get some recommendations for userId 5, even if the recommendation > results are not good enough? > > thanks > Regards! >
Re: Why some userId has no recommendations?
Hi Jiang, Mahout's userbased recommender make use of similarity of a user with other users to arrive at what to recommend to him & in this specific case,uses Pearson correlation coefficient calculated from the user ratings as a similarity measure to form a neighborhood.It then estimates ratings for unpicked items based on user similarity and ratings provided by neighbors. A short answer is that if a user gets any recommendations totally depend on the training data that you provide as input to the model.In this case,if you expect 107 as a recommendation for user 5,there arent enough ratings available for 107 in the user 5's neighborhood. If you modify your data as below,you will get recommendations for user 5. (just add a dummy rating 2,107,5) I have included some code snippet which demonstrate this idea of user similarity and neighborhood .Hope this helps. *Code:* public class Test { public static void main(String args[]) throws Exception { String inFile = "F:\\hadoop\\data\\recsysinput.txt"; DataModel dataModel = new FileDataModel(new File(inFile)); UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel); UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(100, userSimilarity, dataModel); Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); for (int i = 1; i <= 5; i++) { List recommendations = recommender.recommend(i, 1); for(int j=1;j<=5 ;j++){ System.out.println("Similarity between user:"+i+" and user:"+j+ "= "+userSimilarity.userSimilarity(i, j)); } System.out.println("recommend for user:" + i +" Neighborhood Size:" + userNeighborhood.getUserNeighborhood(i).length); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); } } } } *Input:* 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2 2,102,2.5 2,103,5 2,104,2 2,107,5 3,101,2.5 3,104,4 3,105,4.5 3,107,5 4,101,5 4,103,3 4,104,4.5 4,106,4 5,101,4 5,102,3 5,103,2 5,104,4 5,105,3.5 5,106,4 *Output:* SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/mahout-examples-0.7-job.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/lib/slf4j-jcl-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. log4j:WARN No appenders could be found for logger (org.apache.mahout.cf.taste.impl.model.file.FileDataModel). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Similarity between user:1 and user:1= 1.0 Similarity between user:1 and user:2= -0.7642652566278799 Similarity between user:1 and user:3= NaN Similarity between user:1 and user:4= 0.9998 Similarity between user:1 and user:5= 0.944911182523068 recommend for user:1 Neighborhood Size:3 RecommendedItem[item:104, value:5.0] Similarity between user:2 and user:1= -0.7642652566278799 Similarity between user:2 and user:2= 0.9998 Similarity between user:2 and user:3= 0.8029550685469666 Similarity between user:2 and user:4= -0.9707253433941515 Similarity between user:2 and user:5= -0.9393939393939394 recommend for user:2 Neighborhood Size:4 RecommendedItem[item:106, value:4.0] Similarity between user:3 and user:1= NaN Similarity between user:3 and user:2= 0.8029550685469666 Similarity between user:3 and user:3= 1.0 Similarity between user:3 and user:4= -1.0 Similarity between user:3 and user:5= -0.6933752452815484 recommend for user:3 Neighborhood Size:3 RecommendedItem[item:106, value:4.0] Similarity between user:4 and user:1= 0.9998 Similarity between user:4 and user:2= -0.9707253433941515 Similarity between user:4 and user:3= -1.0 Similarity between user:4 and user:4= 1.0 Similarity between user:4 and user:5= 0.8783100656536799 recommend for user:4 Neighborhood Size:4 RecommendedItem[item:107, value:5.0] Similarity between user:5 and user:1= 0.944911182523068 Similarity between user:5 and user:2= -0.9393939393939394 Similarity between user:5 and user:3= -0.6933752452815366 Similarity between user:5 and user:4= 0.8783100656536799 Similarity between user:5 and user:5= 1.0 recommend for user:5 Neighborhood Size:4 RecommendedItem[item:107, value:5.0] On Thu, Feb 13, 2014 at 10:57 AM, Koobas wrote: > 5 should get 107 as
Re: Why some userId has no recommendations?
In some cases users might not get any recommendations. There might be different reasons of this. In your case there is only item 107 which can be recommended to user 5 (since user 5 rated all other items). Item 107 got two ratings which are both 5. In this case pearson correlation between this item and others are undefined. I think this is the reason why user 5 is not getting any recommendations. Tevfik On Thu, Feb 13, 2014 at 9:08 AM, jobin wilson wrote: > Hi Jiang, > > Mahout's userbased recommender make use of similarity of a user with other > users to arrive at what to recommend to him & in this specific case,uses > Pearson correlation coefficient calculated from the user ratings as a > similarity measure to form a neighborhood.It then estimates ratings for > unpicked items based on user similarity and ratings provided by neighbors. > > A short answer is that if a user gets any recommendations totally depend on > the training data that you provide as input to the model.In this case,if > you expect 107 as a recommendation for user 5,there arent enough ratings > available for 107 in the user 5's neighborhood. If you modify your data as > below,you will get recommendations for user 5. (just add a dummy rating > 2,107,5) > > I have included some code snippet which demonstrate this idea of user > similarity and neighborhood .Hope this helps. > > *Code:* > public class Test { > > public static void main(String args[]) throws Exception { > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; > DataModel dataModel = new FileDataModel(new File(inFile)); > UserSimilarity userSimilarity = new > PearsonCorrelationSimilarity(dataModel); > UserNeighborhood userNeighborhood = new > NearestNUserNeighborhood(100, userSimilarity, dataModel); > Recommender recommender = new > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); > > for (int i = 1; i <= 5; i++) { > List recommendations = > recommender.recommend(i, 1); > for(int j=1;j<=5 ;j++){ > System.out.println("Similarity between user:"+i+" and > user:"+j+ "= "+userSimilarity.userSimilarity(i, j)); > } > System.out.println("recommend for user:" + i +" Neighborhood > Size:" + userNeighborhood.getUserNeighborhood(i).length); > > for (RecommendedItem recommendation : recommendations) { > System.out.println(recommendation); > } > } > } > } > > *Input:* > 1,101,5.0 > 1,102,3.0 > 1,103,2.5 > 2,101,2 > 2,102,2.5 > 2,103,5 > 2,104,2 > 2,107,5 > 3,101,2.5 > 3,104,4 > 3,105,4.5 > 3,107,5 > 4,101,5 > 4,103,3 > 4,104,4.5 > 4,106,4 > 5,101,4 > 5,102,3 > 5,103,2 > 5,104,4 > 5,105,3.5 > 5,106,4 > > *Output:* > SLF4J: Class path contains multiple SLF4J bindings. > SLF4J: Found binding in > [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/mahout-examples-0.7-job.jar!/org/slf4j/impl/StaticLoggerBinder.class] > SLF4J: Found binding in > [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/lib/slf4j-jcl-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] > SLF4J: Found binding in > [jar:file:/D:/from%20D/MSR/Coursework/SEM2/Pattern%20Recognition/project/acadnet/mahout-distribution-0.7/mahout-distribution-0.7/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] > SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an > explanation. > log4j:WARN No appenders could be found for logger > (org.apache.mahout.cf.taste.impl.model.file.FileDataModel). > log4j:WARN Please initialize the log4j system properly. > log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for > more info. > Similarity between user:1 and user:1= 1.0 > Similarity between user:1 and user:2= -0.7642652566278799 > Similarity between user:1 and user:3= NaN > Similarity between user:1 and user:4= 0.9998 > Similarity between user:1 and user:5= 0.944911182523068 > recommend for user:1 Neighborhood Size:3 > RecommendedItem[item:104, value:5.0] > Similarity between user:2 and user:1= -0.7642652566278799 > Similarity between user:2 and user:2= 0.9998 > Similarity between user:2 and user:3= 0.8029550685469666 > Similarity between user:2 and user:4= -0.9707253433941515 > Similarity between user:2 and user:5= -0.9393939393939394 > recommend for user:2 Neighborhood Size:4 > RecommendedItem[item:106, value:4.0] > Similarity between user:3 and user:1= NaN > Similarity between user:3 and user:2= 0.8029550685469666 > Similarity between user:3 and user:3= 1.0 > Similarity between user:3 and user:4= -1.0 > Similarity between user:3 and user:5= -0.6933752452815484 > recommend for user:3 Neighborhood Size:3 > RecommendedItem[item:106, value:4.0] > Similarity between user:4 and user:1= 0.9998 > Similarity between user:4 a
Re: Why some userId has no recommendations?
User 3 gave a recommendation to item 107. User 5 did not rate 107. On Thu, Feb 13, 2014 at 1:57 AM, Suresh M wrote: > user 5 has given rating for all 5 books, > So there will be no recommendations for him. > > > > On 12 February 2014 08:55, jiangwen jiang wrote: > > > Hi, all: > > > > I try to user mahout api to make recommendations, but I find some userId > > has no recommendations, why? > > > > here is my code > > public static void main(String args[]) throws Exception { > > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; > > DataModel dataModel = new FileDataModel(new File(inFile)); > > UserSimilarity userSimilarity = new > > PearsonCorrelationSimilarity(dataModel); > > UserNeighborhood userNeighborhood = new > > NearestNUserNeighborhood(100, userSimilarity, dataModel); > > Recommender recommender = new > > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); > > > > for (int i = 1; i < 5; i++) { > > List recommendations = > > recommender.recommend(i, 1); > > > > System.out.println("recommend for user:" + i); > > for (RecommendedItem recommendation : recommendations) { > > System.out.println(recommendation); > > } > > } > > } > > > > > > input data(recsysinput.txt): > > 1,101,5.0 > > 1,102,3.0 > > 1,103,2.5 > > 2,101,2 > > 2,102,2.5 > > 2,103,5 > > 2,104,2 > > 3,101,2.5 > > 3,104,4 > > 3,105,4.5 > > 3,107,5 > > 4,101,5 > > 4,103,3 > > 4,104,4.5 > > 4,106,4 > > 5,101,4 > > 5,102,3 > > 5,103,2 > > 5,104,4 > > 5,105,3.5 > > 5,106,4 > > > > output: > > recommend for user:1 > > RecommendedItem[item:104, value:5.0] > > recommend for user:2 > > RecommendedItem[item:106, value:4.0] > > recommend for user:3 > > RecommendedItem[item:106, value:4.0] > > recommend for user:4 > > RecommendedItem[item:105, value:5.0] > > recommend for user:5 > > > > UserId 5 has no recommendations, is it right? > > Can I get some recommendations for userId 5, even if the recommendation > > results are not good enough? > > > > thanks > > Regards! > > >
Re: Why some userId has no recommendations?
I guess you would get a 107 as a recommendation for 5 if you switched to user-based? On Thu, Feb 13, 2014 at 8:21 AM, Koobas wrote: > User 3 gave a recommendation to item 107. > User 5 did not rate 107. > > > On Thu, Feb 13, 2014 at 1:57 AM, Suresh M wrote: > >> user 5 has given rating for all 5 books, >> So there will be no recommendations for him. >> >> >> >> On 12 February 2014 08:55, jiangwen jiang wrote: >> >> > Hi, all: >> > >> > I try to user mahout api to make recommendations, but I find some userId >> > has no recommendations, why? >> > >> > here is my code >> > public static void main(String args[]) throws Exception { >> > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; >> > DataModel dataModel = new FileDataModel(new File(inFile)); >> > UserSimilarity userSimilarity = new >> > PearsonCorrelationSimilarity(dataModel); >> > UserNeighborhood userNeighborhood = new >> > NearestNUserNeighborhood(100, userSimilarity, dataModel); >> > Recommender recommender = new >> > GenericUserBasedRecommender(dataModel, userNeighborhood, >> userSimilarity); >> > >> > for (int i = 1; i < 5; i++) { >> > List recommendations = >> > recommender.recommend(i, 1); >> > >> > System.out.println("recommend for user:" + i); >> > for (RecommendedItem recommendation : recommendations) { >> > System.out.println(recommendation); >> > } >> > } >> > } >> > >> > >> > input data(recsysinput.txt): >> > 1,101,5.0 >> > 1,102,3.0 >> > 1,103,2.5 >> > 2,101,2 >> > 2,102,2.5 >> > 2,103,5 >> > 2,104,2 >> > 3,101,2.5 >> > 3,104,4 >> > 3,105,4.5 >> > 3,107,5 >> > 4,101,5 >> > 4,103,3 >> > 4,104,4.5 >> > 4,106,4 >> > 5,101,4 >> > 5,102,3 >> > 5,103,2 >> > 5,104,4 >> > 5,105,3.5 >> > 5,106,4 >> > >> > output: >> > recommend for user:1 >> > RecommendedItem[item:104, value:5.0] >> > recommend for user:2 >> > RecommendedItem[item:106, value:4.0] >> > recommend for user:3 >> > RecommendedItem[item:106, value:4.0] >> > recommend for user:4 >> > RecommendedItem[item:105, value:5.0] >> > recommend for user:5 >> > >> > UserId 5 has no recommendations, is it right? >> > Can I get some recommendations for userId 5, even if the recommendation >> > results are not good enough? >> > >> > thanks >> > Regards! >> > >> > >
Re: Why some userId has no recommendations?
You are right Koobas, my answer was on the assumption that item-based NN is used (but I noticed that user-based NN is being used). So my answer is not correct, sorry. Currently, I could not understand the exact reason why user 5 is not getting any recommendations, as you said user 5 should get 107. On Thu, Feb 13, 2014 at 3:21 PM, Koobas wrote: > User 3 gave a recommendation to item 107. > User 5 did not rate 107. > > > On Thu, Feb 13, 2014 at 1:57 AM, Suresh M wrote: > >> user 5 has given rating for all 5 books, >> So there will be no recommendations for him. >> >> >> >> On 12 February 2014 08:55, jiangwen jiang wrote: >> >> > Hi, all: >> > >> > I try to user mahout api to make recommendations, but I find some userId >> > has no recommendations, why? >> > >> > here is my code >> > public static void main(String args[]) throws Exception { >> > String inFile = "F:\\hadoop\\data\\recsysinput.txt"; >> > DataModel dataModel = new FileDataModel(new File(inFile)); >> > UserSimilarity userSimilarity = new >> > PearsonCorrelationSimilarity(dataModel); >> > UserNeighborhood userNeighborhood = new >> > NearestNUserNeighborhood(100, userSimilarity, dataModel); >> > Recommender recommender = new >> > GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity); >> > >> > for (int i = 1; i < 5; i++) { >> > List recommendations = >> > recommender.recommend(i, 1); >> > >> > System.out.println("recommend for user:" + i); >> > for (RecommendedItem recommendation : recommendations) { >> > System.out.println(recommendation); >> > } >> > } >> > } >> > >> > >> > input data(recsysinput.txt): >> > 1,101,5.0 >> > 1,102,3.0 >> > 1,103,2.5 >> > 2,101,2 >> > 2,102,2.5 >> > 2,103,5 >> > 2,104,2 >> > 3,101,2.5 >> > 3,104,4 >> > 3,105,4.5 >> > 3,107,5 >> > 4,101,5 >> > 4,103,3 >> > 4,104,4.5 >> > 4,106,4 >> > 5,101,4 >> > 5,102,3 >> > 5,103,2 >> > 5,104,4 >> > 5,105,3.5 >> > 5,106,4 >> > >> > output: >> > recommend for user:1 >> > RecommendedItem[item:104, value:5.0] >> > recommend for user:2 >> > RecommendedItem[item:106, value:4.0] >> > recommend for user:3 >> > RecommendedItem[item:106, value:4.0] >> > recommend for user:4 >> > RecommendedItem[item:105, value:5.0] >> > recommend for user:5 >> > >> > UserId 5 has no recommendations, is it right? >> > Can I get some recommendations for userId 5, even if the recommendation >> > results are not good enough? >> > >> > thanks >> > Regards! >> > >>