科研训练报告
餐饮电子商务个性化推荐系统推荐算法研究
院系:软件学院
班级: 1105班 姓名:张 学号: 指导老师:
餐饮电子商务个性化推荐系统推荐算法研究
The Research on recommendation algorithm of Recommendation System in Catering E-Commerce
指导老师:
餐饮电子商务个性化推荐系统推荐算法科研报告
摘要:本文首先阐述了本算法的思想,基于分类的协同过滤推荐算法。给出了形式化的数学表达式。给出了协同过滤算法部分的详细代码和实验过程。然后,本文讨论了实验平台的改进设想。最后讨论了基于Hadoop和Mahout 平台推荐算法的实现。
Abstract: This paper first expounds the thought of this algorithm, the collaborative filtering recommendation algorithm based on classification. The formal mathematical expressions are given. Detailed code part of the collaborative filtering algorithm is proposed and the experimental process. Then this paper discusses the experiment platform of improvement ideas. In the end implementation of recommended algorithm is discussed based on Hadoop and Mahout platform.
关键词:推荐系统;协同过滤;Hadoop; Mahout
Key words: recommendation system; Collaborative filtering; Hadoop
一、 算法概述
不同的推荐系统,它们的推荐算法和评价指标都不尽相同。作为餐饮推荐系统,至少存在以下几个方面,与传统(如图书)的推荐系统(购买行为)不同。(1)受地域和消费水平影响非常大。对于餐饮来说,极少会有去很远的地方或与自身消费相去甚远的餐馆消费。(2)餐饮往往还有社交因素。有很多餐饮消费发生在宴请、聚餐等行为。(3)餐饮还有重复性消费的特点。
由于时间和本人自身水平问题,很多问题尚不能考虑完全。暂且提出如下的推荐算法。
(1) 根据餐馆和用户的位置,将餐馆和用户分类。相同地区的餐
馆和用户才能发生相应关系。这样做第一可以提高推荐质量,更主要的是可以减少算法的开销。
(2) 根据购买记录、浏览记录以及用户兴趣模型综合评分。这样
可以在一定程度上解决冷启动问题和评分稀疏性问题。
(3) 根据评分利用协同过滤方法进行推荐。
二、 协同过滤算法的实现
2.1基于用户的协同过滤算法主要步骤描述 由于时间问题和实验条件(缺乏实验数据源),本次训练暂且实现了基于用
户的协同过滤算法。算法的主要步骤如下。 数据表示:
在Userbased协同过滤推荐中,必须根据不同用户对商品的评分信息产生推荐结果。用户评分数据可以用一个m’n阶矩阵A(m,n)表示,m行代表m个用户,n列代表n个项,第i行第j列的元素凡J代表用户i对项j的评分。用户评分数据矩阵如图2.1所示。
图2.1: 用户评分矩阵 最近邻查询: 最近邻查询是整个Useobased协同过滤推荐算法的核心部分,其效果和效率 很大程度上决定了User一based协同过滤推荐算法的效果和效率。所谓最近邻居,就是购买行为或评分行为与当前用户比较相似的若干用户。最近邻查询阶段实质上就是Userbased协同过滤推荐算法的模型建立阶段。
1). 余弦相似性(Cosine):用户评分看作为n维项空间上的向量,如果用户对项没有进行评分,则将用户对该项的评分设为O,用户间的相似性通过向量间的余弦夹角度量。设用户i和用户j在n维项空间上的评分分别表示为向量I,j,则用户i和用户j之间的相似性sim(I,j)为:
分子为两个用户评分向量的内积,分母为两个用户向量模的乘积。
通过上面提出的相似性度量方法得到目标用户的最近邻居,下一步需要产生 相应的推荐。设用户u的最近邻居集合用刀N公表示,则用户u对项i的预测评分pu,,可以通过用户u对最近邻居集合凡叽中项的评分得到,计算方法如下
sim(u,n)表示用户u与用户n之间的相似性,Rn.j表示用户n对项i的评分。Ru 和Rn分别表示用户u和用户n对项的平均评分。 2.2 实验的具体方法和步骤 实验环境:
开发工具:MyEclipe8.5语音:java 数据源; 用户评分矩阵
static double[][] userScore = new double[][] { {2,4,4,4,3,3,2,2}, {3,2,3,4,2,4,2,3}, {1,3,4,3,3,3,1,2}, {1,3,4,3,3,5,3,2}, {1,3,5,4,4,3,2,1}, {3,2,3,3,3,3,2,3}, {3,4,4,3,3,3,2,2}, {4,2,5,3,3,3,1,1}, };
相关代码:
importjava.util.Arrays; publicclassuserCF {
/**
* @paramargs */
// 索引分别代表用户和商品,项代表用户对商品的评分 staticdouble[][] userScore = newdouble[][] {
staticdouble[][] sim = newdouble[][]{ };
staticdouble[][] preScore = newdouble[][]{
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0},
{2,4,4,4,3,3,2,2}, {3,2,3,4,2,4,2,3}, {1,3,4,3,3,3,1,2}, {1,3,4,3,3,5,3,2}, {1,3,5,4,4,3,2,1}, {3,2,3,3,3,3,2,3}, {3,4,4,3,3,3,2,2}, {4,2,5,3,3,3,1,1}, };
};
{0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0},
// 相似用户集合
staticint[] nearUser = newint[]{0,0,0};
// 计算相似度矩阵
publicstaticvoidsetSim(){ }
// 计算向量模的乘积
publicstaticdoublevectorProduct (int vector1,int vector2){ }
// 计算向量内积
publicstaticdoublevectorInnerProduct (int vector1,int vector2){
int Product1 = 0; int Product2 = 0;
for(inti = 0;i<8;i++){ }
for(inti = 0;i<8;i++){ }
returnMath.sqrt(Product1) * Math.sqrt(Product2);
Product2 += userScore[vector2][i] * userScore[vector2][i]; Product1 += userScore[vector1][i] * userScore[vector1][i]; for(inti=0;i<8;i++){ }
for(int j= 0;j<8;j++){ }
sim[i][j]= vectorInnerProduct(i,j) / vectorProduct(i, j);
}
doubletoutle = 0; for(inti = 0;i<8;i++){ }
returntoutle;
toutle += userScore[vector1][i] * userScore[vector2][i];
// 功能:将相似度最大的三个用户索引号按序储存在数组nearUser
publicstaticvoidsimMax(int user) { }
double[] tempSort = newdouble[8]; for(inti=0;i<8;i++){ }
Arrays.sort(tempSort);
for(inti=0;i<8;i++){ }
for(inti=0;i<8;i++){ }
for(inti=0;i<8;i++){ }
if(tempSort[4]==sim[user][i]){ }
nearUser[2]= i; break;
if(tempSort[5]==sim[user][i]){ }
nearUser[1]= i; break;
if(tempSort[6]==sim[user][i]){ }
nearUser[0]= i; break;
tempSort[i] = sim[user][i];
// 计算用户对项目的平均评分
publicstaticdoubleavgUserToItem(int user) { }
// 计算预测得分
publicstaticdoublepredictiveScore(intuser,int item) {
double Score = 0;
double sum1 = 0; double sum2 = 0;
for(inti = 0;i <3;i++){
doubletotalUserToItem = 0; for(inti = 0; i<8; i++){ }
returntotalUserToItem / 8;
totalUserToItem += userScore[user][i];
sum1 += sim[user][ nearUser[i] ] *( userScore[nearUser[i]][item] }
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
setSim();
Score = avgUserToItem(user) + sum1/sum2 ;
return Score;
for(inti = 0;i <3;i++){
}
sum2 += sim[user][ nearUser[i] ] ; }
- avgUserToItem(nearUser[i]));
simMax(0);
for(inti = 0; i <8; i++){ }
for(inti = 0; i < 8; i++){ }
// 平均准确度误差 doubleavePre = 0; doubletotlePre = 0;
for(inti = 0; i <8; i++){ }
avePre = totlePre / 64;
// 平均准确度随机误差 doubleavePreR = 0; doubletotlePreR = 0;
for(inti = 0; i <8; i++){ }
for(int j = 0; j < 8; j++){ }
totlePreR += Math.abs(( userScore[i][j]-Math.random()*5)
for(int j = 0; j < 8; j++){ }
totlePre += Math.abs(( userScore[i][j]-preScore[i][j]) /
for(int j = 0; j < 8; j++){ }
System.out.println();
System.out.print(preScore[i][j] + \" \"); for(int j = 0; j < 8; j++){ }
preScore[i][j] = predictiveScore(i,j );
userScore[i][j] );
/ userScore[i][j] );
}
}
avePre = totlePre / 64; System.out.println(avePre); avePreR = totlePreR / 64; System.out.println(avePreR);
2.3 实验的运行结果 如图2.3所示
图2.3:运行结果图
可知采用此算法平均误差百分比为25.13% 采用随机数对比平均误差百分比为61.63%
实验表明本算法是具有显著效果的。如果是客观的数据源,我相信其准确率还会增加。
三、 实验平台的改进
在数据挖掘中,往往是大规模数据。本次实验室在极为普通的环境下实现,并没有考虑到实际应用中的问题。本次科研训练中我也尝试在一些专业的平台下实验。
3.1 weka平台
众所周知,weka是一款极为流行的数据挖掘平台工具。研究生助教也是给我们介绍的是这个平台。
Weka平台我认为有以下几个优点:(1)使用简单。很多数据挖掘算法只要轻轻一点,即可完成。(2)数据图形化。很多算法可以提供图形化的结果和挖掘过程。(3)开源免费。可以进行二次开发。
Weka平台如果想加入自己的算法,就必须根据其源码进行二次开发。我的开发环境为MyEclipe8.5。导入开发包后的工程目录如图3.1所示。
图3.1: 工程目录 主要的包如图3.2所示。
图3.2:主要的包目录
如包的名字所示。主要算法在相对的包中,weka.core提供了基本的功能类(类目录如图3.3所示)。主要的类有Attribute类,提供了属性的相关操作。
Instance类提供了实例的相关操作。Weka.gui包提供了关于图形化界面的相关功能。
图3.3:weka.core包目录
加入算法的步骤比较简单。根据weka的API规范写出算法类。然后可以在图形化接口中加入相关算法的选项。
但是我们做的有关推荐算法,比如协同推荐,在weka中却没有任何体现和相关类或接口。所以我认为用weka作为实验工具做个性化推荐算法不是一个好的选择。
3.2 Hadoop和Mahout 平台
Hadoop 是当前热门的云计算解决方案之一, 是Apache 组织的一个开源的分布式计算平台, 以Hadoop 分布式文件系统(HDFS)和MapReduce 为核心为用户提供了系统底层细节透明的分布式基础架构. 从而用户可以利用Hadoop 轻松地组织计算机资源, 搭建自己的分布式计算平台, 并且可以充分利用集群的计算和存储能力, 完成海量数据的处理.现在Hadoop 已经发展成为包含了多个子项目的集合, 它们提供互补性服务或在核心层上提供了更高层的服务。
显然利用Hadoop平台是一个非常好的选择。在选择数据库(数据仓库)上
HBase是个很好的选择。HBase是一个分布式、面向列的开源数据库, 在Hadoop 之上提供类似Bigtable 的能力. 不同于一般关系数据库的数据模型, 用户将数据存储在一个表里,一个数据行拥有一个可选择的键和任意数量的列. 主要用于需要随机访问、实时读取的大数据. 相比其他传统关系型数据库, HBase 数据库有以下优势.
HBase 是一个基于列模式的映射数据库, HTable为null 的Column 不会被存储, 这样既节省了空间又提高了读性能, 很适宜存储松散型数据.
HBase 架构在Hadoop 上, 不仅具有很好的可收缩性, 当数据越来越大时, 只要扩展Hadoop 集群, HBase会自动水平切分扩展, 跟Hadoop 的无缝集合保障了其数据库可靠性和海量数据分析的高性能.HBase 能够结合使用MapReduce 编程框架并行处理大规模数据, 使得数据存储与并行计算完美地结合在一起。 实际上Apache基金会还提供了另一个关于机器学习和数据挖掘的开源项目Mahout。 Mahout平台
Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Mahout项目中给出了一个关于协同过滤算法的高效实现。其相关的组件图如3.4所示。
图3.4:Mahout中协同过滤算法实现的组件图 很遗憾,由于时间的限制,我还没有完成Hadoop和Mahout平台上关于本算法和系统的实现。
四、 科研训练总结
本次科研训练,我对数据挖掘,特别是个性化推荐系统有了一定了解。锻炼了我一定的自学能力和科研能力。掌握了做科研的部分方法,如查文献等。对我的成长具有很大的帮助。
本次训练也留下了很多遗憾的地方。算法的实现很有限。自己也还未实现或提出一个创新其有效的算法。造成以下的原因我想可能有以下几个方面。
1)时间极为有限。从选题到做科研,再到写报告一共尽16天时间。
2)自己没有相关方面基础。数据挖掘机相关知识需要一定的知识基础。我
们过去在课堂上自然没有接触过。而我本身是学习嵌入式方向的,在这方面也没有自学。
3)没有数据源。如果自己造数据,那么就失去了数据的客观性。没有数据
源似乎有巧妇难为无米之炊的难言之隐。 虽然本次科研训练的课程已经结束,报告也已经提交了。但是我关于这方面的研究一定会继续下去。下一步我将会对数据挖掘的基本知识和方法进行学习,对Hadoop和Mahout平台进行研究。力争完成一个高效的、具有创新性的算法。
参考文献:
[1]邓爱林.电子商务推荐系统关键技术研究[博士学位论文].上海:复旦大学,2003.
[2] 刘建国,周涛,汪秉宏.个性化推荐系统的研究进展[J].自然科学进展,2009,19(1): 1-15.
[3] 王国霞,刘贺平.个性化推荐系统综综述[j]。计算机工程与应用,2012,47(8).
[4].刘玮电子商务系统中的信息推荐方法研究[期刊论文]-情报科学2006(02)
[5] 陈君;唐雁基于Web社会网络的个性化Web信息推荐模型[期刊论文]-计算机科学2006(04)
[6]赵鹏;耿焕同;王清毅基于聚类和分类的个性化文章自动推荐系统的研究[期刊论文]-南京大学学报(自然科学版) 2006(05)
[7] 刘庆华,个性化推荐技术及其在电子商务中的应用[学位论文] 2007 [8].田晓珍;尚冬娟Web的个性化服务2008(07)
[9] 李勇;徐振宁;张维明Internet个性化信息服务研究综述[期刊论文]-计算机系统应用2013(7)
[10] 杨志文;刘波基于Hadoop平台协同过滤推荐算法[期刊论文]-计算机工程与应用 2002(19)
。
因篇幅问题不能全部显示,请点此查看更多更全内容