1. 程式人生 > >python實現關聯規則分析Apriori演算法

python實現關聯規則分析Apriori演算法

程式碼寫了好久了,今天搬上來。
Apriori演算法介紹:
這裡寫圖片描述
這裡寫圖片描述
Apriori其實是為了降低搜尋空間以及提高搜尋速度而設計的一種演算法,本文采用python實現,徹底理解“頻繁項集的所有非空子集一定是頻繁的”這句話,並實現連線步、剪枝步、規則生成、提升度計算等。
本節程式碼參考了《機器學習實戰》第十一章中的程式碼,也參考了R語言的arules包,該包沒有實現一對多的規則,因此,在以上基礎上進行了改進,包括實現剪枝步,規則生成(一對一,一對多,多對一,多對多),增加提升度Lift評估。

整體程式碼實現過程如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from numpy import * def loadDataSet(): return [['a', 'c', 'e'], ['b', 'd'], ['b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b'], ['b', 'c'], ['a', 'b'], ['a', 'b', 'c', 'e'], ['a', 'b', 'c'], ['a', 'c', 'e']] def createC1(dataSet): C1 = [] for transaction in dataSet: for
item in transaction: if not [item] in C1: C1.append([item]) C1.sort() # 對映為frozenset唯一性的,可使用其構造字典 return list(map(frozenset, C1)) # 從候選K項集到頻繁K項集(支援度計算) def scanD(D, Ck, minSupport): ssCnt = {} for tid in D: for can in Ck: if
can.issubset(tid): if not can in ssCnt: ssCnt[can] = 1 else: ssCnt[can] += 1 numItems = float(len(D)) retList = [] supportData = {} for key in ssCnt: support = ssCnt[key] / numItems if support >= minSupport: retList.insert(0, key) supportData[key] = support return retList, supportData def calSupport(D, Ck, min_support): dict_sup = {} for i in D: for j in Ck: if j.issubset(i): if not j in dict_sup: dict_sup[j] = 1 else: dict_sup[j] += 1 sumCount = float(len(D)) supportData = {} relist = [] for i in dict_sup: temp_sup = dict_sup[i] / sumCount if temp_sup >= min_support: relist.append(i) supportData[i] = temp_sup # 此處可設定返回全部的支援度資料(或者頻繁項集的支援度資料) return relist, supportData # 改進剪枝演算法 def aprioriGen(Lk, k): # 建立候選K項集 ##LK為頻繁K項集 retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i + 1, lenLk): L1 = list(Lk[i])[:k - 2] L2 = list(Lk[j])[:k - 2] L1.sort() L2.sort() if L1 == L2: # 前k-1項相等,則可相乘,這樣可防止重複項出現 # 進行剪枝(a1為k項集中的一個元素,b為它的所有k-1項子集) a = Lk[i] | Lk[j] # a為frozenset()集合 a1 = list(a) b = [] # 遍歷取出每一個元素,轉換為set,依次從a1中剔除該元素,並加入到b中 for q in range(len(a1)): t = [a1[q]] tt = frozenset(set(a1) - set(t)) b.append(tt) t = 0 for w in b: # 當b(即所有k-1項子集)都是Lk(頻繁的)的子集,則保留,否則刪除。 if w in Lk: t += 1 if t == len(b): retList.append(b[0] | b[1]) return retList def apriori(dataSet, minSupport=0.2): C1 = createC1(dataSet) D = list(map(set, dataSet)) # 使用list()轉換為列表 L1, supportData = calSupport(D, C1, minSupport) L = [L1] # 加列表框,使得1項集為一個單獨元素 k = 2 while (len(L[k - 2]) > 0): Ck = aprioriGen(L[k - 2], k) Lk, supK = scanD(D, Ck, minSupport) # scan DB to get Lk supportData.update(supK) L.append(Lk) # L最後一個值為空集 k += 1 del L[-1] # 刪除最後一個空集 return L, supportData # L為頻繁項集,為一個列表,1,2,3項集分別為一個元素。 # 生成集合的所有子集 def getSubset(fromList, toList): 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(tt) if len(tt) > 1: getSubset(tt, toList) def calcConf(freqSet, H, supportData, ruleList, minConf=0.7): for conseq in H: conf = supportData[freqSet] / supportData[freqSet - conseq] # 計算置信度 # 提升度lift計算lift = p(a & b) / p(a)*p(b) lift = supportData[freqSet] / (supportData[conseq] * supportData[freqSet - conseq]) if conf >= minConf and lift > 1: print(freqSet - conseq, '-->', conseq, '支援度', round(supportData[freqSet - conseq], 2), '置信度:', conf, 'lift值為:', round(lift, 2)) ruleList.append((freqSet - conseq, conseq, conf)) # 生成規則 def gen_rule(L, supportData, minConf=0.7): bigRuleList = [] for i in range(1, len(L)): # 從二項集開始計算 for freqSet in L[i]: # freqSet為所有的k項集 # 求該三項集的所有非空子集,1項集,2項集,直到k-1項集,用H1表示,為list型別,裡面為frozenset型別, H1 = list(freqSet) all_subset = [] getSubset(H1, all_subset) # 生成所有的子集 calcConf(freqSet, all_subset, supportData, bigRuleList, minConf) return bigRuleList if __name__ == '__main__': dataSet = loadDataSet() L, supportData = apriori(dataSet, minSupport=0.2) rule = gen_rule(L, supportData, minConf=0.7)

結果如下所示(更完善):
這裡寫圖片描述
R語言執行結果(存在不足):
這裡寫圖片描述
R語言實現中,去掉第1-3條涉及空集的規則,刪除Lift小於1的情況(第7條和第10條),剩餘7條規則。與上圖本文實現相比較,少了“一對多”的情況,也就是少了“e—–a,c”這條規則。

大功告成,程式碼實現比較好懂,功能都實現了,較R語言結果展現有了明顯的改進(自動刪除涉及空集的規則,自定義篩選Lift>1),但是看起來比較亂,有時間重新封裝下,先寫到這裡,睡覺。

相關推薦

python實現關聯規則分析Apriori演算法

程式碼寫了好久了,今天搬上來。 Apriori演算法介紹: Apriori其實是為了降低搜尋空間以及提高搜尋速度而設計的一種演算法,本文采用python實現,徹底理解“頻繁項集的所有非空子集一定是頻繁的”這句話,並實現連線步、剪枝步、規則生成

關聯規則Apriori演算法python實現

1 關聯規則 關聯分析一個典型的例子是購物籃分析,廣泛應用於零售業,通過檢視那些商品經常在一起購買,可以幫助商店瞭解使用者的購買行為。一個最有名的例子是“尿布與啤酒”,據報道,美國中西部的一家連鎖店發現,男人們會在週四購買尿布和啤酒,這樣商家實際上就可以將尿布

GIS資訊關聯規則挖掘——Apriori演算法實現(下)

上篇說明了原理,這篇就直接上核心程式碼了~ 程式碼比較長,所以理解可能有點麻煩,核心思路就是計算選擇的維度後遍歷資料,逐步進行迴圈計算置信度,並淘汰每次迴圈後的最低值。 這裡有一點要注意的,我一開始想用arraylist構造一個堆疊結構進行資料遍歷的儲存跟計算,因為這樣效率比較高。

GIS資訊關聯規則挖掘——Apriori演算法實現(上)

最近閒著無聊沒啥課,幫讀master的朋友做了一個桌面端的GIS系統,主要功能是景區管理。 其中有個核心功能挺有意思的,就是統計所有景區受損設施的所有致損型別和每個型別具體包含的致損因子後,計算致損因子之間的關聯規則,然後可以根據使用者選定的致損型別組合計算出其景區設施造成損害的概率。(有點

python實現關聯規則

  程式碼中Ci表示候選頻繁i項集,Li表示符合條件的頻繁i項集    # coding=utf-8    def createC1(dataSet): # 構建所有1項候選項集的集合    C1 = []    for transaction in dataSet:    for item in trans

R語言實現關聯規則與推薦演算法(學習筆記)

R語言實現關聯規則筆者前言:以前在網上遇到很多很好的關聯規則的案例,最近看到一個更好的,於是便學習一下,寫個學習筆記。推薦演算法中物品-物品用關聯規則;人物-物品用協同過濾;人-人用社會網路分析;特徵-

挖掘關聯規則Apriori演算法詳解

1. 挖掘關聯規則 1.1   什麼是關聯規則 一言蔽之,關聯規則是形如X→Y的蘊涵式,表示通過X可以推導“得到”Y,其中X和Y分別稱為關聯規則的先導(antecedent或left-hand-side, LHS)和後繼(consequent或right-hand-side

資料菜鳥的挖掘之旅(二)關聯規則Apriori演算法

一、介紹 假如,我們手中有一個顧客在商場中購買物品交易記錄的資料庫。我們如何通過這個資料庫,找出一些規則,再通過一些方法,讓這些規則被顧客接受,促使他們在商場中購買更多的商品?、 就像很早以前所說的——啤酒與尿布 二、幾個基本概念 2.1項集(I

機器學習系列文章:Apriori關聯規則分析演算法原理分析與程式碼實現

1.關聯規則淺談     關聯規則(Association Rules)是反映一個事物與其他事物之間的相互依存性和關聯性,如果兩個或多個事物之間存在一定的關聯關係,那麼,其中一個事物就能通過其他事物預測到。關聯規則是資料探勘的一個重要技術,用於從大量資料中挖掘出有價值的資料

關聯分析——Apriori演算法以及Python實現

Aprior演算法是比較經典的關聯規則挖掘演算法。 核心思想 核心就是先驗原理,即頻繁項集的子集必定是頻繁項集。反之,若子集非頻繁,則超集必定非頻繁。 演算法簡介 基本概念 購物籃事務(transaction):一位顧客一次購買商品的記錄就

簡單優化的Apriori演算法進行關聯規則分析

實驗的時候發現演算法主要時間來自於C1 -> L1的構建,因此對L1的產生進行了優化,簡單記錄 def loadDataSet(filename): f= open(filename,'r') dataSet = [] for l

關聯分析Apriori演算法python

小夥伴們,繼續一起學習機器學習演算法啦,今天學習關聯分析、Apriori演算法啦!大家肯定很熟悉一個故事-沃爾瑪超市資料總結出的啤酒與尿布的相關性(知乎上也有牛人們在討論這個故事的真假) 圖1 來自《機器學習實戰》這本書裡提到的一個例子,展示瞭如下的一個購物清單: 圖2 在上述購物

關聯分析——Apriori演算法

關聯分析: 百度百科定義:又稱關聯挖掘,就是在交易資料、關係資料或其他資訊載體中,查詢存在於專案集合或物件集合之間的頻繁模式、關聯、相關性或因果結構。或者說,關聯分析是發現交易資料庫中不同商品(項)之間的聯絡。 說白了,就是從大量資料中發現元素之間的關聯和相

常用排序演算法python實現和效能分析

一年一度的換工作高峰又到了,HR大概每天都塞幾份簡歷過來,基本上一天安排兩個面試的話,當天就只能加班幹活了。趁著面試別人的機會,自己也把一些基礎演算法和一些面試題整了一下,可以階段性的留下些腳印——沒辦法,平時太忙,基本上沒有時間寫部落格。面試測試開發的話,

排序演算法Python實現以及時間分析

選擇排序 首先,找到陣列中最小的那個元素,其次,將它和陣列的第一個元素交換位置(如果第一個元素就是最小元素那麼它就和自己交換)。再次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序。這種方法叫做選擇排序,因為它在不斷地選擇

關聯規則挖掘的演算法——Apriori演算法

3. 基於取樣的方法。基於前一遍掃描得到的資訊,對此仔細地作組合分析,可以得到一個改進的演算法,Mannila等[8]先考慮了這一點,他們認為取樣是發現規則的一個有效途徑。隨後又由Toivonen[16]進一步發展了這個思想,先使用從資料庫中抽取出來的取樣得到一些在整個資料庫中可能成立的規則,然後對資料庫的剩

分享《Python機器學習—預測分析核心演算法》高清中文版PDF+高清英文版PDF+原始碼

下載:https://pan.baidu.com/s/1sfaOZmuRj14FWNumGQ5ahw 更多資料分享:http://blog.51cto.com/3215120 《Python機器學習—預測分析核心演算法》高清中文版PDF+高清英文版PDF+原始碼高清中文版,338頁,帶目錄和書籤,文字能夠

Python機器學習——預測分析核心演算法 pdf 下載

機器學習關注於預測,其核心是一種基於數學和演算法的技術,要掌握該技術,需要對數學及統計概念有深入理解,能夠熟練使用R 語言或者其他程式語言。    本書通過集中介紹兩類可以進行有效預測的機器學習演算法,展示瞭如何使用Python 程式語言完成機器學習任務,從而降低機器學習難度,使機器

python實現的八種排序演算法

1.快速排序 排序思想: 1.從數列中挑出一個元素,稱為"基準"(pivot) 2.重新排序數列,所有比基準值小的元素放在基準前面,比基準大的元素放在基準後面。在這個分割槽結束之後,該基準就處於數列的中間位置,這就是分割槽操作。 3.遞迴地把小於基準的子數列和大於基準的子數列排序

python實現mean-shift聚類演算法

新建MeanShift.py檔案 import numpy as np # 定義 預先設定 的閾值 STOP_THRESHOLD = 1e-4 CLUSTER_THRESHOLD = 1e-1 # 定義度量函式 def distance(a, b):