Apriori算法实现

重新用Python实现了Apriori,也算是对老师当初说“老师,我一定会重新再写一下的”的完成吧😂
对于Aprior的基本介绍,事务,项集等等,我就不详细说了,网上很多,这里推荐一个 数据挖掘与Aprior,讲的很详细。

这里给一个数据集
链接: https://pan.baidu.com/s/13k8cAo6czlBTRMzX8Ml5xg 提取码: 8wun (这个链接经提醒已经挂了)
链接: https://pan.baidu.com/s/1AeYRoyvfCb5FRCdhduMO-A 提取码: 9ysz
PPT
链接: https://pan.baidu.com/s/1erls8n4kVCucqlqeQwcmsg 提取码: ktwx

  1. 算法步骤:


    image.png
  2. 主要说一下网上都没有说的问题:
    为什么Aprior要假定Lk-1为按顺序排列?
    到底是哪些东西,按照什么顺序排列?


    image.png
image.png

如上图中红色框住的,是一个项集,排序就是排他内部项目的序号,2,5。所谓的排序指的是,一个项集中的项目item,按照自定的顺序排序,当然,排序规则你自己定,但是为了方便我们一般就按本身的sort()函数来排序
为什么要 排序 呢?
这是因为 当你 连接步 的时候,你要判断两个项集前 k-1 项是相同的,然后才能 生成Cn(详见PPT),这个有序其实就是为了简化 操作,你不必找出二者不同的那个 项目在哪里,因为他只可能在末尾。

  1. 数据结构 map(frozenset, int) ,
    frozenset 是因为map不允许把set当作key值,因为set由增删功能,会改变key。
  2. 源代码
def getData():
    f = open("./dataMining/retail.dat")
    data = f.readlines()
    ls = []
    for line in data:
        line = line.replace("\n","")
        line = line[:-1]
        ls.append(list(line.split(' ')))
    f.close()
    return ls

def genK1(database, support):
    k = {}
    k1 = {}
    for row in database:
        for col in row:
            k[col] = k.get(col, 0) + 1
    for key in k.keys():
        if k[key] >= support:
            s = set()
            s.add(key)
            ss = frozenset(s)
            k1[ss] = k[key]
    return k1

def showKn(kn, n):
    print('k' + str(n) + ':')
    print('count is ' + str(len(kn)))
    for s in kn.keys():
        l = list(s)
        l.sort()
        print("({}, {})".format(l, kn.get(s)))

def selfJoin(km):
    cn = {}
    for s1 in km.keys():
        ls1 = list(s1)
        ls1.sort()
        if len(ls1) == 1:
            s1sub = set()
        else:
            s1sub = set(ls1[:-1])
        for s2 in km.keys():
            if s2 != s1:
                ls2 = list(s2)
                ls2.sort()
                if len(ls2) == 1:
                    s2sub = set()
                else:
                    s2sub = set(ls2[:-1])
                if s1sub == s2sub:
                    l = ls1.copy()
                    l.append(ls2[-1])
                    l.sort()
                    # s = set(l)
                    ss = frozenset(l)
                    cn[ss] = 0
    return cn


def cut(cn, km):
    #km是 n-1位的频繁项,cn是预备项
    cnCutted = cn.copy()
    for s in cn.keys():
        s1 = set(s)
        for i in s1:
            s2 = s1.copy()
            s2.remove(i)
            s2 = frozenset(s2)
            if s2 not in km:
                # if s in cnCutted.keys():
                #     del cnCutted[s]
                #当一个s 由于他的子序列 不是频繁的而被删除时,
                #应当break,他已经完成了  删除了 ,或者增加判断语句
                del cnCutted[s]     
                break
    return cnCutted

def genCn(km, n):
    cn = selfJoin(km)
    # showKn(cn, n)  剪枝前
    cnCutted = cut(cn, km)
    # showKn(cnCutted, n)  剪枝后
    return cnCutted

def getItemsCount(t, database):
    #遍历数据库
    t = set(t)
    count = 0
    for row in database:
        flag = 1
        for item in t:
            if item not in row:
                flag = 0
                break
        if flag == 1:
            count = count + 1
    return count

def getKnNext(cnNext, database, support):
    knNext1 = {}
    knNext = {}
    for t in cnNext.keys():
        tCount = getItemsCount(t, database)
        knNext1[t] = tCount
    for i in knNext1.keys():
        if knNext1[i] >= support:
            knNext[i] = knNext1[i]
    return knNext

def main():
    support = 88162*0.02
    database = getData()
    k1 = genK1(database, support)
    kn = k1
    n = 1
    while len(kn) != 0:
        showKn(kn, n)
        n = n + 1
        cnNext = genCn(kn, n)
        kn = getKnNext(cnNext, database, support)


main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 基本概念 这周数据挖掘课上老师介绍了一种基础的数据挖掘算法——频繁项集挖掘算法。这种算法用一句话来总结就是要在数据...
    光的文明阅读 5,766评论 0 0
  • 小伙伴们,继续一起学习机器学习算法啦,今天学习关联分析、Apriori算法啦!大家肯定很熟悉一个故事-沃尔玛超市数...
    keepStriving阅读 9,315评论 2 15
  • 作者:李佳卉 有衣衫褴褛的乞丐向你乞 讨,你给还是不给?在路上看到 老人摔倒,你扶还是不扶?大街 上有人焦急的找你...
    忄and怡阅读 153评论 0 0
  • 我们相差三岁,你各方面都很优秀,很努力。我们有着相同的梦想,互相给予对方情感的需求。可我终究知道,我们很难有更久的...
    本体阅读 144评论 0 1