Mahout 个性化推荐系统

推荐系统
面对海量的数据信息,从中快速推荐出符合用户特点、是用户感兴趣的物品

推荐算法分类
1 基于人口统计学的推荐
2 基于内容的推荐
3 基于协同过滤的推荐
4 混合推荐

基于人口统计学的推荐


截屏2020-09-08 下午11.49.12.png

基于内容的推荐


截屏2020-09-08 下午11.50.45.png

基于协同过滤的推荐(是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息)
1 基于近邻的协同过滤(基于用户、基于物品)
2 基于模型的协同过滤(奇异值分解(SVD)、潜在语义分析(LSA)、支撑向量机(SVM))

  • 1 基于用户的协同过滤(基于用户、基于物品)


    截屏2020-09-08 下午11.54.09.png
  • 2 基于物品的协同过滤


    截屏2020-09-08 下午11.55.11.png

Apache Mahout是基于Lambda架构,基于计算引擎(MapReduce/Spark/Flink?H2O)开发的机器学习和数据挖掘的分布式框架, 分布式线性代数框架,旨在快速实现自己的算法,支持多个分布式后端。


截屏2020-09-10 上午9.25.19.png

Mahout实现了常用的数据挖掘算法,包括聚类算法、回归算法、余玄相似性、分类算法、推荐过滤、频繁子项挖掘

  • 个性化推荐系统实现步骤
1 获取用户画像
2 构建数据模型
3 将原始数据映射到Mahout定义的Data Model中
    DataModel(基于内存)
    GenericBooleanPrefDataModel(基于内存)
    FileDataModel(基于文件)
    JDBCDataModel(基于数据库)
4 调优推荐组件(相似度组件、临界关系组件、推荐算法等)
5 推荐模型评估
  • 代码实现
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-core</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-integration</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-math</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-examples</artifactId>
           <version>${mahout.version}</version>
       </dependency>

1 用户相似度模型
       /**
        * LogLikelihoodSimilarity 对数似然相似度
        * TanimotoCoefficientSimilarity 谷本系数相似度
        * CityBlockSimilarity 曼哈顿距离相似度
        * SpearmanCorrelationSimilarity Spearman秩相关系数
        * UncenteredCosineSimilarity 余弦相似度
        * EuclideanDistanceSimilarity 欧几里得距离相似度
        * PearsonCorrelationSimilarity 皮尔逊相关系数相似度
        * */
   UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);

2 构建近邻对象  threshold 是相似阈值 这个数值越高  推荐精准越高  但是推荐的数据也越少 最高为 给用户设置的喜好值最高值 
       /**
        * ThresholdUserNeighborhood 对每个用户基于一定的限制,相似度限制内的所有用户为邻居
        * NearestNUserNeighborhood 对每个用户取固定数量 N 的最近邻居
        * */
   float threshold = 0f;
   UserNeighborhood neighborhood = new ThresholdUserNeighborhood(threshold, userSimilarity, dataModel);

3 构建推荐器
        /**
        * GenericUserBasedRecommender 基于用户相似度
        * GenericItemBasedRecommender 基于item相似度
        * SlopeOneRecommender 基于SlopeOne算法
        * SVDRecommender 基于支持向量机
        * KnnItemBasedRecommender 基于相似用户的实现
        * TreeClusteringRecommender 基于树形聚类的推荐算法
        * */
   UserBasedRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity);
   // 给用户4推荐10个相似数据
   List<RecommendedItem> recommend = recommender.recommend(4, 10);
   for (RecommendedItem recommendedItem : recommend) {
       System.out.println(recommendedItem);
   }
4 结果输出
      try(PrintWriter writer = new PrintWriter(resultFile)){
           for (int userID=1; userID <= model.getNumUsers(); userID++){
               List<RecommendedItem> recommendedItems = recommender.recommend(userID, 2);
               String line = userID+" : ";
               for (RecommendedItem recommendedItem: recommendedItems){
                   line += recommendedItem.getItemID()+":"+recommendedItem.getValue()+",";
               }
               if (line.endsWith(",")){
                   line = line.substring(0, line.length()-1);
               }
               writer.write(line);
               writer.write('\n');
           }
       } catch (IOException ioe){
           resultFile.delete();
           throw ioe;
       }
5 推荐模型评估
       //参数0.9表示每个用户训练集为90%,1.0代表所有的用户来参与评估
      // 0。75 预测评分为5的话,实际为 5 - 0.75
      // 结果值越小与实际值越相似
       double score = evaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
       System.out.println("均方差:"+score);
       double rmse = recommenderEvaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
       System.out.println("均方根误差:"+rmse);

截屏2020-09-06 下午11.46.59.png

相似度算法分析

欧式距离
欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离
场景:适合于特征数据量较小的情况


截屏2020-09-10 下午2.01.35.png

欧式距离相似度EuclideanDistanceSimilarity
原理:利用欧式距离d定义的相似度s,s=1 / (1+d)。
范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。

曼哈顿距离
同欧式距离相似,都是用于多维数据空间距离的测度。
两个点在标准坐标系上的绝对轴距总和
应用场景:主要应用场景,如棋盘、城市里两个点之间的距离等


截屏2020-09-10 下午1.46.52.png

截屏2020-09-10 下午1.41.45.png

曼哈顿距离CityBlockSimilarity
范围:[0,1],同欧式距离一致,值越小,说明距离值越大,相似度越大。
说明:比欧式距离计算量少,性能相对高。

余弦相似度
多维空间两点与所设定的点形成夹角的余弦值。
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
应用场景:用余弦值衡量文本相似度,常用于文本识别,比如新闻的挖掘
举例:
文本1中词语a,b分别出现100,50次,向量表示为(100,50)
文本2中词语a,b分别出现50,25次,向量表示为(50,25)
文本3中词语a,b分别出现10,0次,向量表示为(10,0)
文本4中词语a,b分别出现2,0次,向量表示为(2,0)
可以得知,1,2点向量平行(词频比例相同),
3,4点向量平行,那么是不是可以判断1,2文本更相似,3,4文本更相似呢?


截屏2020-09-10 下午1.36.26.png

截屏2020-09-10 下午3.26.11.png

余弦相似度PearsonCorrelationSimilarityUncenteredCosineSimilarity
范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

距离与余弦相似度区别:余弦相似度衡量的是维度间取值方向的一致性,注重维度之间的差异,不注重数值上的差异,而欧氏度量的正是数值上的差异性。
案例分析:如某T恤从100块降到了50块(A(100,50)),某西装从1000块降到了500块(B(1000,500)),那么T恤和西装都是降价了50%,两者的价格变动趋势一致,可以用余弦相似度衡量,即两者有很高的变化趋势相似度,但是从商品价格本身的角度来说,两者相差了好几百块的差距,欧氏距离较大,即两者有较低的价格相似度。


截屏2020-09-10 下午4.05.39.png

Pearson相关系数
是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系
这个相对于欧几里德距离要复杂一点。它的一个好处是,当两者对一件物品的评分差距较大时,并不一定两者不想近,如果他两对于其他的物品评价也有差距,但是都是正相关,那两者的相似度还是相近的。这个比欧几里德距离准确。
场景:适合于特征数据量较大的情况(效果较好)
适用于A的评价普遍高于B的评价

截屏2020-09-10 下午3.19.35.png

它是存在一条拟合线的,这条线尽量靠近所有点,结果也是求所有点和这条线的拟合程度。皮尔逊相关度评价算法首先会找出两位评论者都曾评论过的物品,然后计算两者的评分总和与平方和,并求得评分的乘积之和。最后,算法利用这些计算结果计算出皮尔逊相关度。
截屏2020-09-10 下午3.03.21.png

公式定义为: 两个连续变量(X,Y)的pearson相关性系数(Px,y)等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX,σY)。系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,接近1或者-1被称为具有强相关性。
皮尔森相关度 PearsonCorrelationSimilarity
范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。

Tanimoto 固本系数
这是一个计算交集和并集的比率的方法
度量两个集合之间的相似程度的方法。
应用场景:比较文本相似度,用于文本查重与去重;计算对象间距离,用于数据聚类等
A=[1,2,3,4] 列表长度:4
B=[1,2,7] 列表长度:3
C = A & B = [1,2] 列表长度:2
T = Nc / ( Na + Nb -Nc) = len(c) / ( len(a) + len(b) - len(c)) = 2 / (4+3-2) = 0.4
可以用户计算用户之间的相似程度,这种方法适用于:数据表示为0、1这种二值化,而非有数量大小的情况


截屏2020-09-10 下午3.27.08.png

对数似然相似度:LogLikelihoodSimilarity
原理:重叠的个数,不重叠的个数,都没有的个数
说明:处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。
对于事件A和事件B,我们考虑两个事件发生的次数,具有如下矩阵


截屏2020-09-10 下午4.10.46.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271