1. aprior算法
aprior算法是一种寻找数据之间关联性算法。用它在大数据中可以分析出一些有趣的结论。
2. 老韩家养了鸭没
村口老王和老李在村口聊天,聊天内容讲到村里人养了哪些家禽,清单如下。
人家 | 家禽 |
---|---|
老赵 | 鸡,鸭 |
老钱 | 鸡,牛,猪,狗 |
老孙 | 牛,猪,猫,鸭 |
老李 | 鸭,鸡,牛,猪 |
老周 | 鸭,鸡,牛,猫 |
问题:住的比较远的老韩,他家养了鸡,他还会养什么呢?
老王观察到一个现象:村里大部分人养了鸡都会养鸭,于是老王说:“老韩家也会养鸭”。
上述老王的说法,可以用更为科学的aprior算法分析。
3. 概念
-
频繁项集
:经常出现在一起的两个元素的集合。例如:{鸡,鸭}就是一个频繁项集。 -
关联规则
:两个元素之间可能存在很强的关联关系。例如:养鸡和养鸭可能就存在很强的关联关系。我们记做规则:{鸡}-> {鸭} -
支持度
:一个项集的支持度被定义为数据集中包含该项集的记录所占的比例。例如:{鸡}的支持度就是 4 / 5, {鸡, 鸭}的支持度就是3 / 5。 -
置信度
: 置信度是表明抽样指标和总体指标的误差不超过一定范围的概率保证度。置信度是基于关联规则的,例如:关联规则为:{鸡}-> {鸭},那么:置信度 = {鸡,鸭} 的支持度 / {鸡} 的支持度。 (3/5) / (4/5) = 0.75。这就意味着在养鸡的家庭中75%都适用于这个规则。
4.aprior原理
上面分析后,道理大概都已经懂了。如果要在一串清单中找出各元素的关系。那么我们只需要做如下步骤:
- 找出包含所有元素的集合S。=>S = {鸡,鸭,牛,猪,狗,猫}
- 找出集合S的非空子集,非空子集个数 2^n – 1。 => s1 = {鸡}, s2 = {鸭} …, 总个数为 2^5 -1 = 31
- 计算每个子集的支持度。
- 找出频繁项集,即为支持度大的集合。
- 计算关联规则的置信度。
如果是这样计算,那么当数据量大的时候,运算量将会超级大。于是我们发现另一个有趣的结论:
如果某个项集是频繁项集,那么它所有的子集也是频繁的。即如果 {鸡,鸭} 是频繁的,那么 {鸡}, {鸭} 也一定是频繁的。
这结论用我们上面例子来讲:养{鸡,鸭}的人家多,那养{鸡}和养{鸭}的人家肯定也多。
这个结论有啥用?仔细一看确实没啥用,但是我们把它的逆否命题写出来就有用了。
如果一个集合不频繁,那么它的父集也一定不频繁。
道理很简单:养{牛}的人家少,那养{鸡,牛}的人家肯定也少。
5.aprior算法过程
看这个例子:
item |
---|
1 3 4 |
2 3 5 |
1 2 3 5 |
2 5 |
扫描出1项集:
set | sup |
---|---|
{1} | 2 |
{2} | 3 |
{3} | 3 |
{4} | 1 |
{5} | 3 |
减除 sup < 50%的项集
set | sup |
---|---|
{1} | 2 |
{2} | 3 |
{3} | 3 |
{5} | 3 |
扫描出2项集
set | sup |
---|---|
{1, 2} | 1 |
{1, 3} | 2 |
{1, 5} | 1 |
{2, 3} | 2 |
{2, 5} | 3 |
{3, 5} | 2 |
减除 sup < 50%的项集
set | sup |
---|---|
{1, 3} | 2 |
{2, 3} | 2 |
{2, 5} | 3 |
{3, 5} | 2 |
扫描出3项集
set | sup |
---|---|
{2,3,5} | 2 |
所以最终的结果为频繁3项集为{2, 3, 5}
版权声明:本文为fwx426328原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。