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
Это все.