2017-02-20 6 views
1

Я использовал Spark 2.0.2 для извлечения некоторых правил ассоциации из некоторых данных, в то время как когда я получаю результат, я обнаружил, что у меня есть некоторые странные правила, например следующие:. Правила доверия Spark MLlib больше 1.0

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

«2,0» является доверие правила распечатаны, не так ли смысл «вероятности предпосылки к следствию» и должно быть меньше, чем 1,0?

ответ

1

KEY WORD: сделки = freqItemset

РЕШЕНИЯ: Используйте spark.mllib.FPGrowth вместо этого, он принимает RDD сделок и может автоматически рассчитать freqItemsets.

Здравствуйте, я нашел его. Причиной этого явления является то, что мои данные FreqItemset ввода freqItemsets неверны. Давайте подробно обсудим. Я просто использую три оригинала: транзакции («a»), («a», «b», «c»), («a», «b», «d»), их частота одинакова 1.

в начале, я думал, что искра будет автоматически высчитывает к югу от НИКАКИХ гарантий частоты, единственное, что мне нужно сделать, это создать freqItemsets, как это (официальный пример показывает нам):

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

Здесь причина, по которой она совершает ошибки, параметрами AssociationRules являются FreqItemset, а не транзакции , поэтому я неправильно понял эти два определения.

В соответствии с тремя сделок, то 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 вместо " AssociationRules ", он принимает rdd транзакций.

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

Это все.

Смежные вопросы