In [1]:
import numpy as np
import pandas as pd
In [2]:
pip list
Package                            Version            
---------------------------------- -------------------
alabaster                          0.7.12             
anaconda-client                    1.7.2              
anaconda-navigator                 1.9.12             
anaconda-project                   0.8.3              
argh                               0.26.2             
asn1crypto                         1.3.0              
astroid                            2.3.3              
astropy                            4.0                
atomicwrites                       1.3.0              
attrs                              19.3.0             
autopep8                           1.4.4              
Babel                              2.8.0              
backcall                           0.1.0              
backports.functools-lru-cache      1.6.1              
backports.shutil-get-terminal-size 1.0.0              
backports.tempfile                 1.0                
backports.weakref                  1.0.post1          
bcrypt                             3.1.7              
beautifulsoup4                     4.8.2              
bitarray                           1.2.1              
bkcharts                           0.2                
bleach                             3.1.0              
bokeh                              1.4.0              
boto                               2.49.0             
Bottleneck                         1.3.2              
certifi                            2019.11.28         
cffi                               1.14.0             
chardet                            3.0.4              
chart-studio                       1.1.0              
Click                              7.0                
cloudpickle                        1.3.0              
clyent                             1.2.2              
colorama                           0.4.3              
colorlover                         0.3.0              
comtypes                           1.1.7              
conda                              4.8.2              
conda-build                        3.18.11            
conda-package-handling             1.6.0              
conda-verify                       3.4.2              
contextlib2                        0.6.0.post1        
cryptography                       2.8                
cycler                             0.10.0             
Cython                             0.29.15            
cytoolz                            0.10.1             
dask                               2.11.0             
decorator                          4.4.1              
defusedxml                         0.6.0              
diff-match-patch                   20181111           
distributed                        2.11.0             
docutils                           0.16               
entrypoints                        0.3                
et-xmlfile                         1.0.1              
fastcache                          1.1.0              
filelock                           3.0.12             
flake8                             3.7.9              
Flask                              1.1.1              
fsspec                             0.6.2              
future                             0.18.2             
gevent                             1.4.0              
glob2                              0.7                
graphviz                           0.19               
greenlet                           0.4.15             
h5py                               2.10.0             
HeapDict                           1.0.1              
html5lib                           1.0.1              
hypothesis                         5.5.4              
idna                               2.8                
imageio                            2.6.1              
imagesize                          1.2.0              
importlib-metadata                 1.5.0              
intervaltree                       3.0.2              
ipykernel                          5.1.4              
ipython                            7.12.0             
ipython-genutils                   0.2.0              
ipywidgets                         7.5.1              
isort                              4.3.21             
itsdangerous                       1.1.0              
jdcal                              1.4.1              
jedi                               0.14.1             
Jinja2                             2.11.1             
joblib                             0.14.1             
json5                              0.9.1              
jsonschema                         3.2.0              
jupyter                            1.0.0              
jupyter-client                     5.3.4              
jupyter-console                    6.1.0              
jupyter-core                       4.6.1              
jupyterlab                         1.2.6              
jupyterlab-server                  1.0.6              
keyring                            21.1.0             
kiwisolver                         1.1.0              
lazy-object-proxy                  1.4.3              
libarchive-c                       2.8                
llvmlite                           0.31.0             
locket                             0.2.0              
lxml                               4.5.0              
MarkupSafe                         1.1.1              
matplotlib                         3.1.3              
mccabe                             0.6.1              
menuinst                           1.4.16             
mistune                            0.8.4              
mkl-fft                            1.0.15             
mkl-random                         1.1.0              
mkl-service                        2.3.0              
mlxtend                            0.19.0             
mock                               4.0.1              
more-itertools                     8.2.0              
mpmath                             1.1.0              
msgpack                            0.6.1              
multipledispatch                   0.6.0              
navigator-updater                  0.2.1              
nbconvert                          5.6.1              
nbformat                           5.0.4              
nbmerge                            0.0.4              
networkx                           2.4                
nltk                               3.4.5              
nose                               1.3.7              
notebook                           6.0.3              
numba                              0.48.0             
numexpr                            2.7.1              
numpy                              1.18.1             
numpydoc                           0.9.2              
olefile                            0.46               
openpyxl                           3.0.3              
packaging                          20.1               
pandas                             1.0.1              
pandasql                           0.7.3              
pandocfilters                      1.4.2              
paramiko                           2.7.1              
parso                              0.5.2              
partd                              1.1.0              
path                               13.1.0             
pathlib2                           2.3.5              
pathtools                          0.1.2              
patsy                              0.5.1              
pep8                               1.7.1              
pexpect                            4.8.0              
pickleshare                        0.7.5              
Pillow                             7.0.0              
pip                                20.0.2             
pkginfo                            1.5.0.1            
plotly                             5.5.0              
pluggy                             0.13.1             
ply                                3.11               
prometheus-client                  0.7.1              
prompt-toolkit                     3.0.3              
psutil                             5.6.7              
py                                 1.8.1              
pycodestyle                        2.5.0              
pycosat                            0.6.3              
pycparser                          2.19               
pycrypto                           2.6.1              
pycurl                             7.43.0.5           
pydocstyle                         4.0.1              
pyflakes                           2.1.1              
Pygments                           2.5.2              
pylint                             2.4.4              
PyNaCl                             1.3.0              
pyodbc                             4.0.0-unsupported  
pyOpenSSL                          19.1.0             
pyparsing                          2.4.6              
pyreadline                         2.1                
pyrsistent                         0.15.7             
PySocks                            1.7.1              
pytest                             5.3.5              
pytest-arraydiff                   0.3                
pytest-astropy                     0.8.0              
pytest-astropy-header              0.1.2              
pytest-doctestplus                 0.5.0              
pytest-openfiles                   0.4.0              
pytest-remotedata                  0.3.2              
python-dateutil                    2.8.1              
python-jsonrpc-server              0.3.4              
python-language-server             0.31.7             
pytz                               2019.3             
PyWavelets                         1.1.1              
pywin32                            227                
pywin32-ctypes                     0.2.0              
pywinpty                           0.5.7              
PyYAML                             5.3                
pyzmq                              18.1.1             
QDarkStyle                         2.8                
QtAwesome                          0.6.1              
qtconsole                          4.6.0              
QtPy                               1.9.0              
requests                           2.22.0             
retrying                           1.3.3              
rope                               0.16.0             
Rtree                              0.9.3              
ruamel-yaml                        0.15.87            
scikit-image                       0.16.2             
scikit-learn                       0.22.1             
scipy                              1.4.1              
seaborn                            0.10.0             
Send2Trash                         1.5.0              
setuptools                         45.2.0.post20200210
simplegeneric                      0.8.1              
singledispatch                     3.4.0.3            
six                                1.14.0             
snowballstemmer                    2.0.0              
sortedcollections                  1.1.2              
sortedcontainers                   2.1.0              
soupsieve                          1.9.5              
Sphinx                             2.4.0              
sphinxcontrib-applehelp            1.0.1              
sphinxcontrib-devhelp              1.0.1              
sphinxcontrib-htmlhelp             1.0.2              
sphinxcontrib-jsmath               1.0.1              
sphinxcontrib-qthelp               1.0.2              
sphinxcontrib-serializinghtml      1.1.3              
sphinxcontrib-websupport           1.2.0              
spyder                             4.0.1              
spyder-kernels                     1.8.1              
SQLAlchemy                         1.3.13             
statsmodels                        0.11.0             
sympy                              1.5.1              
tables                             3.6.1              
tblib                              1.6.0              
tenacity                           8.0.1              
terminado                          0.8.3              
testpath                           0.4.4              
toolz                              0.10.0             
tornado                            6.0.3              
tqdm                               4.42.1             
traitlets                          4.3.3              
ujson                              1.35               
unicodecsv                         0.14.1             
urllib3                            1.25.8             
watchdog                           0.10.2             
wcwidth                            0.1.8              
webencodings                       0.5.1              
Werkzeug                           1.0.0              
wheel                              0.34.2             
widgetsnbextension                 3.5.1              
win-inet-pton                      1.1.0              
win-unicode-console                0.5                
wincertstore                       0.2                
wrapt                              1.11.2             
xlrd                               1.2.0              
XlsxWriter                         1.2.7              
xlwings                            0.17.1             
xlwt                               1.3.0              
xmltodict                          0.12.0             
yapf                               0.28.0             
zict                               1.0.0              
zipp                               2.2.0              
Note: you may need to restart the kernel to use updated packages.
In [3]:
dataset = [['苹果','香蕉','橘子'],['榴莲','香蕉','哈密瓜'],['苹果','香蕉','榴莲','哈密瓜'],['橘子','榴莲']]
type(dataset)
dataset
Out[3]:
[['苹果', '香蕉', '橘子'],
 ['榴莲', '香蕉', '哈密瓜'],
 ['苹果', '香蕉', '榴莲', '哈密瓜'],
 ['橘子', '榴莲']]

第一步:产生频繁项集

辅助函数1:生成候选项集

In [4]:
def create_c1(dataset):
    """
    函数功能:⽣成第⼀个候选项集c1,每个项集只有1个项
    参数说明:
             dataset:list,原始数据集
    返回:
             list(map(frozenset,c1)):frozenset,候选集合c1
    """
    
    c1=[]
    for transaction in dataset:
        for item in transaction:
            if not {item} in c1:
                c1.append({item})
    c1.sort()
    return list(map(frozenset,c1))
In [5]:
create_c1(dataset)
Out[5]:
[frozenset({'苹果'}),
 frozenset({'香蕉'}),
 frozenset({'橘子'}),
 frozenset({'榴莲'}),
 frozenset({'哈密瓜'})]
In [6]:
frozenset('苹果')
Out[6]:
frozenset({'果', '苹'})

辅助函数2:⽣成满⾜最⼩⽀持度的频繁项集

In [7]:
def create_freq_transaction(dataset,ck,min_support=0.5):
    """
    函数功能:⽣成满⾜最⼩⽀持度的频繁项集
    参数说明:
        dataset:list,原始数据集
        ck:frozenset,候选项集
        min_support:float,最⼩⽀持度
    返回:
        support_data:dict,候选项集ck的⽀持度字典(key:候选项, value:⽀持度)
        freq_transaction:list,给定min_support下的ck中的频繁项集
    
    注意:如果ck中得不到频繁项集,则返回的是空list
    """
    
    sscnt = {}                                   # 存放项集及频次
    for transaction in dataset:
        for can in ck:                           # 候选项集
            if can.issubset(transaction):
                sscnt[can] = sscnt.get(can,0)+1  # 频次+1
    
    num_transactions = float(len(dataset))       # 事务总量
    freq_transaction = []                        # 频繁项集,如果ck中得不到频繁项集,则返回的是空list
    
    support_data = {}                            # 存放项集及支持度
    for key in sscnt:
        support = sscnt[key]/num_transactions
        support_data[key] = support
        if support > min_support:
            freq_transaction.append(key)         # freq_transaction为空说明频繁3项集是不存在的。
    return support_data, freq_transaction
In [8]:
c1 = create_c1(dataset)
support_data, freq_transaction = create_freq_transaction(dataset, c1, min_support=0.7)

support_data     # 项集支持度字典
freq_transaction # 频繁项集list
Out[8]:
[frozenset({'香蕉'}), frozenset({'榴莲'})]

辅助函数3:由频繁k项集⽣成k+1候选项集

In [9]:
def create_ck(freq_k_transaction):
    """
    函数功能:由频繁k项集⽣成k+1候选项集。
    参数说明:
            freq_k_transaction:list,频繁k项集
                                    这里用频繁K项集,而非k项集,体现了先验原理。即如果⼀个项集是频繁的,则它的所有⼦集⼀定也是频繁的。
                                    反之,如果⼀个项集是⾮频繁项集, 那么它的所有超集也是⾮频繁的。
    返回:
            ck:list,k+1候选项集。
                这里不是返回k+1频繁项集,即暂时没有用支持度阈值对结果过滤。
    
    # 特别重要,体现算法原理,节约计算资源。有3个关键点。
        1、不是从k候选项集生成k+1候选项集,为什么?答:因为我们的目标是频繁项集,所以非频繁项集能不计算的就不计算,以便节约计算资源。
        2、频繁k项集两两组合。为何不是k频繁项集和1-频繁项集两两组合?答:是为了节约计算资源。先验原理告诉我们,这是可行的。
        3、只保留k+1候选项集,逐步计算。
    """
    
    ck = [] # k+1候选项集
    k = len(freq_k_transaction)
    for i in range(k):
        for j in range(i+1,k):
            t1 = freq_k_transaction[i]
            t2 = freq_k_transaction[j]
            t = t1|t2
            if (not t in ck) and (len(t) == len(freq_k_transaction[0])+1):
                ck.append(t)
    return ck
In [10]:
c2 = create_ck(freq_transaction)
c2
Out[10]:
[frozenset({'榴莲', '香蕉'})]
In [11]:
support_data, freq_transaction = create_freq_transaction(dataset, c2, min_support = 0.5)

support_data     # 项集支持度字典
freq_transaction # 频繁项集list,为空说明频繁3项集是不存在的。
Out[11]:
[]
In [12]:
c3=create_ck(freq_transaction)
c3
# 为空说明频繁3项集是不存在的。
Out[12]:
[]

实际演示:主函数

In [13]:
def apriori(dataset,min_support=0.5):
    '''
    函数说明:生成大于支持度阈值下的频繁项集,以及所有候选项集及其支持度
    参数说明:
                dataset:list,原始数据事务集
                min_support:float,最⼩⽀持度
    返回:
                support_data:dict,所有候选项集ck的⽀持度字典(key:候选项, value:⽀持度)
                all_freq_transaction:list,给定min_support下的所有频繁项集
    '''
    
    c1 = create_c1(dataset)                                                                          # 生成候选项集
    support_data, freq_transaction_1 = create_freq_transaction(dataset,c1,min_support = min_support) # ⽣成满⾜最⼩⽀持度的频繁项集
    all_freq_transaction = [freq_transaction_1]
    
    k = 2                                        #初始化,辅助参数,没有实际意义
    while len(all_freq_transaction[-1])>0 :      # all_freq_transaction频繁项集 不为空 才执行while循环
        ck = create_ck(all_freq_transaction[-1]) # 由频繁k项集⽣成k+1候选项集
        support_data_k,freq_transaction_k = create_freq_transaction(dataset,ck, min_support = min_support)
        support_data.update(support_data_k)      #更新字典,批量增加
        all_freq_transaction.append(freq_transaction_k)
        k = k+1
    return support_data,all_freq_transaction
In [14]:
dataset = [['苹果','香蕉','橘子'],['榴莲','香蕉','哈密瓜'],['苹果','香蕉','榴莲','哈密瓜'],['橘子','榴莲']]
support_data, all_freq_transaction = apriori(dataset, min_support=0.5)

support_data          # 项集支持度字典
all_freq_transaction  # 频繁项集list,为空说明频繁3项集是不存在的。

# apriori(dataset, min_support=0.7)
# # #注:返回的最后一行是空集合
Out[14]:
[[frozenset({'香蕉'}), frozenset({'榴莲'})], []]

第二步:产生关联规则

辅助函数1:给定一集合,计算集合所有子集。

In [15]:
def create_subset(fromlist, tolist):
    '''
    函数功能:已知列表fromlist的所有子集,结果保存到tolist,tolist中的元素格式是冻集合。
                eg:由k个元素组成的集合,函数计算含有k-1个元素的子集。
    参数:
            fromlist:list,集合
            tolist:list,子集
    '''
    
    for i in range(len(fromlist)):
        t=[fromlist[i]]
        tt=frozenset(set(fromlist)-set(t))
        if not tt in tolist:
            tolist.append(tt)
            
            tt=list(t)
            if len(tt)>1:
                create_subset(tt,tolist)    
    return None
In [16]:
# 给定一集合,计算所有子集。
fromlist=['a','b','c','d']

tolist=[]
create_subset(fromlist, tolist)
tolist
Out[16]:
[frozenset({'b', 'c', 'd'}),
 frozenset({'a', 'c', 'd'}),
 frozenset({'a', 'b', 'd'}),
 frozenset({'a', 'b', 'c'})]

辅助函数2:给定一个频繁项集,得到它子集中所有可能的关联规则,满足置信度阈值的强关联规则保存在rulelist中。

In [17]:
def cal_conf(fre_set, h, support_data, rulelist, min_conf):
    '''
    函数功能:给定一个频繁项集,得到它子集中所有可能的关联规则,满足置信度阈值的强关联规则保存在rulelist中。
    参数说明:
                fre_set:频繁项集
                h:dict,是fre_set的所有子集集合。
                support_data:dict,项集支持度字典
                rulelist:tuple,满足置信度阈值的强关联规则元组
                min_conf:float,置信度
    提升度需大于1
    
    将辅助函数之前,先看下置信度公式
    '''
    
    for after in h:
        conf = support_data[fre_set] / support_data[fre_set-after]                            #计算以after为后项以fre_set-after为前项的置信度
        lift = support_data[fre_set] / (support_data[fre_set-after] * support_data[after])    # 提升度
        # 置信度>规定值且提升度>1
        if conf >=  min_conf and lift > 1:
            print(fre_set-after,'-->',after,'\n',
                  '前件支持度:',round(support_data[fre_set-after],3),',',                 
                  '后件支持度:',round(support_data[after],3),',',                          
                  '联合支持度(联合概率):',round(support_data[fre_set],3),',',                     
                  '置信度:',round(conf,3),',',                                                  
                  '提升度:',round(lift,3))                                                      
            rulelist.append((fre_set-after,after, round(conf,3))) #以元组形式保存
    return None

主函数

In [18]:
def create_rules(support_data, all_freq_transaction, min_conf=0.8):
    '''
    函数功能:生成给定频繁项集下的所有关联规则项。
    参数: 
            support_data:dict,项集支持度字典
            all_freq_transaction:list,频繁项集
            min_conf:float,置信度
    返回值: 
            all_rulelist:list。,满足置信度阈值的强关联规则列表
    '''
    
    all_rulelist = []
    for i in range(1, len(all_freq_transaction)):
        for fre_set in all_freq_transaction[i]:
            # 求k项集的所有非空子集,1项集,2项集,直到k-1项集,用h表示,为list类型,元素为frozenset类型
            fre_list = list(fre_set)
            all_subset = []
            create_subset(fre_list, all_subset)                                 # 给定一集合,计算集合所有子集。
            cal_conf(fre_set, all_subset, support_data, all_rulelist, min_conf) # 给定一个频繁项集,得到它子集中所有可能的关联规则,满足置信度阈值的强关联规则保存在rulelist中
            
    return all_rulelist
In [19]:
dataset = [['苹果','香蕉','橘子'],['榴莲','香蕉','哈密瓜'],['苹果','香蕉','榴莲','哈密瓜'],['橘子','榴莲']]

dataset1 = [['A','B','D'],
            ['A','C','D', 'E'],
            ['A','B','D'],
            ['B','C', 'D'],
            ['A', 'C']
           ]

support_data, all_freq_transaction = apriori(dataset1, min_support = 0.2)
print("------项集支持度字典---------")
print(support_data)
print("\n")

print("------满足条件的频繁项集---------")
print(all_freq_transaction)
print("\n")

print("------满足置信度阈值的强关联规则---------")
all_rulelist = create_rules(support_data, all_freq_transaction, min_conf=1.0)
print(all_rulelist)
------项集支持度字典---------
{frozenset({'A'}): 0.8, frozenset({'B'}): 0.6, frozenset({'D'}): 0.8, frozenset({'C'}): 0.6, frozenset({'E'}): 0.2, frozenset({'A', 'B'}): 0.4, frozenset({'A', 'D'}): 0.6, frozenset({'B', 'D'}): 0.6, frozenset({'A', 'C'}): 0.4, frozenset({'D', 'C'}): 0.4, frozenset({'B', 'C'}): 0.2, frozenset({'A', 'B', 'D'}): 0.4, frozenset({'A', 'D', 'C'}): 0.2, frozenset({'B', 'D', 'C'}): 0.2}


------满足条件的频繁项集---------
[[frozenset({'A'}), frozenset({'B'}), frozenset({'D'}), frozenset({'C'})], [frozenset({'A', 'B'}), frozenset({'A', 'D'}), frozenset({'B', 'D'}), frozenset({'A', 'C'}), frozenset({'D', 'C'})], [frozenset({'A', 'B', 'D'})], []]


------满足置信度阈值的强关联规则---------
frozenset({'B'}) --> frozenset({'D'}) 
 前件支持度: 0.6 , 后件支持度: 0.8 , 联合支持度(联合概率): 0.6 , 置信度: 1.0 , 提升度: 1.25
[(frozenset({'B'}), frozenset({'D'}), 1.0)]
In [ ]: