十一 机器学习之Aprior代码实现

129 阅读2分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1. 生成候选项集

函数1:创建一个用于测试的简单数据集

import pandas as pd
import numpy as np
def loadDataSet():
    dataSet = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
    return dataSet

函数2:构建第一个候选集合C1。 由于算法一开始是从输入数据集中提取候选项集列表,所以这里需要一个特殊的函数来处理——frozenset类型。 frozenset是指被“冰冻”的集合,也就是用户不能修改他们。这里必须要用frozenset而非set类型,是因为后面我们要 将这些集合作为字典键值使用。 该函数流程是:首先创建一个空列表,用来储存所有不重复的项值。接下来遍历数据集中所有的交易记录,对每一条 交易记录,遍历记录中的每一个项。如果该项没有在C1中出现过,那么就把它添加到C1中,这里需要注意的是,并 非简单地添加物品项,而是添加只包含该物品项的一个集合(此处用集合或者列表都可以)。循环完毕后,对整个 C1进行排序并将其中每个单元素集合映射到frozenset(),最后返回frozenset的列表

def createC1(dataSet):
    C1 = [] #放置候选1项集
    for transaction in dataSet:
        #print(transaction)
        for item in transaction:
            #print(item)
            if not {item} in C1: 
                #print({item})
                C1.append({item})
                #print(C1)
    C1.sort()
    return list(map(frozenset, C1))

函数3:生成满足最小支持度的频繁项集L1。 C1是大小为1的所有候选项集的集合,Apriori算法首先构建集合C1,然后扫描数据集来判断这些只有一个元素的项集 是否满足最小支持度的要求。那些满足最低要求的项集构成集合L1

"""
函数功能:挑选满足最小支持度的项集,构成频繁项集
参数说明:
    D:原始数据集
    Ck:候选项集
    minSupport:最小支持度
"""
def scanD(D, Ck, minSupport):
    ssCnt = {}
    for tid in D:
        for can in Ck:
            if can.issubset(tid):  #判断can是否是tid的子集,返回的是布尔型数据
                ssCnt[can] = ssCnt.get(can, 0) + 1
    numItems = float(len(D))
    retList= []   
    supportData = {}        #候选集项Ck的支持度字典(key:候选项, value:支持度)
    for key in ssCnt:
        support = ssCnt[key] / numItems
        supportData[key] = support
        if support >= minSupport:
            retList.append(key)
    return retList, supportData