作业代码(交作业用)

作业代码(交作业用)

楼主彩笔
Apriori,使用校内数据集
from sklearn.preprocessing import LabelEncoder
import dm2022exp
from typing import List, Tuple, Union
import copy
import numpy as np

class Apriori():
    encode = None
    freq_set = {}

    def encoder(self, data):
        self.encode = LabelEncoder()
        label_list = []
        for i in data:
            label_list += i
        self.encode.fit(label_list)
        return [set(self.encode.transform(i)) for i in data]

    def __init__(self,min_sup: float = 0.2):
        """
        Parameters:
            - min_sup : 最小支持度
        """
        self.min_sup = min_sup
        self.ans = []
        self.len_of_data = 0

    def fit(self, X: List[List[str]]) -> List[Union[Tuple[frozenset, float], List[Union[frozenset, float]]]]:
        data = self.encoder(X)
        num_of_goods = len(self.encode.classes_)
        self.len_of_data = len(X)

        one_item_set = self.find_oneitem(num_of_goods, data)
        # print(len(one_item_set))
        one_item_set_copy = self.find_oneitem(num_of_goods, data)
        one_item_set = [(frozenset(i[0]), i[1]) for i in one_item_set]

        freq_ = one_item_set
        res = one_item_set_copy

        while True:
            candidate = self.cat_sub(freq_)
            if len(candidate) == 0:
                break
            # print("len: ", len(freq_),end = "   ")
            # print(candidate)
            freq_ = [(i, self.cal_sup(frozenset(i), data)) for i in candidate if self.cal_sup(frozenset(i), data) >= self.min_sup]
            # print(freq_)
            if len(candidate) != 0:
                for i in freq_:
                    res.append(i)

        ans = []
        for i in res:
            ans.append((frozenset(self.encode.inverse_transform(list(set(i[0])))), i[1]))

        return ans

    def find_oneitem(self, num_of_goods, X):
        good_list = [[i] for i in range(num_of_goods)]
        one_item = []
        for i in good_list:
            sup = self.cal_sup(frozenset(i), X)
            # print(sup)
            if sup >= self.min_sup:
                one_item.append((frozenset(i), sup))
        return one_item


    def cal_sup(self, i, x):
        if i in self.freq_set.keys():
            return self.freq_set[i]
        else:
            sum = 0
            for t in x:

                # flag = True
                # if len(i) == 1 and flag:
                #     print(1)
                #     flag = False
                # if len(i) != 1 and flag:
                #     print(2)
                #     flag = False
                if i.issubset(t):
                    sum += 1
            self.freq_set[i] = sum / self.len_of_data
            # print(i, sum / self.len_of_data)
            return sum / self.len_of_data

    def cat_sub(self, data):
        candidate = []
        for i in range(len(data)):
            for j in range(i+1, len(data)):
                # print(data[i][0], data[j][0])
                if self.issame(data[i][0], data[j][0]):
                    t = data[i][0] | data[j][0]
                    if t in candidate:

                        continue

                    candidate.append(t)
        # print(candidate)
        return candidate

    def issame(self, x, y):
        return len(x&y) == len(x)-1


m = Apriori(0.005)
data = dm2022exp.load_ex5_data()
ans = m.fit(data)
print(ans)
# for i in range(len(ans)):
#     print(i,":" , ans[i])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值