1. 程式人生 > >Apriori演算法學習以及Python程式碼實現

Apriori演算法學習以及Python程式碼實現

最近在學資料探勘,學完Apriori演算法之後就一直想用程式碼實現出來,於是學了幾天python之後,進行了實現...

直接貼程式碼,程式碼中有自己的解釋。

'''
# Filename: MyApriori.py
# author: 薄層
# Date: 2018/5/20 0:41
'''

def load_data_set():
	data_set = [['e1', 'e2', 'e5'], 
				['e2', 'e4'],
				['e2', 'e3'],
				['e1', 'e2', 'e4'],
				['e1', 'e3'],
				['e2', 'e3'],
				['e1', 'e3'],
				['e1', 'e2', 'e3', 'e5'],
				['e1', 'e2', 'e3']]
	return data_set

def Create_C1(data_set):
	'''
	引數:資料庫事務集
	'''
	C1 = set()
	for t in data_set:
		for item in t:
			item_set = frozenset([item])
			# 為生成頻繁專案集時掃描資料庫時以提供issubset()功能
			C1.add(item_set)
	return C1

def is_apriori(Ck_item, Lk_sub_1):
	'''
	引數:候選頻繁k項集,頻繁k-1項集
	'''
	for item in Ck_item:
		sub_item = Ck_item - frozenset([item])
		if sub_item not in Lk_sub_1:
			return False
	return True

def Create_Ck(Lk_sub_1, k):
	'''
	# 引數:頻繁k-1項集,當前要生成的候選頻繁幾項集
	'''
	Ck = set()
	len_Lk_sub_1 = len(Lk_sub_1)
	list_Lk_sub_1 = list(Lk_sub_1)
	for i in range(len_Lk_sub_1): #i: [0, len_Lk_sub_1)
		for j in range(i+1, len_Lk_sub_1): #j: [i+1, len_Lk_sub_1)
			l1 = list(list_Lk_sub_1[i])
			l2 = list(list_Lk_sub_1[j])
			l1.sort()
			l2.sort()
			# 判斷l1的前k-1-1個元素與l2的前k-1-1個元素對應位是否全部相同
			# list[s:t]:擷取s到t範圍的元素生成一個新list
			if l1[0:k-2] == l2[0:k-2]:
				Ck_item = list_Lk_sub_1[i] | list_Lk_sub_1[j]
				if is_apriori(Ck_item, Lk_sub_1):
					Ck.add(Ck_item)
	return Ck

def Generate_Lk_By_Ck(data_set, Ck, min_support, support_data):
	'''
	引數:資料庫事務集,候選頻繁k項集,最小支援度,專案集-支援度dic
	'''
	Lk = set()
	# 通過dic記錄候選頻繁k項集的事務支援個數
	item_count = {}
	for t in data_set:
		for Ck_item in Ck:
			if Ck_item.issubset(t):
				if Ck_item not in item_count:
					item_count[Ck_item] = 1
				else:
					item_count[Ck_item] += 1
	data_num = float(len(data_set))
	for item in item_count:
		if(item_count[item] / data_num) >= min_support:
			Lk.add(item)
			support_data[item] = item_count[item] / data_num
	return Lk
	
def Generate_L(data_set, max_k, min_support):
	'''
	引數:資料庫事務集,求的最高專案集為k項,最小支援度
	'''
	# 建立一個頻繁專案集為key,其支援度為value的dic
	support_data = {}
	C1 = Create_C1(data_set)
	L1 = Generate_Lk_By_Ck(data_set, C1, min_support, support_data)
	Lk_sub_1 = L1.copy() # 對L1進行淺copy
	L = []
	L.append(Lk_sub_1) # 末尾新增指定元素
	for k in range(2, max_k+1):
		Ck = Create_Ck(Lk_sub_1, k)
		Lk = Generate_Lk_By_Ck(data_set, Ck, min_support, support_data)
		Lk_sub_1 = Lk.copy()
		L.append(Lk_sub_1)
	return L, support_data

def Generate_Rule(L, support_data, min_confidence):
	'''
	引數:所有的頻繁專案集,專案集-支援度dic,最小置信度
	'''
	rule_list = []
	sub_set_list = []
	for i in range(len(L)):
		for frequent_set in L[i]:
			for sub_set in sub_set_list:
				if sub_set.issubset(frequent_set):
					conf = support_data[frequent_set] / support_data[sub_set]
					# 將rule宣告為tuple
					rule = (sub_set, frequent_set-sub_set, conf)
					if conf >= min_confidence and rule not in rule_list:
						rule_list.append(rule)
			sub_set_list.append(frequent_set)
	return rule_list

if __name__ == "__main__":
	data_set = load_data_set()
	'''
	print("Test")
	# 資料庫事務列印
	for t in data_set:
		print(t)
	'''
	'''
	print("Test")
	# 候選頻繁1項集列印
	C1 = Create_C1(data_set)
	for item in C1:
		print(item)
	'''
	'''
	# 頻繁1項集列印
	print("Test")
	L = Generate_L(data_set, 1, 0.2)
	for item in L:
		print(item)
	'''
	'''
	# 頻繁k項集列印
	print("Test")
	L, support_data = Generate_L(data_set, 2, 0.2)
	for item in L:
		print(item)
	'''
	'''
	# 關聯規則測試
	print("Test")
	L, support_data = Generate_L(data_set, 3, 0.2)
	rule_list = Generate_Rule(L, support_data, 0.7)
	for item in support_data:
		print(item, ": ", support_data[item])
	print("-----------------------")
	for item in rule_list:
		print(item[0], "=>", item[1], "'s conf:", item[2])
	'''
	
	L, support_data = Generate_L(data_set, 3, 0.2)
	rule_list = Generate_Rule(L, support_data, 0.7)
	for Lk in L:
		print("="*55)
		print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")
		print("="*55)
		for frequent_set in Lk:
			print(frequent_set, support_data[frequent_set])
	print()
	print("Rules")
	for item in rule_list:
		print(item[0], "=>", item[1], "'s conf: ", item[2])

命令列執行結果:


自己蛋疼畫的圖,沒看到人家大佬已經畫了...


這些東西最近就不學了,等一些東西塵埃落定之後再說吧...

繼續加油~

相關推薦

Apriori演算法學習以及Python程式碼實現

最近在學資料探勘,學完Apriori演算法之後就一直想用程式碼實現出來,於是學了幾天python之後,進行了實現...直接貼程式碼,程式碼中有自己的解釋。''' # Filename: MyApriori.py # author: 薄層 # Date: 2018/5/20 0

決策樹基本理論學習以及Python程式碼實現和詳細註釋

首先是樹的概念我們都比較熟悉了,然後決策樹其實就是一棵樹,通過在每一個幾點通過特徵的不同,走向不同的子樹直到走到葉子節點找到分類的標籤,算是完成了分類的過程。分類的過程不難理解,主要的是資料構造過程。 首先是構造的依據是什麼呢,以什麼依據作為特徵使用的選擇條件

常用的幾種機器學習演算法迴歸模型python程式碼實現

       由於在論文實驗過程中一直使用的是python語言完成的論文實驗,所以在論文需要使用機器學習方法時就考慮使用了scikit-learn。        scikit-learn是一款很好的Python機器學習庫,它包含以下的特點:        (1)簡單高效的資

【機器學習】:Kmeans均值聚類演算法原理(附帶Python程式碼實現)

這個演算法中文名為k均值聚類演算法,首先我們在二維的特殊條件下討論其實現的過程,方便大家理解。 第一步.隨機生成質心 由於這是一個無監督學習的演算法,因此我們首先在一個二維的座標軸下隨機給定一堆點,並隨即給定兩個質心,我們這個演算法的目的就是將這一堆點根據它們自身的座標特徵分為兩類,因此選取了兩個質心,什麼時

Redis訂閱&釋出以及python程式碼實現

A:命令列 伺服器端 192.168.1.168:7000> subscribe foo bar Reading messages... (press Ctrl-C&n

leetcode-Two sum(最佳思路以及python程式碼實現

1、Two sumGiven nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].答案:使用hashtable,建立陣列值和下標的鍵值對,在pytho

Redis訂閱&釋出以及python程式碼實現

A:命令列 伺服器端 192.168.1.168:7000> subscribe foo bar Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1 1 1) "message"

Logistic Regression 邏輯迴歸演算法例子,python程式碼實現

轉載自原文 邏輯迴歸 Logistic Regression 雖然名字叫做邏輯迴歸 Logistic regression ,但它是一種分類演算法。對於文字處理方便,邏輯迴歸是一種非常強大的分類器。它主要通過在邏輯函式上執行迴歸來實現,正如其名字。 邏輯迴歸的一個小

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

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

機器學習中優化演算法總結以及Python實現

機器學習演算法最終總是能轉化為最優化問題,習慣上會轉化為最小化問題。 個人總結迭代優化演算法關鍵就兩點: (1) 找到下降方向 (2) 確定下降步長 最速梯度下降演算法 梯度下降演算法是以最優化函式的梯度為下降方向,學習率η\etaη乘以梯度的模即為下降步長。更

[Python-程式碼實現]統計學習方法之感知機模型

內容簡介 感知機模型 - 手寫 Coding 使用手寫模型進行鳶尾花分類 使用 sklearn 中的感知機進行鳶尾花分類 感知機模型 - 手寫 Coding class Model: """感知機模型""" def __init__(s

模擬RSA雙向驗證,並且實現DES加密以及MD5校驗過程(python程式碼實現

要求如下:            (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。            (2)A端生成隨機數N1,用B的公鑰PB加

Somte演算法Python程式碼實現

SMOTE全稱是Synthetic Minority Oversampling Technique,即合成少數類過取樣技術。 它是基於隨機過取樣演算法的一種改進方案。 由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的資

深度學習中IU、IoU(Intersection over Union)的概念理解以及python程式實現

Intersection over Union是一種測量在特定資料集中檢測相應物體準確度的一個標準。我們可以在很多物體檢測挑戰中,例如PASCAL VOC challenge中看多很多使用該標準的做法。 通常我們在 HOG + Linear SVM objec

決策樹(ID3 C4,5 減枝 CART演算法以及Python實現

演算法簡述 在《統計學習方法》中,作者的if-then的描述,簡單一下子讓人理解了決策樹的基本概念。 決策樹,就是一個if-then的過程。 本文主要學習自《統計學習方法》一書,並努力通過書中數學推導來

深度學習(七)U-Net原理以及keras程式碼實現醫學影象眼球血管分割

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9780786.html 全卷積神經網路 醫學影象分割框架 醫學影象分割主要有兩種框架,一個是基於CNN的,另一個就是基於FCN的。這裡都是通過網路來進行語義分割。 那麼什麼是語義分割?可

(轉載)李航博士的統計學習方法的python程式碼實現及資料下載

《統計學習方法》可以說是機器學習的入門寶典,許多機器學習培訓班、網際網路企業的面試、筆試題目,很多都參考這本書。本站根據網上資料用Python復現了課程內容,並提供本書的程式碼實現、課件下載。 《統計學習方法》,作者李航,本書全面系統地介紹了統計學習的主要方法,特別是監督學習方法,包括感

排序演算法之快速排序,氣泡排序用python程式碼實現

一、快速排序 1.在列表中選出一個基準數(通常為列表的第一個數) 2.將列表中小於基準數的資料移到基準列表的左邊,將大於基準數的資料移到基準數的右邊 3.對於基準數左,右兩邊的列表,不斷重複以上兩個過程,直到每個子集只有一個元素, 即為全部有序的. def qu

【機器學習】決策樹演算法(二)— 程式碼實現

#coding=utf8 ‘’’ Created on 2018年11月4日 @author: xiaofengyang 決策樹演算法:ID3演算法 ‘’’ from sklearn.feature_extraction import DictVectorize

基於使用者最近鄰模型的協同過濾演算法Python程式碼實現

#------------------------------------------------------------------------------- # Name: PearsonUserNeighCF # Purpose: Personalized Recommendati