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)
Exemple #2
0
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)