基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)
第一章 聚类算法介绍
基于聚类的推荐算法笔记一
第二章 数据介绍
基于聚类的推荐算法笔记二
第三章 实现推荐算法
基于聚类的推荐算法笔记三
第四章 评价推荐算法
基于聚类的推荐算法笔记四
前言
本文记载一下本科毕设所研究的课题步骤以及一些细节,由于此次毕设对于推荐领域很感兴趣,发表一些浅显见解,希望大佬们不吝赐教。
最后对推荐结果进行分析,实验中使用平均准确率和平均召回率进行分析。
一、评价指标
定义 R(u)是根据目标用户在训练集中的行为得到的推荐列表,而 T(u)是用户在测试集上真正的行为列表。
1.1 平均准确率
1.2 平均召回率
1.3 具体实现
对全部数据按8:2划分实验集和测试集,在实验集中进行聚类-协同过滤推荐得到推荐列表R,与测试集T进行比较计数,计算平均准确率和召回率。
import math
from operator import *
import pandas as pd
import numpy as np
import xlwt
import csv
import collections
dic1={}#放推荐列表的字典
dic2={}#放真实观影记录
if __name__ == '__main__':
file1 = "D:\\experiment\\第三次豆瓣\\测试4_K近邻=30\\train\\热门_推荐结果_Canopy+K-means_T1=100,T2=100.csv"#推荐结果
tmp_lst = []
with open(file1, 'r', encoding='gbk', errors='ignore') as f:
reader = csv.reader(f)
for row in reader:
tmp_lst.append(row)
data1 = pd.DataFrame(tmp_lst[1:], columns=tmp_lst[0])
#print(data1)
train_data1 = np.array(data1) # np.ndarray()每个姓名转换为一个list[]
# print(train_data)
all_list1 = train_data1.tolist() # 转换list
# print(all_list)
for item in all_list1:
# print(item)
dic1.setdefault(int(item[2]), []).append(item[0]) # 将电影名加入对应用户的字典内,键为用户名,值为电影列表
#这里的用户id读进来是str型需要强制转换为int型与dic2保持一致,并且方便后续用键取值
print(dic1)
file2 = "D:\\experiment\\第三次豆瓣\\测试3\\test\\热门_测试数据.csv"
data2=pd.read_csv(file2, encoding='gbk')
#print(data2)
train_data2 = np.array(data2) # np.ndarray()每个姓名转换为一个list[]
# print(train_data)
all_list2 = train_data2.tolist() # 转换list
# print(all_list)
for item in all_list2:
# print(item)
dic2.setdefault(item[0], []).append(item[2]) # 将电影名加入对应用户的字典内,键为用户名,值为电影列表
print(dic2)
precision_all=0
recall_all=0
all_num=0
for i in range(1,183,1):
R_num=0
T_num=0
R_T=0
if dic2.get(i) and dic1.get(i) is not None:
all_num+=1
for item in dic2[i]:#真实记录列表
T_num+=1
for item1 in dic1[i]:#推荐列表
R_num+=1
if item1 in dic2[i]:
R_T+=1
if R_num == 25:#控制Top-N推荐的N值,只计算前N个的准确率和召回率
break
else:
continue
precision = R_T/R_num*1.0
recall = R_T/T_num*1.0
print("第", i, "位用户的推荐准确率为:", precision, "召回率为:", recall, "一共中了:", R_T)
precision_all += precision
recall_all += recall
precision_all /= all_num
recall_all /= all_num
print("平均推荐准确率为:", precision_all, "平均召回率为:", recall_all)
总结
从图中可以看到随着N的增大准确率缓慢下降而召回率上升,当Top-N推荐中N取10效果为最佳。混合聚类方式的推荐算法性能可能稍有提高。
改进:实验中没有使用最常用的预测评分计算均方根误差RMSE和平均绝对误差MAE来进行评价,数据属性选取过少,降维后数据偏差过大。(详细代码以及数据请看仓库或CSND资源)