鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

推荐和模式挖掘

场景介绍

随着信息资源规模的迅猛增长和互联网行业的飞速发展,用户在大量繁杂的信息中获得目标内容愈发困难,因此急需商家进行筛选过滤,留下有价值的信息。交替最小二乘法可以通过协同过滤对用户历史购买记录和当前商品进行比较,补全客户历史喜好。

在推荐过程中,一般使用用户名、商品、喜好程度来度量,通过显式反馈对商品直接评分;隐式反馈是指从用户行为中收集到的数据,例如用户观看视频的时长,侧面反馈。通过优化矩阵分块技术,保持访存和计算的连续性,有效提升Cache命中率,降低时延。通过实际测试,ALS、SimRank等算法在同等精度下,性能提升50%以上。

算法原理

  • ALS算法

    ALS(Alternating Least Squares,交替最小二乘法)特指使用交替最小二乘求解的一个协同推荐算法。

  • SimRank算法

    SimRank是一种相似性度量,适用于任何具有对象到对象关系的领域,基于对象与其他对象的关系度量对象之间的相似性。SimRank相似度通过迭代求解SimRank等式得到。

  • PrefixSpan算法

    PrefixSpan(Prefix-Projected Pattern Growth,前缀投影的模式挖掘)算法是频繁模式挖掘中的典型算法,用于挖掘满足最小支持度的频繁序列。PrefixSpan算法由于不用产生候选序列,且投影数据库缩小的很快,内存消耗比较稳定,作频繁序列模式挖掘的时候效果很高。

编程实例

本示例以PrefixSpan算法来介绍编程示例。

PrefixSpan为MLlib API

模型接口类别

函数接口

MLlib API

def run[Item, Itemset <: Iterable[Item], Sequence <: Iterable[Itemset]](data: JavaRDD[Sequence]): PrefixSpanModel[Item]

def run[Item](data: RDD[Array[Array[Item]]])(implicit arg0: ClassTag[Item]): PrefixSpanModel[Item]

PrefixSpan算法时序图如图1所示。

图1 PrefixSpan算法时序图
  • 功能描述

    传入RDD格式的序列数据,设置最小支持度和最大模式长度,调用run接口,输出满足条件的全部频繁序列。

  • 输入输出
    1. 包名package org.apache.spark.mllib.fpm
    2. 类名:PrefixSpan
    3. 方法名:run
    4. 输入:JavaRDD[Sequence] / RDD[Array[Array[Item]]],全量的序列数据
    5. 基于原生算法优化的参数
      MaxLocalProjDBSize //Prefix本地求解所允许的最大投影数据量
      MaxPatternLength //频繁序列模式的最大长度
      MinSupport //频繁序列模式的最小支持度
    6. 新增算法参数

      参数名称

      spark conf参数名

      参数含义

      取值类型

      localTimeout

      spark.boostkit.ml.ps.localTimeout

      本地求解的超时时间,单位是秒。

      Int,缺省值为300,必须大于等于0。

      filterCandidates

      spark.boostkit.ml.ps.filterCandidates

      是否过滤prefix候选集。

      Boolean,缺省值为false。

      projDBStep

      spark.boostkit.ml.ps.projDBStep

      进阶参数,通常保持缺省值即可;投影数据量的调整步调。

      Double,缺省值为10。

      参数及run代码接口示例:

      1
      2
      3
      4
      5
      val prefixSpan = new PrefixSpan()
              .setMinSupport(params.minSupport)
              .setMaxPatternLength(params.maxPatternLength)
              .setMaxLocalProjDBSize(params.maxLocalProjDBSize)
      val model = prefixSpan.run(sequences)
      
    7. 输出:PrefixSpanModel[Item],频繁序列模型
  • 使用样例
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    import org.apache.spark.mllib.fpm.PrefixSpan
     
    val sequences = sc.parallelize(Seq(
      Array(Array(1, 2), Array(3)),
      Array(Array(1), Array(3, 2), Array(1, 2)),
      Array(Array(1, 2), Array(5)),
      Array(Array(6))
    ), 2).cache()
    val prefixSpan = new PrefixSpan()
      .setMinSupport(0.5)
      .setMaxPatternLength(5)
    val model = prefixSpan.run(sequences)
    model.freqSequences.collect().foreach { freqSequence =>
      println(
        s"${freqSequence.sequence.map(_.mkString("[", ", ", "]")).mkString("[", ", ", "]")}," +
          s" ${freqSequence.freq}")
    }
    
  • 结果样例
    1
    2
    3
    4
    5
    [[2]], 3
    [[3]], 2
    [[1]], 3
    [[2, 1]], 3
    [[1], [3]], 2