---
title: 推荐和模式挖掘
description: "随着信息资源规模的迅猛增长和互联网行业的飞速发展，用户在大量繁杂的信息中获得目标内容愈发困难，因此急需商家进行筛选过滤，留下有价值的信息。交替最小二乘法可以通过协同过滤对用户历史购买记录和当前商品进行比较，补全客户历史喜好。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/bds/kunpengbdssparkml_16_0006.html
sourcePath: /source/zh/kunpengboostkithistory/2200/bds/kunpengbdssparkml_16_0006.html
indexId: 9ca14550e3544c2ab7d8c2604c91756a58defc910781388c0391461b165fe24173
---
# 推荐和模式挖掘

#### 场景介绍

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

在推荐过程中，一般使用用户名、商品、喜好程度来度量，通过显式反馈对商品直接评分；隐式反馈是指从用户行为中收集到的数据，例如用户观看视频的时长，侧面反馈。通过优化矩阵分块技术，保持访存和计算的连续性，有效提升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
