2017-02-20 1 views
1

Spark 2.0.2를 사용하여 일부 데이터에서 연관 규칙을 추출하는 동안 결과를 얻었을 때 다음과 같은 이상한 규칙이 있음을 발견했습니다.Spark MLlib Association 규칙 신뢰도가 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") 세 가지를 사용하고, 그것들의 빈도는 모두 같다. 여기

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이므로이 두 정의를 잘못 이해했습니다.

세 가지 거래에 따르면, 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 

그게 전부입니다.

관련 문제