資料探勘——親和性分析
阿新 • • 發佈:2021-06-18
親和性分析
1. 應用場景
- 向網站使用者提供多樣化的服務或投放定向廣告
- 為了向用戶推薦電影或商品
- 根據基因尋找有親緣關係的人
2. 商品推薦例項
2.1. 資料集概述
import numpy as np dataset_filename = "D:\Google\MOOF\Learning_Data_Mining_With_Python\Code_REWRITE\Chapter 1\\affinity_dataset.txt" # np.loadtxt()讀取目標txt檔案 # x 行代表交易資料所包含的商品(0:購買,1:未購買) # x 列代表一種商品 x = np.loadtxt(dataset_filename)
2.2. 簡單排序規則概述
-
目標:如果找到顧客購買商品X,那麼他們可能願意購買商品Y
-
簡單方法:找出資料集中同時所有同時購買的兩件商品
-
規則優劣評判標準
-
支援度(support)
支援度指資料集中規則應驗的次數,有時還需要對支援度進行規範化(即再除以規則有效前提下的總數量)。支援度衡量的是給定規則應驗的比例。
-
置信度(confidence)
置信度衡量的是規則準確率如何。即符合給定條件的所有規則裡,跟當前規則結論一致的比例。計算方法為首先統計當前規則的出現次數,再用它來除以條件相同的規則數量。
-
-
測試例題
-
測試目標:如果顧客購買了列3,那麼他們也會購買列4(列從0開始計算)
-
流程概述:
-
分別為規則應驗、規則無效及條件相同的規則數量建立三個字典
字典的鍵是由條件和結論組成的元組,元組元素為特徵在特徵列表中的索引值。如果某個個體的條件與結論均與給定規則相符,就表示給定規則對該個體使用;如果通過給定條件推出的結論與給定規則的結論不符,則表示給定規則對該個體無效。
這裡字典建立使用defaultdict,好處是如果查詢的鍵不存在,返回一個預設值。
-
遍歷每條購買記錄,若使用者購買某個商品,記為前提(premise)並在條件相同處加一,隨後遍歷該使用者的其他購買商品,若有另一個商品也購買了(conclusion),在規則應驗字典中加一;反之在規則無效字典中加一。
# 遍歷每個購買記錄 for sample in x: # 條件1,顧客購買了某個商品 # 因要求判斷購買X的同時願意購買Y,只需遍歷到。。。 # premise:前提 for premise in range(4): # 判斷該商品是否被購買,未購買跳至下一件商品 if sample[premise] == 0: continue # 該商品被購買,條件1滿足,該條件出現次數加1 num_occurances[premise] += 1 # 當用戶購買前提達成後,遍歷查詢是否購買另一個商品 # conclusion:結果 for conclusion in range(x_features): # 判斷列為同一列,跳過 if premise == conclusion: continue # 使用者購買premise時也購買conclusion,規則應驗加一 # 使用者購買premise時未購買conclusion,規則無效加一 if sample[conclusion] == 1: valid_rules[(premise,conclusion)] += 1 else: invalid_rules[(premise,conclusion)] += 1
-
支援度、置信度計算。支援度即為規則應驗字典,置信度為規則應驗的鍵 / 規則應驗前提條件對應的條件相同字典。
# 支援度字典設定 support = valid_rules # 置信度方法計算 # 置信度字典設定 confidence = defaultdict(float) # 遍歷有效規則,將該規則應驗值 / 前提條件共計出現次數值 for premise,conclusion in valid_rules.keys(): rule = (premise,conclusion) confidence[rule] = valid_rules[rule] / num_occurances[premise]
-
規則輸出與規則遍歷
# 規則輸出函式 # 接收引數:前提條件特徵索引值,結論特徵索引值,支援度字典,置信度字典,特徵列表 # 輸出引數:每條規則以及其支援度和置信度 def print_rule(premise,conclusion,support,confidence,features): premise_name = features[premise] conclusion_name = features[conclusion] print("Rule: If a person buys 【{0}】 they will also buy 【{1}】".format(premise_name,conclusion_name)) print("\t - confidence:{0:.3f}".format(confidence[(premise,conclusion)])) print("\t - support:{0}\n".format(support[(premise,conclusion)])) # 規則遍歷輸出 for permise,conclusion in support: print_rule(permise,conclusion,support,confidence,features)
-
匯入operator.itemgetter函式,用於排序操作。
from operator import itemgetter
-
通過支援度字典進行排序
# 通過支援度字典進行排序 # support.items() 函式以列表返回可遍歷的(鍵, 值) 元組陣列。 # itemgetter(1)表示以字典各元素的值(這裡為支援度support)作為排序依據 # reverse=True 表示為降序排序 sorted_support = sorted(support.items(), key=itemgetter(1), reverse=True) for index in range(5): print("Rule #{0}".format(index + 1)) premise,conclusion = sorted_support[index][0] print(sorted_support[index][0]) print(premise,conclusion) print_rule(premise,conclusion,support,confidence,features)
-
通過置信度字典進行排序
# 通過置信度字典進行排序 # support.items() 函式以列表返回可遍歷的(鍵, 值) 元組陣列。 # itemgetter(1)表示以字典各元素的值(這裡為支援度confidence)作為排序依據 # reverse=True 表示為降序排序 sorted_confidence = sorted(confidence.items(), key=itemgetter(1), reverse=True) for index in range(5): print("Rule #{0}".format(index + 1)) premise,conclusion = sorted_confidence[index][0] print(sorted_support[index][0]) print(premise,conclusion) print_rule(premise,conclusion,support,confidence,features)
-
-