資料探勘之用python實現Apriori關聯演算法

2021-09-25 09:56:14 字數 4219 閱讀 9482

apriori演算法指導我們,如果要發現強關聯規則,就必須先找到頻繁集。所謂頻繁集,即支援度大於最小支援度的項集。如何得到資料集合d中的所有頻繁集呢?

apriori演算法是挖掘布林關聯規則頻繁項集的演算法。apriori演算法利用頻繁項集性質的先驗知識,通過逐層搜尋的迭代方法,即將k-項集用於探察(k+1)項集,來窮盡資料集中的所有頻繁項集。先找到頻繁項集1-項集集合l1, 然後用l1找到頻繁2-項集集合l2,接著用l2找l3,知道找不到頻繁k-項集,找到每個lk需要一次資料庫掃瞄。注意:頻繁項集的所有非空子集也必須是頻繁的。apriori性質通過減少搜尋空間,來提高頻繁項集逐層產生的效率。apriori演算法由連線剪枝兩個步驟組成。

拿沃爾瑪超市的例子舉例說明關聯演算法的作用:沃爾瑪超市的貨物擺放都是有嚴格要求的,那麼他們按哪種規則去擺放的呢?其實沃爾瑪超市的研發人員通過資料分析顧客購物物品的種類,進行物品與物品之間建立聯絡,得到一定的規定,例如剛出生嬰兒的家庭,父親往往在購物買自己所需要的啤酒時會考慮將孩子的尿不濕順便買下,這就構成了一定規則,在同種人群中這件事頻繁發生,因此需要構建這種擺放規則從而去吸引顧客的青睞。

這個例子舉完了,那麼我們是怎麼通過一群購物者,每個購物者眾多商品中去得到這種規則呢?也就是第一段所說的滿足支援度的頻繁集,我們先去建立乙個小型購物資料樣本集,如圖所示:

我們先用手算進行模擬apriori演算法的具體實現過程:

假設我們的最小支援度閾值為2,即支援度計數小於2的都要刪除。

上圖每行代表購物者x買的物品清單,下圖表示c1候選集:

下面對c1候選集進行支援度比較刪除不滿足支援度的,生成頻繁集l1:

c1至l1的過程: 只需檢視支援度是否高於閾值,然後取捨。上圖c1中所有閾值都大於2,故l1中都保留。

l1至c2的過程分三步:

c2至l2的過程: 只需檢視支援度是否高於閾值,然後取捨。

l2至c3的過程:

還是上面的步驟。首先生成(牛奶,水果,尿不濕)、(牛奶,水果,鋼筆)、(牛奶,水果,啤酒)....為什麼最後只剩(牛奶,水果,尿不濕)和(牛奶,水果,啤酒)呢?因為剪枝過程:(牛奶,水果,鋼筆)拆分為(牛奶,水果)和(牛奶,鋼筆)和(水果,鋼筆).然而(牛奶,鋼筆)在l2中不存在,即非頻繁項。所有剪枝刪除。然後對c3中剩下的組合進行計數。發現(牛奶,水果,尿不濕)和(牛奶,水果,啤酒)的支援度2。迭代結束。

所以演算法過程就是 ck - lk - ck+1 的過程:

# -*- coding: utf-8 -*-

""""

author = "cpz"

time = "2019-7-22"

aim = "python實現apriori關聯演算法"

為了程式方便我們將

牛奶:1

水果:2

尿不濕:3

鋼筆:4

啤酒:5

"""""

import numpy as np

from itertools import combinations # 迭代工具

data = [['牛奶','水果','啤酒'], ['水果','鋼筆'], ['水果','尿不濕'], ['牛奶','水果','鋼筆'], ['牛奶','尿不濕'], ['水果','尿不濕'], ['牛奶','尿不濕'], ['牛奶','水果','尿不濕','啤酒'], ['牛奶','水果','尿不濕']]

minsp = 2

data1 = [[1,2,5], [2,4], [2,3], [1,2,4], [1,3], [2,3], [1,3], [1,2,3,5], [1,2,3]]

d =

for i in range(len(data)):

d.extend(data1[i])#樣本集化為一維陣列

new_d = list(set(d))

#去重c = np.zeros([len(new_d), 2])#建立指定大小的陣列,陣列元素以 0 來填充,2列:

def limit(l): # 刪掉不滿足閾值的c

row =

for i in range(l.shape[0]):

#print(l[i:-1])

if l[i, -1] < minsp:

l = np.delete(l, row, 0)

return l

def satisfy(s,s_new,k): #更新,刪除不滿足支援度的l

e =

ss_new =

for i in range(len(s_new)):

#print(s_new[i])

for j in combinations(s_new[i], k): #迭代每個頻繁集可能出現的元素組合

if ([l for l in e if l not in s]) == :

e =

#print(ss_new)

return ss_new

def count(s_new):

num = 0

#print(s_new)

c = np.copy(s_new) #轉化成narray表示的函式

c = np.column_stack((c,np.zeros(c.shape[0]))) #對c(k+1)生成的陣列 新增計數列

#print(c)

for i in range(len(s_new)): #項集ck到data資料集計出現頻率

for j in range(len(data1)):

if ([l for l in s_new[i] if l not in data1[j]]) == :

num = num + 1

c[i,-1] = num

num = 0

#print(c)

return c

def generate(l,k): #實現由l向c的轉換

s =

for i in range(l.shape[0]):

s_new =

for i in range(l.shape[0]-1):

for j in range(i+1,l.shape[0]): #二重迴圈生成ck項集

#print(l[j,-2],l[i,-2])

if(l[j,-2]>l[i,-2]):

t = list(np.copy(s[i]))

#print(t)

#print(t)

s_new = satisfy(s,s_new,k)

c = count(s_new)

return c

# 對c1項集進行支援度計數

for i in range(len(new_d)):

c[i:] = np.array([new_d[i], d.count(new_d[i])])

#將c1項集複製給頻繁集l1

l = np.copy(c)

l = limit(l)

#print(l)

# # 開始迭代

k = 1

while (np.max(l[:,-1]) > minsp):

c = generate(l, k) # 由l產生c

l = limit(c) # 由c產生l

k = k+1

print(list(set(tuple(t) for t in l)))#對結果去重

""" 最終我們得到兩個滿足支援度的關聯規則,從這五條購物清單知道

使用者會購買

1.牛奶和水果的同時會有可能買尿不濕

2.牛奶和水果的同時會有可能買啤酒

所以乙個簡單的**功能就出現了:

可以去找買牛奶的使用者向他們推薦水果和尿不濕或者啤酒

"""

資料探勘 資料標準化 python實現

coding utf 8 author thinkgamer desc 4 1 python實現標準化方法 import numpy as np import math class datanorm def init self self.arr 1 2,3 4,5 6,7 8,9 self.x ma...

python資料探勘面試 位元組跳動資料探勘面試總結

1.資料探勘任務 使用者常住城市 2.資料倉儲任務 演出主藝人名標籤挖掘 3.mapreduce原理 4.mapreduce特別慢的原因 4.1 計算機效能 cpu 記憶體 磁碟健康 網路 4.2 i o操作優化 資料傾斜 map reduce數設定不合理 reduce等待過久 小檔案過多 大量的不...

資料探勘 Python實現ID3演算法

import math defcreatedataset dataset 1,1,yes 1,1,yes 1,0,no 0,1,no 0,1,no 資料集的最後一列稱作value,label稱作attr labels no su cing flippers return dataset,labels...