0

我正在尝试通过 Apriori 算法从 XML 文档中挖掘关联规则。这样做有两种通用方法:1) 将 XML 映射到关系格式并应用经典 Apriori,2) 直接挖掘 XML。我想使用后者,但有几个问题。

经过研究,我发现了两个不完整的解决方案:

SO中的这篇文章提供了生成k-itemset的解决方案

本文提出用XQuery模拟Apriori(提供的代码不完整)

请让我知道您对如何做到这一点的想法和建议(对于这两种方法)?

更新:

根据上述论文的另一个版本,数据集是这样的:

<transactions>
<transaction id="1">
 <items>
<item>a</item> 
<item>d</item>
<item>e</item>
 </items>
</transaction>

<transaction id="2">
 <items>
<item>b</item> 
<item>c</item>
<item>d</item>
 </items>
</transaction>

<transaction id="3">
 <items>
<item>a</item> 
<item>c</item>
 </items>
</transaction>

<transaction id="4">
 <items>
<item>b</item> 
<item>c</item>
<item>d</item>
 </items>
</transaction>

<transaction id="5">
 <items>
<item>a</item> 
<item>b</item>
 </items>
</transaction>

</transactions>

那么,函数如下

define function join(element $X, element $Y) returns element {
let $items := (for $item in $Y
where every $i in $X satisfies
$i != $item
return $item)
return $X union $items
}

define function commonIts(element $X, element $Y) returns
element {
for $item in $X
where some $i in $Y satisfies $i = $item
return $item
}

define function removeIts(element $X, element $Y) returns
element {
for $item in $X
where every $i in $Y satisfies $i != $item
return $item
}

define function candidateGen(element $l) returns element {
for $freqSet1 in $l
let $items1 := $freqSet1//items/*
for $freqSet2 in $l
let $items2 := $freqSet2//items/*
where $freqSet2 >> $freqSet1 and
count($items1)+1 =  count($items1 union $items2)
and prune(join($items1,$items2), $l)
return <items>
{join($items1,$items2)}
</items>
}

define function prune(element $X, element $Y) returns boolean
{
every $item in $X satisfies
some $items in $Y//items satisfies
count(commonIts(removeIts($X,$item),$items/*))
= count($X) - 1
}

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

define function getLargeItemsets(element $C, element $minsup,
element $total, element $src) returns 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>
}

define function apriori(element $l, element $L, element $minsup,
element $total, element $src) returns element {
let $C := removeDuplicate(candidateGen($l))
let $l := getLargeItemsets($C, $minsup, $total, $src)
let $L := $l union $L
return if (empty($l)) then
$L
else
apriori($l, $L, $minsup, $total, $src)
}

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

为了计算规则文档,他们引入了这个表达式:

let $minconf := 1.00
let $src := document(“/large.xml”)//largeItemset
for $itemset1 in $src
let $items1 := $itemset1/items/*
for $itemset2 in $src
let $items2 := $itemset2/items/*
where count($items1) > count($items2) and
count(commonIts($items1, $items2)) =
count($items2) and $itemset1/support div
$itemset2/support >= $minconf
return <rule support =“{$itemset1/support}”
confidence = “{($itemset1/support*1.0) div
($itemset2/support*1.0)}”&gt;
<antecedent> {$items2} </antecedent>
<consequent>
{removeItems($items1,$items2)}
</consequent>
</rule>

现在,对我来说最大的挑战是将这些功能集成在一起工作。

4

1 回答 1

0

第一种方法会快很多。只需将数据预处理一次(处理 XML 的成本非常高),将其转换为非常适合您的算法的输入格式!

关于查找源代码的问题在这里是题外话。尝试解决问题,返回涉及您编写的代码的具体问题,并尝试以简洁的格式呈现它们,以便能够以独立的 QA 风格很好地回答它们。

另请注意,上述使用 Xquery 实现 Apriori 的尝试缺少一些构成Apriori 算法贡献的基本优化。对于一个真正可用的 Apriori 实现,您需要使用优化的数据结构,而您无法在 XQuery 中实现这一点。尝试在一些经典数据集上运行这个实现,它就会死掉。让 Apriori 规模化已经够难了,但用 XQuery 来做这件事是疯狂之路——一个关键的挑战是保持低内存使用率,即使在 C 中也是如此!

于 2015-01-13T07:09:43.733 回答