GSP算法

GSP算法
nav

第1关:候选产生

import itertools
import datetime
 

class Base(object):
    def __init__(self):
        self.queue = []


    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1


    def freq_more(self, data, freq1):
          
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:

            ####################Begin################
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置

                    #####################End################
                            
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []

第二关

import itertools
import datetime
 
class Base(object):
    def __init__(self):
        self.queue = []
    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1
    def freq_more(self, data, freq1):
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置
                    ############Begin##########
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []
                    ############End##########

第三关

import itertools
import datetime
 
class Base(object):
    def __init__(self):
        self.queue = []
    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1
    def freq_more(self, data, freq1):
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []
    # 将列表中的字母合并成字符串   # 这个函数可以省略
    def List_to_String(self, list):
        demo_string = ''
        for i in range(len(list)):
            demo_string = demo_string + list[i]
        return demo_string
    #demo_ele是待排列的字符串, times是将它们排列成几个元素
    def Combinations(self, item, times):
        demo_list = []
        combin = []
        element = ''
        for i in range(1, len(item) + 1):
            iter = itertools.combinations(item, i)
            demo_list.append(list(iter))
        demo_combin = demo_list[times - 1]
        for i in range(len(demo_combin)):
            for j in range(len(demo_combin[0])):
                element += demo_combin[i][j]
            combin.append(element)
            element = ''
        return combin
    # 判断 item 是否在 data[i][j]中
    def isIn_Item(self, item, data, i, j):
        demo_num = 0
        for k in range(len(item)):
            if item[k] in data[i][j]:
                demo_num += 1
        if demo_num == len(item):
            return 1
        else:
            return 0
    def isFreq(self, item, data):
        #############Begin#############
        # 支持度计算 
        num = 0
        if '->' not in item:  # 类似如'ABF'
            for i in range(len(data)):
                for j in range(len(data[i])):
                    if self.isIn_Item(item, data, i, j) != 0:
                        num += 1
            if num >= 2:
                return item
            else:
                return 0
        else:  # 类似如‘D->B->A’
            item0 = item.split('->')   # 将item分割成一个list
            for i in range(len(data)):
                array = 0
                j = 0
                while True:
                    if array == len(item0) or j == len(data[i]):
                        break
                    if len(item0[array]) >= 2:  # 如果类似 'BA' 形式
                        if self.isIn_Item(item0[array], data, i, j) == 1: 
                            array += 1
                            j += 1
                        else:
                            j += 1
                    else:
                        if item0[array] in data[i][j]:
                            array += 1
                            j += 1
                        else:
                            j += 1
                if array == len(item0):
                    num += 1
            if num >= 2:
                return item
            else:
                return 0
        #################End####################

第四关

import itertools
import datetime
 
class Base(object):
    def __init__(self):
        self.queue = []
    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1
    def freq_more(self, data, freq1):
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []
    # 将列表中的字母合并成字符串   # 这个函数可以省略
    def List_to_String(self, list):
        demo_string = ''
        for i in range(len(list)):
            demo_string = demo_string + list[i]
        return demo_string
    #demo_ele是待排列的字符串, times是将它们排列成几个元素
    def Combinations(self, item, times):
        demo_list = []
        combin = []
        element = ''
        for i in range(1, len(item) + 1):
            iter = itertools.combinations(item, i)
            demo_list.append(list(iter))
        demo_combin = demo_list[times - 1]
        for i in range(len(demo_combin)):
            for j in range(len(demo_combin[0])):
                element += demo_combin[i][j]
            combin.append(element)
            element = ''
        return combin
    # 判断 item 是否在 data[i][j]中
    def isIn_Item(self, item, data, i, j):
        demo_num = 0
        for k in range(len(item)):
            if item[k] in data[i][j]:
                demo_num += 1
        if demo_num == len(item):
            return 1
        else:
            return 0
    def isFreq(self, item, data):
        # 支持度计算 
        num = 0
        if '->' not in item:  # 类似如'ABF'
            for i in range(len(data)):
                for j in range(len(data[i])):
                    if self.isIn_Item(item, data, i, j) != 0:
                        num += 1
            if num >= 2:
                return item
            else:
                return 0
        else:  # 类似如‘D->B->A’
            item0 = item.split('->')   # 将item分割成一个list
            for i in range(len(data)):
                array = 0
                j = 0
                while True:
                    if array == len(item0) or j == len(data[i]):
                        break
                    if len(item0[array]) >= 2:  # 如果类似 'BA' 形式
                        if self.isIn_Item(item0[array], data, i, j) == 1: 
                            array += 1
                            j += 1
                        else:
                            j += 1
                    else:
                        if item0[array] in data[i][j]:
                            array += 1
                            j += 1
                        else:
                            j += 1
                if array == len(item0):
                    num += 1
            if num >= 2:
                return item
            else:
                return 0
        
    
    ##############Begin####################
    # 挖掘带窗口大小约束的序列模式-改进的支持度计算        
    def Make_time_queue(self, top, freq1, queue, queue_new):
        for i in range(top, len(queue_new)):
            #           for j in range(len(freq1)):
            if '->' not in queue_new[i]:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    queue.append(difference[j] + '->' +
                                 queue_new[i])  # 诸如 'D->AB'
                    queue.append(queue_new[i] + '->' +
                                 difference[j])  # 诸如 'AB->D'
            else:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    # 诸如'B->A' 扩展成 'B->A->D'
                    queue.append(queue_new[i] + '->' + difference[j])
        return queue
    ##############Begin####################  

第五关

import itertools
import datetime
 
class Base(object):
    def __init__(self):
        self.queue = []
    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1
    def freq_more(self, data, freq1):
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []
    # 将列表中的字母合并成字符串   # 这个函数可以省略
    def List_to_String(self, list):
        demo_string = ''
        for i in range(len(list)):
            demo_string = demo_string + list[i]
        return demo_string
    #demo_ele是待排列的字符串, times是将它们排列成几个元素
    def Combinations(self, item, times):
        demo_list = []
        combin = []
        element = ''
        for i in range(1, len(item) + 1):
            iter = itertools.combinations(item, i)
            demo_list.append(list(iter))
        demo_combin = demo_list[times - 1]
        for i in range(len(demo_combin)):
            for j in range(len(demo_combin[0])):
                element += demo_combin[i][j]
            combin.append(element)
            element = ''
        return combin
    # 判断 item 是否在 data[i][j]中
    def isIn_Item(self, item, data, i, j):
        demo_num = 0
        for k in range(len(item)):
            if item[k] in data[i][j]:
                demo_num += 1
        if demo_num == len(item):
            return 1
        else:
            return 0
    def isFreq(self, item, data):
        # 支持度计算 
        num = 0
        if '->' not in item:  # 类似如'ABF'
            for i in range(len(data)):
                for j in range(len(data[i])):
                    if self.isIn_Item(item, data, i, j) != 0:
                        num += 1
            if num >= 2:
                return item
            else:
                return 0
        else:  # 类似如‘D->B->A’
            item0 = item.split('->')   # 将item分割成一个list
            for i in range(len(data)):
                array = 0
                j = 0
                while True:
                    if array == len(item0) or j == len(data[i]):
                        break
                    if len(item0[array]) >= 2:  # 如果类似 'BA' 形式
                        if self.isIn_Item(item0[array], data, i, j) == 1: 
                            array += 1
                            j += 1
                        else:
                            j += 1
                    else:
                        if item0[array] in data[i][j]:
                            array += 1
                            j += 1
                        else:
                            j += 1
                if array == len(item0):
                    num += 1
            if num >= 2:
                return item
            else:
                return 0
    # 创造新的备选时间序列
    def Make_time_queue(self, top, freq1, queue, queue_new):
        for i in range(top, len(queue_new)):
            #           for j in range(len(freq1)):
            if '->' not in queue_new[i]:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    queue.append(difference[j] + '->' +
                                 queue_new[i])  # 诸如 'D->AB'
                    queue.append(queue_new[i] + '->' +
                                 difference[j])  # 诸如 'AB->D'
            else:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    # 诸如'B->A' 扩展成 'B->A->D'
                    queue.append(queue_new[i] + '->' + difference[j])
        return queue 
        
    ################Begin###############
    # 挖掘带最大跨度约束的序列模式-后处理
    def isIn_Time(self, item0, data, i, j):
        num = 0
        item0_lenth = len(item0)
        if item0_lenth == 2:
            for m in range(j + 1, len(data[i])):
                if item0[1] in data[i][m]:
                    num += 1
        else:
            if item0[item0_lenth - 2] in data[i][j]:
                for m in range(j + 1, len(data[i])):
                    if item0[item0_lenth - 1] in data[i][m]:
                        num += 1
                        break
        return num
    ################Begin###############

第六关

import itertools
import datetime
 
class Base(object):
    def __init__(self):
        self.queue = []
    def freq1(self, data, frequent_num):
        appear = ''
        freq1 = []
        appear_ele = []
        appear_ele2 = []
        for i in range(len(data)):
            appear = ''
            for j in range(len(data[i])):
                appear += data[i][j]
            appear_ele += list(set(appear))
            print(appear_ele)
        #print(appear_ele)
        appear_ele2 = list(set(appear_ele))
        print(appear_ele2)
        for item in appear_ele2:
            itmes = appear_ele.count(item)
            if itmes >= frequent_num:
                freq1.append(item)
        print('频繁1项集为:%s' % freq1)
        return freq1
    def freq_more(self, data, freq1):
        # 候选生成
        queue = []  # 所有的备选序列放在这里面
        queue_new = []  # 最终结果在这里面
        top = 0  # 这个是queue_new的队尾标号
        times = 3
        while True:
            if (queue_new == []):  # 为空则代表这是第一次遍历,python中的&&是and,||是or
                for i in range(len(freq1)):
                    for j in range(i + 1, len(freq1)):
                        item = freq1[i] + freq1[j]
                        queue.append(item)  # 枚举所有可能出现的二项 即同时出现的二项
                for i in range(len(freq1)):
                    for j in range(len(freq1)):
                        if j != i:
                            item = freq1[i] + '->' + freq1[j]
                            queue.append(item)  # 第一次遍历后全部可能出现的情况 # 枚举非同时,含有时序信息的二项
                for i in range(len(queue)):
                    freq_item = self.isFreq(queue[i], data)
                    if freq_item != 0:
                        queue_new.append(freq_item)
                queue = []  # 清空queue(备选序列)
            if (queue_new != []):  # 后几次遍历时要把所有的情况写入空的queue中
                if top == len(queue_new) - 1:  # 表示没有新加入元素,那么终止 while 循环
                    print('频繁多项集为:%s' % queue_new)
                    break
                else:
                    demo_list = []  # 专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
                    for i in range(top, len(queue_new)):
                        if '->' not in queue_new[i]:
                            demo_list.append(queue_new[i])
                    demo_string = self.List_to_String(
                        demo_list)  # 将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
                    demo_ele = "".join(set(demo_string))  # 删除串中的重复元素,输出'ABF'
                    if len(demo_ele) >= times:
                        if len(demo_ele) == times:  # 那么demo_ele是唯一的备选成员
                            queue.append(demo_ele)
                            times += 1
                        # 否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
                        else:
                            combin = self.Combinations(demo_ele, times)
                            for i in range(len(combin)):
                                queue.append(combin[i])
                            times += 1
                    ###-----####至此已经把备选频繁寻列推入 queue ####-----###
                    queue = self.Make_time_queue(top, freq1, queue, queue_new)
                    ###-----#### 至此已经把 queue 放满了备选成员 ####-----###
                    top = len(queue_new)  # 更新队尾指针 top 的位置
                    # 候选剪枝
                    ###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
                    for i in range(len(queue)):
                        freq_item = self.isFreq( 
                            queue[i], data)  # ---->> isFreq
                        if freq_item != 0:  # 如果这个成员是频繁的
                            queue_new.append(freq_item)
                    queue = []
    # 将列表中的字母合并成字符串   # 这个函数可以省略
    def List_to_String(self, list):
        demo_string = ''
        for i in range(len(list)):
            demo_string = demo_string + list[i]
        return demo_string
    #demo_ele是待排列的字符串, times是将它们排列成几个元素
    def Combinations(self, item, times):
        demo_list = []
        combin = []
        element = ''
        for i in range(1, len(item) + 1):
            iter = itertools.combinations(item, i)
            demo_list.append(list(iter))
        demo_combin = demo_list[times - 1]
        for i in range(len(demo_combin)):
            for j in range(len(demo_combin[0])):
                element += demo_combin[i][j]
            combin.append(element)
            element = ''
        return combin
    # 判断 item 是否在 data[i][j]中
    def isIn_Item(self, item, data, i, j):
        demo_num = 0
        for k in range(len(item)):
            if item[k] in data[i][j]:
                demo_num += 1
        if demo_num == len(item):
            return 1
        else:
            return 0
    def isFreq(self, item, data):
        # 支持度计算 
        num = 0
        if '->' not in item:  # 类似如'ABF'
            for i in range(len(data)):
                for j in range(len(data[i])):
                    if self.isIn_Item(item, data, i, j) != 0:
                        num += 1
            if num >= 2:
                return item
            else:
                return 0
        else:  # 类似如‘D->B->A’
            item0 = item.split('->')   # 将item分割成一个list
            for i in range(len(data)):
                array = 0
                j = 0
                while True:
                    if array == len(item0) or j == len(data[i]):
                        break
                    if len(item0[array]) >= 2:  # 如果类似 'BA' 形式
                        if self.isIn_Item(item0[array], data, i, j) == 1: 
                            array += 1
                            j += 1
                        else:
                            j += 1
                    else:
                        if item0[array] in data[i][j]:
                            array += 1
                            j += 1
                        else:
                            j += 1
                if array == len(item0):
                    num += 1
            if num >= 2:
                return item
            else:
                return 0
    # 创造新的备选时间序列
    def Make_time_queue(self, top, freq1, queue, queue_new):
        for i in range(top, len(queue_new)):
            #           for j in range(len(freq1)):
            if '->' not in queue_new[i]:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    queue.append(difference[j] + '->' +
                                 queue_new[i])  # 诸如 'D->AB'
                    queue.append(queue_new[i] + '->' +
                                 difference[j])  # 诸如 'AB->D'
            else:
                difference = self.Difference(queue_new[i], freq1)
                for j in range(len(difference)):
                    # 诸如'B->A' 扩展成 'B->A->D'
                    queue.append(queue_new[i] + '->' + difference[j])
        return queue 
        
    # 挖掘带最大跨度约束的序列模式
    def isIn_Time(self, item0, data, i, j):
        num = 0
        item0_lenth = len(item0)
        if item0_lenth == 2:
            for m in range(j + 1, len(data[i])):
                if item0[1] in data[i][m]:
                    num += 1
        else:
            if item0[item0_lenth - 2] in data[i][j]:
                for m in range(j + 1, len(data[i])):
                    if item0[item0_lenth - 1] in data[i][m]:
                        num += 1
                        break
        return num
    ################Begin###############
    # 如何挖掘带最大间隔约束的序列模式-改进的剪枝方法              
    # 寻找两个字符串中的不同字母,并提取出来
    def Difference(self, item, freq1):
        demo_list = []
        if '->' not in item:
            for i in range(len(freq1)):
                if freq1[i] not in item:
                    demo_list.append(freq1[i])
        else:
            demo_item = item.split('->')  # 将诸如'A->B'拆分成 'A','B'
            demo_item_string = self.List_to_String(demo_item)  # 合并成'AB'
            for i in range(len(freq1)):
                if freq1[i] not in demo_item_string:
                    demo_list.append(freq1[i])
        return demo_list
        ################End###############
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峰峰688

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值