Python CF入门实验

来源:互联网 发布:php set timezone 编辑:程序博客网 时间:2024/04/30 01:29

原文在这里自己写Python
写的非常好,很受启发

下一步是做出预测。你已经创建了相似性矩阵:user_similarity和item_similarity,因此,你可以通过为基于用户的CF应用下面的公式做出预测:

你可以将用户k和a之间的相似性看成权重,它乘以相似用户a (校正的平均评分用户)的评分。你需要规范化该值,使打分位于1到5之间,最后,对你尝试预测的用户的平均评分求和。

这里的想法是,某些用户可能会倾向于对所有的电影,总是给予高或低评分。这些用户提供的评分的相对差比绝对评分值更重要。举个例子:假设,用户k对他最喜欢的电影打4星,而对所有其他的好电影打3星。现在假设另一个用户t对他/她喜欢的电影打5星,而对他/她感到无聊的电影打3星。那么这两个用户可能品味非常相似,但对打分系统区别对待。

# encoding=utf-8import numpy as npimport pandas as pdheader=['user_id','item_id','rating','timestamp']df=pd.read_csv('E:\\dataset\\ml-100k\\ml-100k\\u.data',sep='\t',names=header)n_users = df.user_id.unique().shape[0]n_items = df.item_id.unique().shape[0]print 'Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items)from sklearn import cross_validation as cvtrain_data, test_data = cv.train_test_split(df, test_size=0.1)'''第一步是创建用户-产品矩阵。由于你既有测试数据,又有训练数据,那么你需要创建两个矩阵。'''train_data_matrix = np.zeros((n_users, n_items))for line in train_data.itertuples():    train_data_matrix[line[1]-1, line[2]-1] = line[3]test_data_matrix = np.zeros((n_users, n_items))for line in test_data.itertuples():    test_data_matrix[line[1]-1, line[2]-1] = line[3]from sklearn.metrics.pairwise import pairwise_distancesuser_similarity = pairwise_distances(train_data_matrix, metric='cosine')item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')print user_similarityprint item_similarity'''from sklearn.cluster import KMeansmodel=KMeans(n_clusters=3)train_cluster=model.fit(user_similarity)print train_cluster.cluster_centers_'''def predict(ratings, similarity,type='user'):#评分矩阵,相似度,类型对象    if type=='user':        mean_user_rating=ratings.mean(axis=1)        #求出用户打分的均值,axis=0表示纵向列取平均值,axis=1表示横向行上求和取均值        print "========ratings==========="        print ratings        print "========mean_user_rating==========="        print len(mean_user_rating)        ratings_diff = (ratings - mean_user_rating[:, np.newaxis])        #用户实际评分与他平均评分的差值        pred_user = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array(            [np.abs(similarity).sum(axis=1)]).T        #其中similarity.dot(ratings_diff)是相似度乘上用预测差值,全部使用矩阵        print "======用户预测=========="        print pred_user[134:135]        return pred_user    elif type == 'item':#如果是计算项目的相似度预测评分        pred_item = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])        print "======项目预测=========="        print pred_item[134:135]        return pred_itemuser_prediction = predict(train_data_matrix, user_similarity, type='user')item_prediction = predict(train_data_matrix, item_similarity, type='item')print "======用户预测2=========="print user_prediction[134:135]from sklearn.metrics import mean_squared_errorfrom sklearn.metrics import mean_absolute_errorfrom math import sqrtdef rmse(prediction, ground_truth):    prediction = prediction[ground_truth.nonzero()].flatten()    ground_truth = ground_truth[ground_truth.nonzero()].flatten()    return sqrt(mean_squared_error(prediction, ground_truth))print 'User-based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix))print 'Item-based CF RMSE: ' + str(rmse(item_prediction, test_data_matrix))def mae(prediction, ground_truth):    prediction = prediction[ground_truth.nonzero()].flatten()    ground_truth = ground_truth[ground_truth.nonzero()].flatten()    return mean_absolute_error(prediction, ground_truth)print 'User-based CF MAE: ' + str(mae(user_prediction, test_data_matrix))print 'Item-based CF MAE: ' + str(mae(item_prediction, test_data_matrix))

结果:
Number of users = 943 | Number of movies = 1682
[[ 0.00000000e+00 8.95630250e-01 9.72756397e-01 …, 8.60862780e-01
8.14111912e-01 6.48358820e-01]
[ 8.95630250e-01 0.00000000e+00 9.06897686e-01 …, 8.88742401e-01
8.17974917e-01 9.00341777e-01]
[ 9.72756397e-01 9.06897686e-01 -2.22044605e-16 …, 8.86459080e-01
9.20561034e-01 1.00000000e+00]
‘’‘’‘’

========ratings===========
[[ 5. 0. 4. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
…,
[ 5. 0. 0. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
[ 0. 5. 0. …, 0. 0. 0.]]
========mean_user_rating===========
943
======用户预测==========
[[ 1.52954421 0.24836017 0.15464074 …, -0.0879848 -0.08752703
-0.08758209]]
======项目预测==========
[[ 0.07952868 0.08000635 0.08850828 …, 0.10135055 0.09788366
0.0972341 ]]
======用户预测2==========
[[ 1.52954421 0.24836017 0.15464074 …, -0.0879848 -0.08752703
-0.08758209]]
User-based CF RMSE: 3.01963228799
Item-based CF RMSE: 3.41041357693
User-based CF MAE: 2.81176080559
Item-based CF MAE: 3.20818123812
可以看到MAE很大,效果不咋滴啊
但是大概的思路明白了,使用矩阵的方法比较简单

0 0
原创粉丝点击