基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)

基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)

第一章 聚类算法介绍
基于聚类的推荐算法笔记一

第二章 数据介绍
基于聚类的推荐算法笔记二

第三章 实现推荐算法
基于聚类的推荐算法笔记三

第四章 评价推荐算法
基于聚类的推荐算法笔记四

文章目录

  • 基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)
  • 前言
  • 一、评价指标
    • 1.1 平均准确率
    • 1.2 平均召回率
    • 1.3 具体实现
  • 总结


前言

本文记载一下本科毕设所研究的课题步骤以及一些细节,由于此次毕设对于推荐领域很感兴趣,发表一些浅显见解,希望大佬们不吝赐教。


最后对推荐结果进行分析,实验中使用平均准确率和平均召回率进行分析。

一、评价指标

定义 R(u)是根据目标用户在训练集中的行为得到的推荐列表,而 T(u)是用户在测试集上真正的行为列表。

1.1 平均准确率

基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)_第1张图片

1.2 平均召回率

基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)_第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)

基于聚类的推荐算法笔记——以豆瓣电影为例(四)(附源代码)_第3张图片

总结

从图中可以看到随着N的增大准确率缓慢下降而召回率上升,当Top-N推荐中N取10效果为最佳。混合聚类方式的推荐算法性能可能稍有提高。

改进:实验中没有使用最常用的预测评分计算均方根误差RMSE和平均绝对误差MAE来进行评价,数据属性选取过少,降维后数据偏差过大。(详细代码以及数据请看仓库或CSND资源)

你可能感兴趣的:(推荐算法,python,数据挖掘,聚类算法,推荐系统)