1. 程式人生 > 其它 >資料探勘——親和性分析

資料探勘——親和性分析

親和性分析

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開始計算)

    • 流程概述:

      1. 分別為規則應驗、規則無效及條件相同的規則數量建立三個字典

        字典的鍵是由條件和結論組成的元組,元組元素為特徵在特徵列表中的索引值。如果某個個體的條件與結論均與給定規則相符,就表示給定規則對該個體使用;如果通過給定條件推出的結論與給定規則的結論不符,則表示給定規則對該個體無效。

        這裡字典建立使用defaultdict,好處是如果查詢的鍵不存在,返回一個預設值。

      2. 遍歷每條購買記錄,若使用者購買某個商品,記為前提(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     
        
      3. 支援度、置信度計算。支援度即為規則應驗字典,置信度為規則應驗的鍵 / 規則應驗前提條件對應的條件相同字典。

        # 支援度字典設定
        support = valid_rules
        # 置信度方法計算
        # 置信度字典設定
        confidence = defaultdict(float)
        # 遍歷有效規則,將該規則應驗值 / 前提條件共計出現次數值
        for premise,conclusion in valid_rules.keys():
            rule = (premise,conclusion)
            confidence[rule] = valid_rules[rule] / num_occurances[premise]
        
      4. 規則輸出與規則遍歷

        # 規則輸出函式
        # 接收引數:前提條件特徵索引值,結論特徵索引值,支援度字典,置信度字典,特徵列表
        # 輸出引數:每條規則以及其支援度和置信度
        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)
        
      5. 匯入operator.itemgetter函式,用於排序操作。

        from operator import itemgetter
        
      6. 通過支援度字典進行排序

        # 通過支援度字典進行排序
        # 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)
        
      7. 通過置信度字典進行排序

        # 通過置信度字典進行排序
        # 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)