1. 程式人生 > >PHP實現Apriori演算法——計算置信度

PHP實現Apriori演算法——計算置信度

強規則定義
對於一個頻繁集L,找到所有的L的非空子集非空子集f,如果f -> L - f,的概率滿足最小置信度,則這是一個強規則。
如果{A,B,C,D}是一個頻繁集,則它有如下候選規則
ABC -> D, ABD -> C, ACD -> B, BCD -> A, A -> BCD, B -> ACD, C -> ABD, D -> ABC,AB -> CD, AC -> BD, AD -> BC, BC -> AD, BD -> AC, CD -> AB
從中我們可以看出:
如果L的大小|L| = k, 則一共有(2的k次方減2) 個候選關聯規則(除去 空集和全集)。
簡化計算


根據公式我們可以推匯出如下規則:
對於L = {A,B,C,D},它的子集的置信度有如下規則,
c(ABC -> D)>=c(AB -> CD) >= c(A -> BCD)
從而

圖中被紅圈標註的皆是不滿足最小置信度的規則。
演算法實現(只計算了滿足的強規則,未對演算法進行簡化)

/**
    * 計算一個項集產生的關聯規則的所有置信度
    * @param $itemset 要計算的某一項集
    * @param $lItemset 所有滿足支援度的集合
    * @param $count 該項集的支援度
    * @return
$confidence 求出滿足最小置信度的關聯陣列 */
public function confidence($itemset, $lItemset, $count){ $n = sizeof($itemset)-2; $lkItemset = $lItemset[$n]; $confidence = array(); $this->subset = array(); $this->getAllSubSet(0, $itemset);//獲得所有子集 for($i = 0; $i
< sizeof($this->subset); $i++){ $n = sizeof($this->subset[$i])-1; if($n >= 0 && $n < sizeof($itemset)-1){ $dkCountMap = self::$dCountMap[$n]; //根據大小,取出頻繁集對應的支援度 //比較取出每個子集對應的支援度,並計算出置信度 for($j = 0; $j < sizeof($lItemset[$n]); $j++){ if(!array_diff($this->subset[$i], $lItemset[$n][$j])){ $conf = $count / $dkCountMap[$j] * 1.0; if($conf >= self::$MIN_CONF){ $from = implode(",", $this->subset[$i]); $to = implode(",", array_diff($itemset, $this->subset[$i])); $confidence["$from ==> $to"] = $conf; } } } } } return $confidence; } /** * 遞迴排列組合,獲得一個項集所有子集,包括全集和空集 * @param $pos 記錄將要放入子集的位置 * @param $itemset 要計運算元集的項集 */ public $p = array(); //記錄將要放入子集的位置,每一次遞迴就有0,1兩種選擇,最後即可獲得所有選擇 public $subset = array(); public $subsetCount = 0; public function getAllSubSet($pos, $itemset){ if($pos == sizeof($itemset)){ $tmp = array(); for($i = 0; $i < sizeof($itemset); $i++){ if($this->p[$i] == 1){ array_push($tmp, $itemset[$i]); } } $count = $this->subsetCount; $this->subset[] = $tmp; $this->subsetCount++; return; } $this->p[$pos] = 0; $this->getAllSubSet($pos+1, $itemset); $this->p[$pos] = 1; $this->getAllSubSet($pos+1, $itemset); }