PDA

View Full Version : سوال: پیاده سازی الگوریتم apriori با استفاده از XQuery



Alex_1882
سه شنبه 05 اردیبهشت 1391, 07:53 صبح
با سلام
من می خواستم الگوریتم apriori با استفاده از Xquery
پیاده سازی کنم.
حتی نمونه کد هم پیدا کردم اما خروجی مورد نظر به من نمی دهد
لطفا اگر کسی آشنایی کامل دارد راهنمایی کند.
با تشکر


xquery version "1.0";
declare namespace local = "http://www.w3.org/2003/11/xpath-local-functions";

declare function local:join($X as element()*, $Y as element()*) as element()* {
let $items :=
(for $item in $Y
where every $i in $X satisfies
$i != $item
return $item)
return $X union $items
};

declare function local:commonIts($X as element()*, $Y as element()*) as element()* {
for $item in $X
where some $i in $Y satisfies $i = $item
return $item
};

declare function local:removeIts($X as element()*, $Y as element()*) as element()* {
for $item in $X
where every $i in $Y satisfies $i != $item
return $item
};

declare function local:candidateGen($l as element()* ) as element()* {
for $freqSet1 in $l
let $items1 := $freqSet1//item
for $freqSet2 in $l
let $items2 := $freqSet2//item
where $freqSet2 >> $freqSet1 and
count($items1)+ 1 = count($items1 union $items2) and
local:prune(local:join($items1,$items2), $l)

return <items>{local:join($items1,$items2)}</items>
};

declare function local:prune($X as element()*, $Y as element()*) as xs:boolean
{
every $item in $X satisfies
some $items in $Y//items satisfies
count(local:commonIts(local:removeIts($X,$item),$i tems/*))
= count($X) - 1
};

declare function local:removeDuplicate($C as element()*)
{
for $itemset1 in $C
let $items1 := $itemset1/*
let $items :=(for $itemset2 in $C
let $items2 := $itemset2/*
where $itemset2>>$itemset1 and
count($items1) =
count(local:commonIts($items1, $items2))
return $items2)
where count($items) = 0
return $itemset1
};

declare function local:getLargeItemsets($C as element()*, $minsup as xs:decimal, $total as xs:decimal, $src as element()*) as element()*
{
for $items in $C
let $trans := (for $tran in $src
where every $item1 in $items/* satisfies
some $item2 in $tran/*
satisfies $item1 = $item2
return $tran)
let $sup := (count($trans) * 1.00) div $total
where $sup >= $minsup
return
<largeItemset>
{$items}<support> {$sup} </support>
</largeItemset>
};

declare function local:apriori($l as element()*, $L as element()*, $minsup as xs:decimal, $total as xs:decimal, $src as element()*, $i) as element()*
{
let $Ck := local:candidateGen($l)
let $R := local:removeDuplicate($Ck)
let $Lk := local:getLargeItemsets($R, $minsup, $total, $src)
let $L := $Lk union $L
return if (empty($Lk)) then
$L
else
local:apriori($Lk, $L, $minsup, $total, $src, ($i - 1))
};
<largeItemsets>
{

let $src := doc("d5.xml")//items
let $minsup := 0.4
let $total := count($src) * 1.00
let $C := distinct-values($src/*)
let $K := count($C)
let $l := (for $itemset in $C
let $items := (for $item in $src/*
where $itemset = $item
return $item)
let $sup := (count($items)*1.00) div $total
where $sup >= $minsup
return <largeItemset>
<items><item>{$itemset}</item></items>
<support>{$sup}</support>
</largeItemset>)
let $L := $l
return local:apriori($l, $L,$minsup, $total, $src, $K)
}
</largeItemsets>