科研报告餐饮电子商务个性化推荐系统推荐算法.docx
- 文档编号:9951919
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:18
- 大小:240.50KB
科研报告餐饮电子商务个性化推荐系统推荐算法.docx
《科研报告餐饮电子商务个性化推荐系统推荐算法.docx》由会员分享,可在线阅读,更多相关《科研报告餐饮电子商务个性化推荐系统推荐算法.docx(18页珍藏版)》请在冰豆网上搜索。
科研报告餐饮电子商务个性化推荐系统推荐算法
中南大学
科研训练报告
餐饮电子商务个性化推荐系统推荐算法研究
院系:
软件学院
班级:
1105班
姓名:
张
学号:
指导老师:
餐饮电子商务个性化推荐系统推荐算法研究
TheResearchonrecommendationalgorithmofRecommendationSysteminCateringE-Commerce
指导老师:
餐饮电子商务个性化推荐系统推荐算法科研报告
摘要:
本文首先阐述了本算法的思想,基于分类的协同过滤推荐算法。
给出了形式化的数学表达式。
给出了协同过滤算法部分的详细代码和实验过程。
然后,本文讨论了实验平台的改进设想。
最后讨论了基于Hadoop和Mahout 平台推荐算法的实现。
Abstract:
Thispaperfirstexpoundsthethoughtofthisalgorithm,thecollaborativefilteringrecommendationalgorithmbasedonclassification.Theformalmathematicalexpressionsaregiven.Detailedcodepartofthecollaborativefilteringalgorithmisproposedandtheexperimentalprocess.Thenthispaperdiscussestheexperimentplatformofimprovementideas.IntheendimplementationofrecommendedalgorithmisdiscussedbasedonHadoopandMahout platform.
关键词:
推荐系统;协同过滤;Hadoop;Mahout
Keywords:
recommendationsystem;Collaborativefiltering;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
数据源;
用户评分矩阵
staticdouble[][]userScore=newdouble[][]{
{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[][]{
{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},
};
staticdouble[][]sim=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},
};
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},
};
//相似用户集合
staticint[]nearUser=newint[]{0,0,0};
//计算相似度矩阵
publicstaticvoidsetSim(){
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
sim[i][j]=vectorInnerProduct(i,j)/vectorProduct(i,j);
}
}
}
//计算向量模的乘积
publicstaticdoublevectorProduct(intvector1,intvector2){
intProduct1=0;
intProduct2=0;
for(inti=0;i<8;i++){
Product1+=userScore[vector1][i]*userScore[vector1][i];
}
for(inti=0;i<8;i++){
Product2+=userScore[vector2][i]*userScore[vector2][i];
}
returnMath.sqrt(Product1)*Math.sqrt(Product2);
}
//计算向量内积
publicstaticdoublevectorInnerProduct(intvector1,intvector2){
doubletoutle=0;
for(inti=0;i<8;i++){
toutle+=userScore[vector1][i]*userScore[vector2][i];
}
returntoutle;
}
//功能:
将相似度最大的三个用户索引号按序储存在数组nearUser
publicstaticvoidsimMax(intuser){
double[]tempSort=newdouble[8];
for(inti=0;i<8;i++){
tempSort[i]=sim[user][i];
}
Arrays.sort(tempSort);
for(inti=0;i<8;i++){
if(tempSort[6]==sim[user][i]){
nearUser[0]=i;
break;
}
}
for(inti=0;i<8;i++){
if(tempSort[5]==sim[user][i]){
nearUser[1]=i;
break;
}
}
for(inti=0;i<8;i++){
if(tempSort[4]==sim[user][i]){
nearUser[2]=i;
break;
}
}
}
//计算用户对项目的平均评分
publicstaticdoubleavgUserToItem(intuser){
doubletotalUserToItem=0;
for(inti=0;i<8;i++){
totalUserToItem+=userScore[user][i];
}
returntotalUserToItem/8;
}
//计算预测得分
publicstaticdoublepredictiveScore(intuser,intitem){
doubleScore=0;
doublesum1=0;
doublesum2=0;
for(inti=0;i<3;i++){
sum1+=sim[user][nearUser[i]]*(userScore[nearUser[i]][item]-avgUserToItem(nearUser[i]));
}
for(inti=0;i<3;i++){
sum2+=sim[user][nearUser[i]];
}
Score=avgUserToItem(user)+sum1/sum2;
returnScore;
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
setSim();
simMax(0);
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
preScore[i][j]=predictiveScore(i,j);
}
}
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
System.out.print(preScore[i][j]+"");
}
System.out.println();
}
//平均准确度误差
doubleavePre=0;
doubletotlePre=0;
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
totlePre+=Math.abs((userScore[i][j]-preScore[i][j])/userScore[i][j]);
}
}
avePre=totlePre/64;
//平均准确度随机误差
doubleavePreR=0;
doubletotlePreR=0;
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
totlePreR+=Math.abs((userScore[i][j]-Math.random()*5)/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.1weka平台
众所周知,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.2Hadoop和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是ApacheSoftwareFoundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。
Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。
此外,通过使用ApacheHadoop库,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)
。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 科研 报告 餐饮 电子商务 个性化 推荐 系统 算法