0

嗨,

我正在尝试使用 FP-Growth 算法使用 Spark 构建推荐篮分析

我有这些交易

val transactions = sc.parallelize(Seq(
  Array("Tuna", "Banana", "Strawberry"),
  Array("Melon", "Milk", "Bread", "Strawberry"),
  Array("Melon", "Kiwi", "Bread"),
  Array("Bread", "Banana", "Strawberry"),
  Array("Milk", "Tuna", "Tomato"),
  Array("Pepper", "Melon", "Tomato"),
  Array("Milk", "Strawberry", "Kiwi"),
  Array("Kiwi", "Banana", "Tuna"),
  Array("Pepper", "Melon")
))

现在我想要“经常项目”

import org.apache.spark.mllib.fpm.AssociationRules
import org.apache.spark.mllib.fpm.FPGrowth.FreqItemset

val freqItemsets = transactions
  .flatMap(xs => 
    (xs.combinations(1) ++ xs.combinations(2)).map(x => (x.toList, 1L))
  )
  .reduceByKey(_ + _)
  .map{case (xs, cnt) => new FreqItemset(xs.toArray, cnt)}

val ar = new AssociationRules()
  .setMinConfidence(0.4)

val results = ar.run(freqItemsets)

最后我使用关联规则来获取“规则”

results.collect().foreach { rule =>
  println("[" + rule.antecedent.mkString(",")
    + "=>"
    + rule.consequent.mkString(",") + "]," + rule.confidence)
}

到目前为止一切都还好,但是接下来我想为每笔交易提供建议……有什么简单的方法可以做到吗?因为我的scala很糟糕

在 RI 做这样的事情

baskets=function(x){
  rulesMatchLHS = is.subset(rules@lhs,x)
  suitableRules =  rulesMatchLHS & !(is.subset(rules@rhs,x))
  order.rules = sort(rules[suitableRules], by = "lift")
}

results = sapply(1:length(trans), function(x) baskets(trans[x]))

谢谢你的时间

4

1 回答 1

0

好吧,在您生成规则之后,它们将看起来像这样:lhs => rhs(置信度),或者更详细,例如:

("金枪鱼", "香蕉") => ("草莓") (信心)

现在,您将从最低置信度开始列出这些规则。在此之后,您想使用规则列表来预测某些篮子,o 新的篮子即将到来。

您将需要找到与新篮子中的项目最匹配的规则,该匹配的特定值或分数,假设一个带有 ("tuna","banana") 的新篮子将完全匹配上面的规则(匹配规则左侧),但如果匹配的项目较少,则分数应该较低,您也可以设置最低分数以触发推荐,一旦您与规则匹配,然后推荐规则的右侧项目。

我希望这很清楚,您在提供的代码上拥有执行此操作所需的一切。

于 2016-04-19T23:51:41.713 回答