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

该博客介绍了使用聚类算法进行推荐系统实现的过程,通过对豆瓣电影数据的分析,采用8:2的比例划分实验集和测试集,利用平均准确率和平均召回率作为评价指标。实验显示Top-10推荐效果最佳,同时指出了未使用RMSE和MAE等其他评价方法以及数据属性选择不足的问题。
摘要由CSDN通过智能技术生成

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

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

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

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

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


前言

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


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

一、评价指标

定义 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资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiaoooooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值