2017-02-20 4 views
1

Spark 2.0.2を使用していくつかのデータからいくつかの関連ルールを抽出していましたが、結果が出たときに次のような奇妙なルールが見つかりました:Spark MLlib Associationルールの信頼度が1.0より大きい

【[MUJI,ROEM,西单科技广场] => Bauhaus ] 2.0

は「2.0」は、印刷されたルールの確信である、それは「結果的にするために先行する確率」の意味ではなく、1.0未満でなければなりませんか?

答えて

1

KEY WORD:取引= freqItemset

SOLUTIONS:!使用spark.mllib.FPGrowthではなく、それが取引のRDDを受け入れ、自動的にfreqItemsetsを計算することができます。

こんにちは、私はそれを見つけました。この現象の理由は、私の入力FreqItemsetデータfreqItemsetsが間違っているためです。詳細をみましょう。私は単にのトランザクション( "a")、( "a"、 "b"、 "c")、( "a"、 "b"、 "d")の3つのオリジナルを使用し、それらの頻度はすべて同じですここで

val freqItemsets = sc.parallelize(Seq(
    new FreqItemset(Array("a"), 1), 
    new FreqItemset(Array("a","b","d"), 1), 
    new FreqItemset(Array("a", "b","c"), 1) 
)) 

:初め

1.、私は火花が、私がする必要がある唯一のものは、(公式の例では、私たちを見る)このようfreqItemsetsを作成するために、自動計算サブアイテムセット周波数であるだろうと思いましたそれが間違いをする理由は、AssociationRulesのパラメータはトランザクションではなく、FreqItemsetであるため、私はこれらの2つの定義を間違って理解しました。

3つのトランザクションによると、freqItemsetsは

new FreqItemset(Array("a"), 3),//because "a" appears three times in three transactions 
    new FreqItemset(Array("b"), 2),//"b" appears two times 
    new FreqItemset(Array("c"), 1), 
    new FreqItemset(Array("d"), 1), 
    new FreqItemset(Array("a","b"), 2),// "a" and "b" totally appears two times 
    new FreqItemset(Array("a","c"), 1), 
    new FreqItemset(Array("a","d"), 1), 
    new FreqItemset(Array("b","d"), 1), 
    new FreqItemset(Array("b","c"), 1) 
    new FreqItemset(Array("a","b","d"), 1), 
    new FreqItemset(Array("a", "b","c"), 1) 

する必要がありますあなたはあなたの自己は、次のコード

val transactons = sc.parallelize(
Seq(
    Array("a"), 
    Array("a","b","c"), 
    Array("a","b","d") 
)) 

val freqItemsets = transactions 
.map(arr => { 
     (for (i <- 1 to arr.length) yield { 
      arr.combinations(i).toArray 
     }) 
      .toArray 
      .flatten 
     }) 
     .flatMap(l => l) 
     .map(a => (Json.toJson(a.sorted).toString(), 1)) 
     .reduceByKey(_ + _) 
     .map(m => new FreqItemset(Json.parse(m._1).as[Array[String]], m._2.toLong)) 


//then use freqItemsets like the example code 
val ar = new AssociationRules() 
    .setMinConfidence(0.8) 
val results = ar.run(freqItemsets) 
//.... 

単に我々がFPGrowthの代わりに "を使用することができますを使用して、この統計的な作業を行うことができますアソシエーションルール "は、rddのトランザクションを受け入れます。

val fpg = new FPGrowth() 
    .setMinSupport(0.2) 
    .setNumPartitions(10) 
val model = fpg.run(transactions) //transactions is defined in the previous code 

それだけです。

関連する問題