<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond Search &#187; apriori</title>
	<atom:link href="http://www.guwendong.com/post/tag/apriori/feed" rel="self" type="application/rss+xml" />
	<link>http://www.guwendong.com</link>
	<description>最好走的路越走越难，最难走的路越走越容易</description>
	<lastBuildDate>Wed, 11 Aug 2010 16:43:41 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>推荐系统：关联规则(2)</title>
		<link>http://www.guwendong.com/post/2007/apriori_algorithm.html</link>
		<comments>http://www.guwendong.com/post/2007/apriori_algorithm.html#comments</comments>
		<pubDate>Tue, 10 Jul 2007 18:50:05 +0000</pubDate>
		<dc:creator>guwendong</dc:creator>
				<category><![CDATA[推荐系统]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[apriori]]></category>
		<category><![CDATA[association-rule]]></category>

		<guid isPermaLink="false">http://www.guwendong.com/post/2007/apriori_algorithm.html</guid>
		<description><![CDATA[Apriori Algorithm 是关联规则领域里最具影响力的基础算法。它是由 Rakesh Agrawal 在 1994 年提出的，详细的介绍在这里《Fast Algorithms for Mining Association Rules》。十几年过去了，不少学者围绕着 Apriori 进行了诸多改良。但与 1994 年相比，目前基于互联网的应用，数据量大了几十倍甚至是几百倍，因此，基于 Apriori 的算法逐渐暴露出其运算成本过高的问题。但不管怎样，对于大师及其做出的贡献，我们也只有高山仰止的份儿。
Apriori 是一种广度优先算法，通过多次扫描数据库来获取支持度大于最小支持度的频繁项集。它的理论基础是频繁项集的两个单调性原则：频繁项集的任一子集一定是频繁的；非频繁项集的任一超集一定是非频繁的。晦涩的理论我这里就不多写了，有兴趣的可以去看论文。我把里面的例子给翻译一下，图文并茂，简明易懂。某数据库 DB 里有 4 条事务记录，取最小支持度（min support）为 0.5，则计算频繁项集的过程如下：








               TID               [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Apriori_algorithm" title="Apriori Algorithm">Apriori Algorithm</a> 是关联规则领域里最具影响力的基础算法。它是由 <a href="http://rakesh.agrawal-family.com/" title="Rakesh Agrawal">Rakesh Agrawal</a> 在 1994 年提出的，详细的介绍在这里《<a href="http://rakesh.agrawal-family.com/papers/vldb94apriori.pdf" title="Fast Algorithms for Mining Association Rules">Fast Algorithms for Mining Association Rules</a>》。十几年过去了，不少学者围绕着 Apriori 进行了诸多改良。但与 1994 年相比，目前基于互联网的应用，数据量大了几十倍甚至是几百倍，因此，基于 Apriori 的算法逐渐暴露出其运算成本过高的问题。但不管怎样，对于大师及其做出的贡献，我们也只有高山仰止的份儿。</p>
<p>Apriori 是一种广度优先算法，通过多次扫描数据库来获取支持度大于最小支持度的频繁项集。它的理论基础是频繁项集的两个单调性原则：频繁项集的任一子集一定是频繁的；非频繁项集的任一超集一定是非频繁的。晦涩的理论我这里就不多写了，有兴趣的可以去看论文。我把里面的例子给翻译一下，图文并茂，简明易懂。<br />某数据库 DB 里有 4 条事务记录，取最小支持度（min support）为 0.5，则计算频繁项集的过程如下：<br />
<table width="90%" cellspacing="0" cellpadding="3" border="0" align="center">
<tbody>
<tr>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               TID                        </td>
<td width="50%" style="font-weight:bold">               Items                        </td>
</tr>
<tr>
<td width="50%">               100                        </td>
<td width="50%">               A, C, D                        </td>
</tr>
<tr>
<td width="50%">               200                        </td>
<td width="50%">               B, C, E                        </td>
</tr>
<tr>
<td width="50%">               300                        </td>
<td width="50%">               A, B, C, E                        </td>
</tr>
<tr>
<td width="50%">               400                        </td>
<td width="50%">               B, E                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       扫描DB            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {A}                        </td>
<td width="50%">               2 (0.5)                        </td>
</tr>
<tr>
<td width="50%">               {B}                        </td>
<td width="50%">               3 (0.75)                        </td>
</tr>
<tr>
<td width="50%">               {C}                        </td>
<td width="50%">               3 (0.75)                        </td>
</tr>
<tr>
<td width="50%">               {D}                        </td>
<td width="50%">               1 (0.25)                        </td>
</tr>
<tr>
<td width="50%">               {E}                        </td>
<td width="50%">               3 (0.75)                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       取满足<br />            最小支持度<br />            项集            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {A}                        </td>
<td width="50%">               2                        </td>
</tr>
<tr>
<td width="50%">               {B}                        </td>
<td width="50%">               3                        </td>
</tr>
<tr>
<td width="50%">               {C}                        </td>
<td width="50%">               3                        </td>
</tr>
<tr>
<td width="50%">               {E}                        </td>
<td width="50%">               3                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
</tr>
<tr>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
</tr>
<tr>
<td width="50%">               {A, B}                        </td>
</tr>
<tr>
<td width="50%">               {A, C}                        </td>
</tr>
<tr>
<td width="50%">               {A, E}                        </td>
</tr>
<tr>
<td width="50%">               {B, C}                        </td>
</tr>
<tr>
<td valign="top">               {B, E}                        </td>
</tr>
<tr>
<td valign="top">               {C, E}                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       扫描DB            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {A, B}                        </td>
<td width="50%">               1 (0.25)                        </td>
</tr>
<tr>
<td width="50%">               {A, C}                        </td>
<td width="50%">               2 (0.5)                        </td>
</tr>
<tr>
<td width="50%">               {A, E}                        </td>
<td width="50%">               1 (0.25)                        </td>
</tr>
<tr>
<td width="50%">               {B, C}                        </td>
<td width="50%">               2 (0.5)                        </td>
</tr>
<tr>
<td width="50%">               {B, E}                        </td>
<td width="50%">               3 (0.75)                        </td>
</tr>
<tr>
<td valign="top">               {C, E}                        </td>
<td valign="top">               2 (0.5)                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       取满足<br />            最小支持度<br />            项集            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {A, C}                        </td>
<td width="50%">               2                        </td>
</tr>
<tr>
<td width="50%">               {B, C}                        </td>
<td width="50%">               2                        </td>
</tr>
<tr>
<td width="50%">               {B, E}                        </td>
<td width="50%">               3                        </td>
</tr>
<tr>
<td width="50%">               {C, E}                        </td>
<td width="50%">               2                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
</tr>
<tr>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
</tr>
<tr>
<td width="50%">               {A, B, C}                        </td>
</tr>
<tr>
<td valign="top">               {A, B, E}                        </td>
</tr>
<tr>
<td valign="top">               {A, C, E}                        </td>
</tr>
<tr>
<td valign="top">               {B, C, E}                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       扫描DB            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {A, B, C}                        </td>
<td width="50%">               1 (0.25)                        </td>
</tr>
<tr>
<td width="50%">               {A, B, E}                        </td>
<td width="50%">               1 (0.25)                        </td>
</tr>
<tr>
<td width="50%">               {A, C, E}                        </td>
<td width="50%">               1 (0.35)                        </td>
</tr>
<tr>
<td width="50%">               {B, C, E}                        </td>
<td width="50%">               2 (0.5)                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
<td style="text-align:center">       取满足<br />            最小支持度<br />            项集            </td>
<td>
<div>
<table width="100%" cellspacing="0" cellpadding="3" border="1">
<tbody>
<tr>
<td width="50%" style="font-weight:bold">               Itemset                        </td>
<td width="50%" style="font-weight:bold">               Support                        </td>
</tr>
<tr>
<td width="50%">               {B, C, E}                        </td>
<td width="50%">               2 (0.5)                        </td>
</tr>
</tbody>
</table></div>
<p>            </td>
</tr>
</tbody>
</table>
<p>如上可以看出，在海量数据的情况下，Apriori 算法的运算过程有 2 个问题：
<ol>
<li>     需要多次扫描数据库，时间成本很高；   </li>
<li>     运算过程中需要产生大量的候选集，空间成本也非常高。   </li>
</ol>
<p>针对 Apriori 算法所做的<a href="http://www.google.com/search?complete=1&amp;hl=zh-CN&amp;q=improved+apriori&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;meta=" title="google 上的 Apriori 算法改进">改进</a>也基本上是围绕着解决这两个问题进行的，如在扫描DB前首先进行以便事务合并和压缩，数据分区或抽样等。</p>
<p><a href="http://www.cs.waikato.ac.nz/%7Eml/weka/" title="an open-source BI project">Weka</a> 里有 Apriori 算法的 Java 实现，非常值得一看。</p>
<p>貌似 <a href="http://en.wikipedia.org/wiki/Main_Page" title="wikipedia">wikipedia</a> 已经解封了，呵呵！</p>
<p>预报：关联规则(3)，关于 FP-Growth 算法。</p>
<hr id="rss-footer" />
<small>© guwendong for <a href="http://www.guwendong.com">Beyond Search</a>, 2007.<br/>
本文网址：<a href="http://www.guwendong.com/post/2007/apriori_algorithm.html">http://www.guwendong.com/post/2007/apriori_algorithm.html</a><br/>
tags: <a href="http://www.guwendong.com/post/tag/algorithm" rel="tag">algorithm</a>, <a href="http://www.guwendong.com/post/tag/apriori" rel="tag">apriori</a>, <a href="http://www.guwendong.com/post/tag/association-rule" rel="tag">association-rule</a> | <a href="http://www.guwendong.com/post/2007/apriori_algorithm.html#comments">参与讨论</a>
</small><br>]]></content:encoded>
			<wfw:commentRss>http://www.guwendong.com/post/2007/apriori_algorithm.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
