基于地点相似度的POI推荐以及路径重组【matlab】

这里设计的POI推荐算法是参考于POI推荐算法,简单来说,就是利用用户访问POI的频次作为POI之间相似度的测度。
具体描述以及代码展示如下:
数据预处理
随机抽取若干行数据
首先我们要进行数据清洗,我们将456967行数据,10000多名用户参与的Gowalla数据进行预处理
为避免数据的偶然性对实验产生的偏差影响,我们在获取数据的同时,随机抽取10000行数据进行实验,代码如下:
生成Excel文件后,按照用户编号升序或者降序排列,因为在下面过滤数据的操作中,需要利用这样的排列结构进行过滤操作
2.数据过滤
过滤掉同一个user_id下,记录少于10行的数据,这样,保留下来的user_id,至少拥有10次访问Poi的签到数据
代码如下:
算法设计
下面来逐行用代码解释算法每一步操作步骤
1)输入地点a, 用户集合X,地点集合Y、用户和地点关系集合
2)找到对a感兴趣的用户子集U;
在我们的实践中,设地点a为poi_id是15693的节点,阈值设为theta=2,即同一个用户访问同一个Poi的次数超过theta,我们可以认为该用户对该poi感兴趣
3)分别找到U中用户感兴趣的地点,组成地点子集A
4)分别计算A中元素e和a的相似度
sim = |U中去过e的人次| / sqrt(|X中去过a的人次| * |X中去过e的人次|)
这里用了人次,而没有用人数
5)按sim对A中元素从大到小排序,取sim最大的n个地点作为a的相似地点子集S
6)输出S
在这里顺便值得一提的是,在初始化count_1向量时,之所以设置为0.1*ones()矩阵,是因为这巧妙的规避了poi或者是用户编号为0的误差,因为我们之前使用类似功能的any()函数保留了非零元,之后再“四舍五入”,round()一下,这样原本为0.1的数据依然是0,我们就可以放心的将此零元“过滤掉”(unique函数过滤)
进行个性化选择
考虑到用户可能有几日游的习惯,我们设置Day变量,下面是假设,假设用户半日游,如下,则给我们推荐3个景点,分别是Sim值较高的前三个POI节点。如下所示:
最后进行路径重组
我们使用Ant Colony算法进行路径重组,由于原始Gowalla数据格式不包含坐标信息,因此我们要将经纬度进行转化计算,这里可以参考我写的程序,启发函数为欧氏距离的倒数,其结果如下所示:



