else: predict_rating = unnormalized_predict_rating / norm_similarity return predict_rating def Evaluation_CF_to_predict_rating(train, test, K): sum_squared_error = 0.0 rmse = 0.0 W = userSimilarityRating(train) count = 0 print "Evaluation" for user in train.keys(): if user in test.keys(): test_user_item = test[ user] #key: item , value: rating user to item for itemi in test_user_item.keys(): predict_rating = UserCF_to_predict_raring( user, itemi, train, W, K) if predict_rating != -1: count += 1 real_rating = test[user][itemi] rmse += (predict_rating - real_rating)**2 print "predict number:", count rmse = np.sqrt(rmse / count) return rmse if __name__ == "__main__": data = dp.readMoiveIdRatingFromRatings("ratings.dat", "::") trainData, testData = dp.splitRatingData(data) print Evaluation_CF_to_predict_rating(trainData, testData, 20)
def Evaluation_CF_rating(train, test, N): hit = 0 totalTestItemNum = 0.0 totalRecommendationNum = 0.0 W = userSimilarityRating(train) print "Evaluation" for user in train.keys(): if user in test.keys(): test_user_item = test[user] totalTestItemNum += len(test_user_item) recommendationList = RatingUserCFRecommencd(user, train, W) recommendationList = [ recomItem[0] for recomItem in recommendationList ] if len( recommendationList ) > N: #If the recommendation list's length is larger than N recommendationList = recommendationList[0:N] totalRecommendationNum += N else: totalRecommendationNum += len(recommendationList) for itemi in recommendationList: if itemi in test_user_item: hit += 1 return hit * 1.0 / totalTestItemNum, hit * 1.0 / totalRecommendationNum if __name__ == "__main__": data = dp.readMoiveIdRatingFromRatings() trainData, testData = dp.splitRatingData(data) print Evaluation_CF_rating(trainData, testData, 7)
return sorted(recomList.items(), key = lambda x:x[1], reverse=True) def Evaluation_CF_rating(train, test, N): hit = 0 totalTestItemNum = 0.0 totalRecommendationNum = 0.0 W = userSimilarityRating(train) print "Evaluation" for user in train.keys(): if user in test.keys(): test_user_item = test[user] totalTestItemNum += len(test_user_item) recommendationList = RatingUserCFRecommencd(user,train,W) recommendationList = [recomItem[0] for recomItem in recommendationList] if len(recommendationList)>N: #If the recommendation list's length is larger than N recommendationList = recommendationList[0:N] totalRecommendationNum += N else: totalRecommendationNum += len(recommendationList) for itemi in recommendationList: if itemi in test_user_item: hit += 1 return hit*1.0/totalTestItemNum,hit*1.0/totalRecommendationNum if __name__ == "__main__": data = dp.readMoiveIdRatingFromRatings() trainData, testData = dp.splitRatingData(data) print Evaluation_CF_rating(trainData, testData, 7)
if count < K/2: return -1 #cant predict, here can be replaced by the average value of the item get else: predict_rating = unnormalized_predict_rating/norm_similarity return predict_rating def Evaluation_CF_to_predict_rating(train, test, K): sum_squared_error = 0.0 rmse = 0.0 W = userSimilarityRating(train) count = 0 print "Evaluation" for user in train.keys(): if user in test.keys(): test_user_item = test[user] #key: item , value: rating user to item for itemi in test_user_item.keys(): predict_rating = UserCF_to_predict_raring(user,itemi,train,W,K) if predict_rating != -1: count += 1 real_rating = test[user][itemi] rmse += (predict_rating - real_rating)**2 print "predict number:", count rmse = np.sqrt(rmse/count) return rmse if __name__ == "__main__": data = dp.readMoiveIdRatingFromRatings("ratings.dat","::") trainData, testData = dp.splitRatingData(data) print Evaluation_CF_to_predict_rating(trainData, testData, 20)