【基于用户的】协同过滤推荐算法(UserCF算法的实现)

2023-11-12

协同过滤算法在推荐算法领域应用十分广泛,主要有基于用户(UserCF)基于物品(ItemCF)两种不同的类型:

  • 基于用户的推荐算法:它是一种发现兴趣相似的用户的算法,假如你正在建设的是一个学习资源共享平台,你的用户群体有着大致稳定的专业与相对固定的阅读、学习爱好。当用户A(即登录用户)需要个性化推荐的时候,可以先找到和他兴趣相似的用户群体G,然后把G中所包含的且A中没有的东西进行预测评估,最后根据预测评估值对用户A进行推荐。
  • 基于物品的推荐算法:当一个用户需要个性化推荐时,例如由于他之前购买花朵,所以会给他推荐花盆,因为其他用户很多都同时购买花朵和花盆。基于物品的推荐算法需要先计算物品之间的相似度,再根据物品的相似度和用户的历史行为给用户生成推荐列表。

本文笔者将介绍第一种算法,基于用户的协同过滤算法(UserCF)的实现,正如上文所说,我们将步骤分为三步:

1、找到与用户A兴趣相似的用户群体

  •   首先,我们需要计算用户之间的相似度,本文我们采用余弦相似度来计算,公式为

                                                           

       (其中,N(u)表示用户u所购买的物品集合,|N(u)|则是其购买物品数目,N(v)同理,是用户v的对象) 

        计算分母部分:我们通过构造了一个相似度矩阵sparseMatrix,sparseMatrix[u][v]表示用户u与用户v购买的相同物品个数

  •   然后我们将用户相似度降序排序,只取阈值内的用户最为相似用户群体 

2、对G中所包含的且A没有听说过或没有见过的进行预测分析。

        从相似用户群体中,得到相似用户购买的而我(登录用户)没有的物品,作为带预测的物品。因为与我兴趣相投的用户买了它们,所以可能我也会喜欢它们,这便是UserCF的原理。对这些待预测物品,我们需要进行预测分析,公式为:

                                                          

其中,u表示用户,i表示物品,(u,k)表示用户u的相似群体,p(u,i)则为用户u对物品i的好感度 ,r代表评分,本例中取1,在有评分的系统中它起到调整权重的作用,使得结果更加精准。

3、根据预测分析值对A进行推荐

     根据用户对预测物品的好感度分析,进行排序后即可生成排序列表,本例比较精简,只推荐最合适1个的商品。

代码如下:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 100;
struct similarty{
	double weight;
	int user;
}similartys[maxn];
void myprint(int userItem[][maxn],int n){
	for(int i=0;i<n;i++){
		cout<<"用户"<<userItem[i][0]<<"买了:";
		int j=1; 
		while(userItem[i][j]!='\0'){
			cout<<userItem[i][j]<<" ";
			j++;
		}
		cout<<endl;
	}
	cout<<"-----------"<<endl;
}
int length(int *array){
	int num=0;
	int p=1;
	while(array[p]!='\0'){
		num++;
		p++; 
	} 
	return num;
}
bool myfind(int userItem[][maxn],int user,int n){
	for(int i=1;i<=length(userItem[user-1]);i++){
		if(userItem[user-1][i]==n) return true;
	}
	return false;
}
bool cmp(similarty a,similarty b){
	return a.weight>b.weight;
}
int main(){
	int n=5;  //用户人数 
	int userId=3;  //推荐给userId 
	int num=2; //匹配用户个数 
	cout<<"用户人数:"<<n<<"  "<<"登录id:"<<userId<<endl<<"具体情况:"<<endl; 
	//数据集
	int userItem[n][maxn]={
		{1,1,2,3,6,7},
		{2,2,3},
		{3,1,2,4,5,7},
		{4,1,2,4,6},
		{5,3,4}
	};
	myprint(userItem,n);
	int sparseMatrix[n+1][n+1];  //记录两个用户之间的相似度的稀疏矩阵 
	memset(sparseMatrix,0,sizeof(sparseMatrix));
	//计算用户之间的相似相似度矩阵 
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			int p=1;
			while(userItem[i][p]!='\0'){
				int q=1;
				while(userItem[j][q]!='\0'){
					if(userItem[i][p] == userItem[j][q]){
						sparseMatrix[userItem[j][0]][userItem[i][0]]++;
						sparseMatrix[userItem[i][0]][userItem[j][0]]++;
						break;
					}
					q++;
				}
				p++;
			}
			
		} 
	} 
	//计算用户之间的相似度 (余弦相似性)
	int userIdLength = length(userItem[userId-1]);
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(i!=userId){
			int iLength = length(userItem[i-1]);
			similartys[cnt].weight = sparseMatrix[userId][i]/sqrt(userIdLength*iLength);
			similartys[cnt].user = i;
			cout<<"用户"<<userId<<"和"<<i<<"相似度:"<<similartys[cnt].weight<<endl;
			cnt++;
		}else{
			similartys[cnt++].weight=-1;
		}
	}
	sort(similartys,similartys+n,cmp);
	cout<<"-----------"<<endl<<"用户匹配度最高的[2]位用户为:"; 
	for(int i=0;i<2;i++){
		cout<<similartys[i].user<<" ";
	}
	set<int> items;   //记录考虑的商品:相似用户有的,而登录用户没有的 
	for(int i=0;i<2;i++){
		for(int j=1;j<=length(userItem[similartys[i].user-1]);j++){
			if(!myfind(userItem,userId,userItem[similartys[i].user-1][j])){
				items.insert(userItem[similartys[i].user-1][j]);
			}
		}		
	} 
	cout<<endl<<"-----------"<<endl<<"考虑商品:"<<endl;
	set<int>::iterator it = items.begin();
	for(it;it!=items.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl<<"它们的匹配度为:"<<endl;
	//计算商品匹配度 
	double maxpick = 0; 
	int recommendation;
	for(it=items.begin();it!=items.end();it++){
		double pick = 0;
		for(int i=0;i<2;i++){
			if(myfind(userItem,similartys[i].user,*it)){
				pick+=similartys[i].weight;
			}
		}
		if(pick>maxpick){
			maxpick = pick;
			recommendation = *it;
		}
		cout<<"商品"<<*it<<":"<<pick<<endl;
	}	
	cout<<"-----------"<<endl<<"推荐商品:"<<recommendation<<endl;
}

运行效果: 

总结:CF算法原理其实比较简单,需要我们掌握好几步中的计算公式,即可实现基本功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【基于用户的】协同过滤推荐算法(UserCF算法的实现) 的相关文章

  • C++中vector的使用

    向量std vector是一种对象实体 能够容纳许多各种类型相同的元素 包括用户自定义的类 因此又被称为序列容器 与string相同 vector同属于STL Standard Template Library 中的一种自定义的数据类型 可

随机推荐

  • VTK“静态编译”与“动态编译”的区别:

    静态编译 与 动态编译 的区别 静态编译就是在编译的时候把所有的模块都编译进可执行文件 exe 里去 当启动这个可执行文件时所有的模块都已加载进来 动态编译则是编译的时候需要的模块都没有编译进去 一般情况下可以把这些模块都编译成动态链接库D
  • exec族函数配合fork使用(linux系统编程)

    execl 函数配合fork 函数 在执行A程序的过程中去执行B程序 代码B 用来改文件中的数值 include
  • Google签名证书和base64密钥

    keystore重点说明 1 打包aab时 需要自己创建当前应用的keystore 这个是开发者的应用的keystore 以后上传这个应用都使用这个keystore 2 Google的签名证书 作用是当应用上传Google商店后 Googl
  • 运行时链接

    基本概念 运行时链接 是在程序运行时 而非编译时或加载时 将程序代码与其依赖的库代码进行链接的过程 动态链接在程序启动时或实际运行过程中通过API函数完成 这种方式的主要优点是它允许程序在运行时加载和卸载不同的库模块 从而实现更高的模块化和
  • 敏捷开发“松结对编程”实践之三:共同估算篇(大型研发团队,学习型团队,139团队,师徒制度,敏捷设计,估算扑克,扑克牌估算)

    转载自 http blog csdn net cheny com article details 6587277 本文是 松结对编程 系列的第三篇 之一 之二 之三 之四 之五 之六 之七 之八 此系列之九及之后文章请见栏目总目录 估算是经
  • 使用FFMPEG将WebM转为MP4或MKV

    PS5 自带的录像功能导出的格式是WebM 同时视频是HDR默认60帧 我们有时需要转成其他格式保存 下面两个命令可以将其转成mkv或者mp4格式 ffmpeg i test webm vf zscale t linear npl 100
  • C++基础之const

    C 中什么是常量 常量 在程序运行期间不能发生改变的变量 常量不限制类型 但是在定义之后值不可修改 c 中定义常量有两种方法 使用宏定义 define预处理器 来自C语言 define DEF WINDOW WIDTH 720 使用cons
  • java简单毕设_[手把手教你做毕设](专栏介绍)

    引子 我并没有写过毕设相关的博文 但是每周都有不少人咨询我毕设相关的系统开发问题 OK 好像很久很久以前 写过一个 JSP Servlet培训班作业管理系统 说实话写得一般 确实一般 不是谦虚 以致于心有愧欠 感觉貌似大概可能也许差不多 误
  • 55个mes项目解决方案及案例_我调查了 20 个 MES 项目实施情况,发现了这些

    本文首发于 智能制造社区 作者Raylan 昨天智能制造社区的 Raylan 同学设计了个简单的问卷 想分析下 MES 项目的执行情况 所以就在我们社区微信群里简单做了抽样 此次调研是匿名调研 问卷接收数量大约在44 63之间 问卷返回数量
  • 从0开始写Vue项目-Vue实现用户数据批量上传和数据导出

    从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 从0开始写Vue项目 Vue页面主体布局和登录 注册页面 慕言要
  • IDEA常用快捷键(Windows)

    Ctrl S 保存文件 Ctrl C 复制 Ctrl X 剪切 Ctrl V 粘贴 Ctrl Z 撤销 Ctrl Y 重做 Ctrl F 查找 Ctrl Shift F 全局查找 Ctrl R 替换 Ctrl D 复制当前行或选中区域到下一
  • 编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number // 2,并返回该值。如果number是奇数,collatz()就打印

    要求 编写一个名为collatz 的函数 它有一个名为number的参数 如果参数是偶数 那么collatz 就打印出number 2 并返回该值 如果number是奇数 collatz 就打印并返回3 number 1 使用软件 vsco
  • 深度学习 情感分析_使用深度学习进行情感分析

    深度学习 情感分析 介绍 Introduction The growth of the internet due to social networks such as Facebook Twitter Linkedin Instagram
  • Mule的学习(一、mule的认知)

    参考 https blog csdn net a victory article details 70216772 https blog csdn net lishehe article details 33394895 https www
  • U盘读写速度优化

    从android设备上向U盘上传文件 时间比较长 优化后 时间大幅度缩短 经过几次测试 8k的缓存可以达到传输速度和容错率的平衡点 超过了太容易出错 低于8k传输速度会下降 byte buffer new byte 1024 8 使用的第三
  • MMEditing如何添加自己的新模型

    如何使用商汤的框架MMEditing添加一个自己的新模型嘞 因为自己平时做超分辨率 所以这里用BasicVSR的改动作为例子 一般需要在MMEditing中添加三个文件 配置 backbones以及restores BasicSR原始的地址
  • LeetCode-312.戳气球、动态规划

    有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的 left 和
  • C语言文件包含

    一个C语言程序由若干源程序文件组成 而一个源文件还可以将另一个源文件的全部内容包含进来 即将指定的源文件包含在当前文件中 例如 下有两个源文件file1 c和file2 c file1 c int max int x int y int z
  • 因易用性导致的TongWeb使用误区

    误区一 使用TongWeb企业版本 即按照 TongWeb7企业版用户手册 pdf 手册操作 安装好TongWeb后doc目录下有手册 TongWeb手册的正确观看顺序 1 最先看 TongWeb7快速使用手册 pdf 了解基本的安装 使用
  • 【基于用户的】协同过滤推荐算法(UserCF算法的实现)

    协同过滤算法在推荐算法领域应用十分广泛 主要有基于用户 UserCF 和基于物品 ItemCF 两种不同的类型 基于用户的推荐算法 它是一种发现兴趣相似的用户的算法 假如你正在建设的是一个学习资源共享平台 你的用户群体有着大致稳定的专业与相