系列地址:https://www.cnblogs.com/xiaohuiduan/category/1661541.htmlhtml
該教程爲入門教程,爲博主學習數據挖掘的學習路徑步驟。教程爲入門教程,從最簡單的開始。使用的編程語言爲Python3.8.1,使用JupyterNotebook做爲開發環境(使不使用JupyterNotebook都沒有關係)。python
在學習本教程以前,你須要:git
什麼是數據挖掘, 相信點擊進入這篇博客的人都應該知道了吧。通俗的說就是挖掘數據所蘊含的含義,尋找數據之間的關係。github
下面將以最簡單的親和性分析來開始吧。編程
相信你們都據說過一個例子:編程語言
在美國的零售業有着這樣一個傳奇故事,沃爾瑪百貨將他們的紙尿褲和啤酒並排擺在一塊兒銷售,結果紙尿褲和啤酒的銷量雙雙增加!ide
什麼是親和性分析呢?親和性分析根據樣本個體之間的關係,肯定它們關係的親疏。舉一個簡單的應用:顧客去超市買了一個蘋果,那麼他會不會很大的可能性去買香蕉呢?svg
首先,咱們得有一個數據集:函數
這個是一個很簡單的商品交易數據集,簡單到它只有100條數據,儘管數據比較少,but咱們用來學習一下仍是能夠的。學習
數據集的含義:
若是看一行的話,每一行如(0,1,0,0,1)能夠表明每一條交易包含的商品,0表明沒有購買,1表明購買。每一列表明一種商品。
那麼咱們須要找出他的什麼數據含義規則呢?「若是一個顧客購買了商品A,則他極可能購買商品B」。找到這種規則很簡單,找出交易數據中同時購買A商品和B商品的記錄,而後與總的交易數量相比較便可。
規則有優劣,這裏有兩種衡量標準,支持度
和置信度
。(若是商品交易數據)
使用的庫以下:
數據集在這裏:data
首先咱們須要加載數據集,數據的文件名爲affinity_dataset.txt
:
import numpy as np
data_filename = "affinity_dataset.txt"
datas = np.loadtxt(data_filename)
# 列的屬性
features = ["麪包", "牛奶", "黃油", "蘋果", "香蕉蕉"]
數據集咱們已經加載完畢,爲了獲得商品A和商品B的數據,在python中也就是(商品A,商品B)元組,咱們須要進行遍歷,而後將數據保存下來。
如今讓咱們來計算置信度。咱們使用valid_rules
字典來保存商品A和商品B同時存在的記錄,使用invalid_rules
來保存當商品A存在時,可是商品B不存在的記錄。
valid_rules = defaultdict(int) invalid_rules = defaultdict(int)
咱們使用defaultdict來建立字典而不是使用經常使用的方式是由於:
這樣的好處是即便在沒有這個key的時候,它也會返回默認的值0。
咱們定義一個方法,目的是爲了統計A,B之間的關係。
# A 和 B之間的聯繫,返回購買A商品的數量
def connect(indexA, indexB):
buy_A_num = 0
for sample in datas:
if sample[indexA] == 0:
continue
buy_A_num += 1
if(sample[indexB] == 1):
valid_rules[(indexA, indexB)] += 1
else:
invalid_rules[(indexA, indexB)] += 1
return buy_A_num
方法,咱們就能夠得到須要的數據,如今咱們能夠計算置信度了。
def get_confidence():
confidence = defaultdict(float)
for premise, feature in valid_rules.keys():
rule = (premise, feature)
confidence[rule] = valid_rules[rule] / (valid_rules[rule]+invalid_rules[rule])
print("購買{0}後同時{1}的置信度爲:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))
return confidence
固然支持度怎麼算,這個就太簡單了,就是valid_rules
裏面的value除以數據總量便可,就不展現了。
運行代碼,使用for循環將全部的關係都找出來,而後計算置信度:
if __name__ == "__main__":
for i in range(len(features)):
for j in range(len(features)):
if(i == j):
continue
connect(i,j)
confidence = get_confidence()
最後結果以下所示:
一樣咱們能夠對置信度進行排序,字典的items()函數返回包含字典全部元素的列表。itemgetter(1)表示以字典各元素的值(這裏爲置信度)做爲排序依據,reverse=True表示降序排列。
from operator import itemgetter
sort_dict = sorted(confidence.items(),key=itemgetter(1),reverse=True)
for index in range(5):
rule = sort_dict[index][0]
print("購買{0}後同時{1}的置信度爲:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))
結果以下圖所示:
項目地址:github
參考書籍:Python數據挖掘入門與實踐