新普金娱乐网址


导向滤波算法分析

明白多累,是本身任了的老三观赛尽歪的等同句话!

数学使用Apriori进行关联分析(一)

  • 十月 24, 2018
  • 数学
  • 没有评论

  大型超市有海量交易数额,我们得以经过聚类算法寻找购买相似物品的人群,从而为特定人群提供更具个性化的劳动。但是对超市来讲,更有价之是什么样寻找来商品的隐藏关联,从而打包促销,以充实营业收入。其中最为经典的案例就是是关于尿不沾和啤酒的故事。怎样在乱的数量中搜寻到数里面的影关系?当然可以动用穷举法,但代价高昂,所以待运用更智能的方式在合理时间内找到答案。Apriori就是其中的同等种关系分析算法。

  • 翻看python3的有所重要字(其中nonlocal是python3初长)

基本概念

  关联分析是同栽于大数据汇总找有趣关系的匪监督上算法。这些涉嫌可以发一定量种样式:频繁项集或者关联规则。频繁项集(frequent
item sets)是经常出现在同片的品的集,关联规则(association
rules)暗示两栽物品中或许存在异常强的关联。

  下图是一个乒乓球店的市记录,〇表示顾客买了货物。其中{底板,胶皮,浇水}就是一个再三项集;从中可以找到底板->胶皮这样的涉规则:

数学 1

支持度

  怎样有效定义频繁与涉嫌?其中最为要害的星星单概念是支持度和置信度。

  支持过(support)从字面上理解就是是永葆之程度,一个项集的支持度(support)被定义也数据汇总包含该项集的笔录所占有的百分比。上图被{底板}的支撑度=(5/6)
* 100%。

  这个概念其实经常在现实生活中出现,翻译成支持率似乎更好明,典型的例证就是投票,比如英国脱欧的支持率也51.89%。

  用数学去解释就是是,设W
中产生s%之事情同时支持物品集A和B,s%名{A,B}的支持度,即:

  support({A,B}) = num(A∪B) / W =
P(A∩B)

  num(A∪B)表示含有物品集{A,B}的事务集的个数,不是数学中之并集。

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

置信度

  置信度(confidence)揭示了A出现时B是否必然出现,如果起,则产出的几率是差不多好。如果A->B的选购信度是100%,则说明A出现常常B一定会冒出(返回来不一定)。上图备受底板共出现5潮,其中4潮而买了人力车,底板->胶皮的购信度是80%。

  用公式表示是,物品A->B的打信度=物品{A,B}的支撑度
/ 物品{A}的支持度:

  Confidence(A->B) = support({A,B})
/ support({A}) = P(B|A)

  • 反省字符串是否也要字,返回True或者False

Apriori原理

  本节摘自《机器上实战》

  假设我们以经营一家商品种并无多的商城,我们本着那些常以一块儿让买的商品非常感谢兴趣。我们只有来4种商品:商品0,商品1,商品2和商品3。那么所有可能被同台进之货品组合都起怎么样?这些商品组合或只有生一样栽商品,比如商品0,也或包括个别种、三种要具有四栽商品。我们连无体贴某人买入了零星宗商品0以及四件商品2的情状,我们特关心他置了一致栽要多种货。

  下图显示了物品之间所有可能的整合。为了吃该图再次爱掌握,图备受采用物品的编号0来代替物品0本身。另外,图被自达到望生之率先只聚众是Ф,表示空集或不含有其他物品的集结。物品集合之间的连线表明两独或又多聚集好组合形成一个再度怪之联谊。

数学 2

  前面说了,我们的靶子是找到时以同步打的物品集合。我们应用集合的支撑过来度量其冒出的频率。一个集合的支持度是靠有微微比例的交易记录包含该集。如何对一个加的集纳,比如{0,3},来计算其支持过?我们遍历毎条记录并检查该记录包含0和3,如果记录确实以涵盖这片宗,那么尽管多总计数值。在围观了所有数据后,使用统计得到的总数除以总的交易记录数,就可以博支持度。上述过程和结果就是对单个集合{0,3}。要抱每种可能集合的支持度就是待多次重复上述过程。我们可数一下达到图被的集纳数目,会发现就算对只有来4栽物品的聚合,也要遍历数据15赖。而趁物品数量的增多遍历次数会可以增长。对于富含—
物品的数据集共有2N-1种项集组合。事实上,出售10000要么另行强物品的信用社并无丢掉见。即使就售100种商品的营业所也会发出1.26×1030种可能的项集组合。对于当代底处理器而言,需要格外丰富之时间才会就运算。

  为了降低所用的算计时间,研究人员发现一律栽所谓的Apriori原理。Apriori原理可以扶持我们减少或者感兴趣之项集。Apriori原理是说如果有项集是屡的,那么它们的拥有子集也是数的。上图给来底例证,这意味着一旦{0,1}是一再的,那么{0}、{1}也必定是多次之。这个规律直观上连无什么帮助,但是如果转看就发因此了,也就是说要一个项集是非频繁集,那么它们的有所超集也是未频繁之,如下所示:

数学 3

  上图备受,已解阴影项集{2,3}是休频繁之。利用这知识,我们就是知项集{0,2,3}
,{1,2,3}以及{0,1,2,3}也是匪频繁之。这为实属,一旦计算出了{2,3}的支持度,知道它们是勿频繁之后,就不需要重新计{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因为咱们领略这些聚集不会见满足我们的求。使用该原理就是得避免项集数目的指数增长,从而以情理之中时间内计算产生累累项集。

Apriori算法过程

  关联分析的对象包括个别桩:发现反复项集和发现涉及规则。首先需要找到频繁项集,然后才能够获得关联规则。

import keyword
>>> keyword.iskeyword('as')
True
>>> keyword.iskeyword('eval')  # eval是python的内建函数
False

Apriori算法过程

数学 4

  发现反复项集的历程要达到图所示:

  1. 鉴于数据集生成候选项集C1(1表示每个候选项仅发生一个数额项);再由C1透过支撑过滤,生成频繁项集L1(1意味着每个频繁项就来一个数量项)。
  2. 以L1的数量项两简单合接成C2。
  3. 自打候选项集C2方始,通过支撑度滤生成L2。L2根据Apriori原理拼接成候选项集C3;C3经过支撑过滤生成L3……直到Lk中只发生一个还是无数据项为止。

  下面是一个杂货店的贸易记录:

数学 5

  Apriori算法发现数项集的进程如下:

数学 6  具体代码:

 1 def loadDataSet():
 2     return [[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[1,2,3]]
 3 #1.构建候选1项集C1
 4 def createC1(dataSet):
 5     C1 = []
 6     for transaction in dataSet:
 7         for item in transaction:
 8             if not [item] in C1:
 9                 C1.append([item])
10 
11     C1.sort()
12     return list(map(frozenset, C1))
13 
14 #将候选集Ck转换为频繁项集Lk
15 #D:原始数据集
16 #Cn: 候选集项Ck
17 #minSupport:支持度的最小值
18 def scanD(D, Ck, minSupport):
19     #候选集计数
20     ssCnt = {}
21     for tid in D:
22         for can in Ck:
23             if can.issubset(tid):
24                 if can not in ssCnt.keys(): ssCnt[can] = 1
25                 else: ssCnt[can] += 1
26 
27     numItems = float(len(D))
28     Lk= []     # 候选集项Cn生成的频繁项集Lk
29     supportData = {}    #候选集项Cn的支持度字典
30     #计算候选项集的支持度, supportData key:候选项, value:支持度
31     for key in ssCnt:
32         support = ssCnt[key] / numItems
33         if support >= minSupport:
34             Lk.append(key)
35         supportData[key] = support
36     return Lk, supportData
37 
38 #连接操作,将频繁Lk-1项集通过拼接转换为候选k项集
39 def aprioriGen(Lk_1, k):
40     Ck = []
41     lenLk = len(Lk_1)
42     for i in range(lenLk):
43         L1 = list(Lk_1[i])[:k - 2]
44         L1.sort()
45         for j in range(i + 1, lenLk):
46             #前k-2个项相同时,将两个集合合并
47             L2 = list(Lk_1[j])[:k - 2]
48             L2.sort()
49             if L1 == L2:
50                 Ck.append(Lk_1[i] | Lk_1[j])
51 
52     return Ck
53 
54 def apriori(dataSet, minSupport = 0.5):
55     C1 = createC1(dataSet)
56     L1, supportData = scanD(dataSet, C1, minSupport)
57     L = [L1]
58     k = 2
59     while (len(L[k-2]) > 0):
60         Lk_1 = L[k-2]
61         Ck = aprioriGen(Lk_1, k)
62         print("ck:",Ck)
63         Lk, supK = scanD(dataSet, Ck, minSupport)
64         supportData.update(supK)
65         print("lk:", Lk)
66         L.append(Lk)
67         k += 1
68 
69     return L, supportData
70 
71 dataset = loadDataSet()
72 L, supportData = apriori(dataset, minSupport=0.2)

   控制高信息:

数学 7

  代码中之scanD方法而发一下改动:

 1 def scanD(D, Ck, minSupport):
 2     #候选集计数
 3     ssCnt = {}
 4     #数据集过滤
 5     D2 = [item for item in D if len(item) >= len(Ck[0])]
 6     for tid in D2:
 7         for can in Ck:
 8             if can.issubset(tid):
 9                 if can not in ssCnt.keys(): ssCnt[can] = 1
10                 else: ssCnt[can] += 1
11     ……
12 
13     return Lk, supportData

   需要留意的凡,在上述代码的aprioriGen方法中,假定购买商品是来各个的,可以经过反复2项集{P1,P2},{P1,P3}推导出累累项{P1,P2,P3},但是不能够由此反复2项集{P3,P4},{P1,P3}推导出累累项{P1,P3,P4}。如果错过丢假设,则要修改aprioriGen的代码:

#将频繁Lk-1项集转换为候选k项集
def aprioriGen(Lk_1, k):
    Ck = []
    lenLk = len(Lk_1)
    for i in range(lenLk):
        L1 = Lk_1[i]
        for j in range(i + 1, lenLk):
            L2 = Lk_1[j]
            if len(L1 & L2) == k - 2:
                L1_2 = L1 | L2
                if L1_2 not in Ck:
                    Ck.append(L1 | L2)
    return Ck
  • python主要通过简单种植办法来执行命令:语句和表达式(函数、算数表达式),语句以要字组合命令,它可产生出口,也可以没有出口。

发觉涉嫌规则

   下篇继续。

 


  参考文献:《机器上实战》

 
作者:我是8位的

  出处:http://www.cnblogs.com/bigmonkey

  本文为攻、研究及分享为主,如得转载,请联系自己,标明作者与出处,非商业用途! 

 

 

# print语句
>>> print('hello world!')
hello world
  • 表达式没有重要字,一般由数学操作符组成的算术表达式和调用的函数组成,例如绝对值函数abs()。

>>> abs(-9)
9

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图