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)
}

今まではすべてOKでしたが、次は取引ごとに推奨事項を述べたいと思います...それを行う簡単な方法はありますか? 私の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 (信頼度)、またはより詳細には、たとえば:

("まぐろ", "バナナ") => ("いちご") (確信)

これで、最小信頼度から始まるこれらのルールのリストが作成されます。この後、ルールのリストを使用して、特定のバスケット (新しいバスケットが来る) を予測します。

新しいバスケットのアイテムに最もよく一致するルール、特定の値またはその一致のスコアを見つける必要があります。たとえば、("tuna","banana") を含む新しいバスケットが上記のルールに完全に一致するとします (matchただし、一致する項目が少ない場合はスコアを低くする必要があります。最小スコアを設定して推奨をトリガーすることもできます。ルールに一致すると、ルールの右側の項目が推奨されます。

これが明確であることを願っています。提供したコードでそれを行うために必要なものはすべて揃っています。

于 2016-04-19T23:51:41.713 に答える