1. 程式人生 > >商品推薦案例

商品推薦案例

# coding=utf-8
from collections import defaultdict  #使用預設字典,如果查詢鍵不存在,會返回一個預設值
import numpy as np

# a = np.random.randint(0, 2, (5, 5))
a = np.array([[0,0,1,1,1], [1,1,0,1,0], [1,0,1,1,0], [0,0,1,1,1], [0,1,0,0,1]])
# print(a)
np.savetxt('affinity_dataset.txt', a, fmt='%d')
dataset_filename = "affinity_dataset.txt"
x = np.loadtxt(dataset_filename)
print(x)
# 麵包。牛奶。乳酪,蘋果,香蕉    1 購買,  0 未購買
#  如果顧客購買了蘋果,他們也會購買香蕉  就用(3, 4)表示    這條規則的  支援度和置信度
valid_rules = defaultdict(int)  # 有效的規則
invalid_rules = defaultdict(int) # 無效規則
num_occurances = defaultdict(int)   # 條件相同的規則數量  例:['麵包', '牛奶', '乳酪', '蘋果', '香蕉'] 總共五組資料,5行5列, 每列代表一種商品, 每種商品中成功購買的次數

#計算過程需要用迴圈結構依次對每個個體特徵值進行處理,第一個特徵為規則的前提條件--顧客購買了某一種商品
for sample in x:    # sample  樣本     1. 迴圈所有資料集
    for premise in range(4):    # premise  前提  第一個特徵為規則的前提條件--顧客購買了某一種商品  2. 當前資料集裡邊,刨除最後一個商品
        if sample[premise] == 0:    #  如果個體不滿足條件,即沒有買當前商品,繼續    3. 如果當前商品沒有購買, 那麼結束後檢視下一個商品狀態
            continue
        num_occurances[premise] += 1  # 買了這個商品  則數量 + 1     4. 如果當前商品有購買, 那麼 數量加 1
        # print(num_occurances[premise])
        #   5.  在當前商品是購買狀態的情況下,同時還會買後邊其他的哪個商品
        for conclusion in range(premise, 5):    # conclusion  結論  # 當買了這個商品時, 剩下的幾種商品中 會同時購買 出現的所有情況次數
            if premise == conclusion:    # 6 .  比如 當前已買到 蘋果, 下一個再買 蘋果  的情況, pass掉
                continue
            if sample[conclusion] == 1:     #  7.  關聯購買的商品 是 購買狀態, 比如 蘋果 已購買, 同時  香蕉 已購買狀態, 說明是有效規則,
                valid_rules[(premise, conclusion)] += 1
            else:      #  8.   關聯購買的商品 是 購買狀態, 比如 蘋果 已購買, 同時  香蕉 未購買狀態, 說明是無效規則
                invalid_rules[(premise, conclusion)] += 1
            # print('sample = %s --- premise = %s --- conclusion = %s ' % (sample, premise, conclusion))
            # print('valid_rules = ', valid_rules)
            # print('invalid_rules = ', invalid_rules)
            # print('num_occurances = ', num_occurances, '\n\n')
    print(num_occurances)


# 計算支援度
support = valid_rules
print('suppor = ', support)
# 計算置信度,遍歷每條規則計算
confidence = defaultdict(float)
for premise, conclusion in valid_rules.keys():
    rule = (premise, conclusion)
    confidence[rule] = valid_rules[rule] / num_occurances[premise]  # 用符合每一條規則的數量總數/元組中年第一條商品的數量
print('confidence = ', confidence)
print('num_occurances = ', num_occurances)
features = ['麵包', '牛奶', '乳酪', '蘋果', '香蕉']
'''
suppor =  defaultdict(<class 'int'>, {(0, 1): 1, (1, 3): 1, (2, 3): 3, (0, 3): 2, (3, 4): 2, (2, 4): 2, (1, 4): 1, (0, 2): 1})
confidence =  defaultdict(<class 'float'>, {(0, 1): 0.5, (1, 3): 0.5, (2, 3): 1.0, (0, 3): 1.0, (3, 4): 0.5, (2, 4): 0.6666666666666666, (1, 4): 0.5, (0, 2): 0.5})
num_occurances =  defaultdict(<class 'int'>, {0: 2, 1: 2, 2: 3, 3: 4})


'''

# 現在我們已經得到了支援度字典和置信度字典,現在定義函式輸出每條規則以及支援度和置信度
def show(premise, conclusion, support, confidence, features):
    premise_name = features[premise]
    conclusion_name = features[conclusion]
    print('Rule:如果一個人購買了{0}他將也會買{1}'.format(premise_name, conclusion_name))
    print('支援數是{0}'.format(support[(premise, conclusion)]))
    print('置信度是{0:.3f}'.format(confidence[(premise, conclusion)]))
    print('\n\n')


    # print (confidence,type(confidence))
    # print(support,type(support))
#
if __name__=='__main__':
#
    prem=3
    con=4
    show(prem,con,support,confidence,features)






print(valid_rules)
print(invalid_rules)
print(num_occurances)