python数据挖掘 商品推荐算法

利用亲和性分析进行商品推荐

import numpy as np
dataset_filename=("affinity_dataset.txt")
X=np.loadtxt(dataset_filename)

print(X[:5])

#面包、牛奶、奶酪、苹果和香蕉



#计算数据集中有多少个人买了苹果
num_apple_purchases=0
for sample in X:
    if sample[3]==1:
        num_apple_purchases+=1
print("{0}人购买了苹果".format(num_apple_purchases))


#计算数据集中有多少个人买了香蕉
num_banana_purchases=0
for sample in X:
    if sample[4]==1:
        num_banana_purchases+=1
print("{0}人购买了香蕉".format(num_banana_purchases))


#统计数据集中所有有规则的数据,。首先分别为规则应验和规则无效这两种情况创建字典
#“如果顾客购买了苹果,他们也会买香蕉”就用(3, 4)表示
from collections import defaultdict #使用默认字典,如果查找键不存在,会返回一个默认值
valid_rules=defaultdict(int)#有规则应验
invalid_rules=defaultdict(int)#规则无效
num_occurances=defaultdict(int)#条件相同的规则数量

#计算过程需要用循环结构依次对每个个体特征值进行处理,第一个特征为规则的前提条件--顾客购买了某一种商品
for sample in X:
    for premise in range(4):
        if sample[premise]==0:#如果个体不满足条件,即没有买当前商品,继续
            continue
        num_occurances[premise]+=1
        for conclusion in range(premise,5):
            if premise==conclusion:
                continue
            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]#用符合每一条规则的数量总数/元组中年第一条商品的数量

features=['面包','牛奶','奶酪','苹果','香蕉']

#现在我们已经得到了支持度字典和置信度字典,现在定义函数输出每条规则以及支持度和置信度
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=1
#     con=3
#     show(prem,con,support,confidence,features)

#得到所有规则的支持度和置信度之后,为了找出最佳规则,还需要根据支持度和置信度对规则进行排序。
#要找出支持度最高的规则,首先对支持度字典进行排序,字典的items()函数返回包含字典所有元素的列表,并且使用itemgetter()作为键,对嵌套列表进行排序,
#itemgetter(1)表示以字典各元素的值(这里指支持度)为依据进行排序,reverse=true表示降序排列

from operator import itemgetter
#根据支持度进行排序
sortd_support=sorted(support.items(),key=itemgetter(1),reverse=True)

#根据置信度进行排序
sortd_confidence=sorted(confidence.items(),key=itemgetter(1),reverse=True)
print(sortd_support)
#排序完成,输出支持度前五的规则
for i in range(5):
    print('Role规则#{0}'.format(i+1))
    (premise,conclusion)=sortd_support[i][0]#获取元组值
    show(premise,conclusion,support,confidence,features)

#输出置信度前五的规则
# for i in range(5):
#     print('Role规则#{0}'.format(i+1))
#     (premise,conclusion)=sortd_confidence[i][0]#获取元组值
#     show(premise,conclusion,support,confidence,features)



 
 

 
 

猜你喜欢

转载自blog.csdn.net/just_so_so_fnc/article/details/78234555
今日推荐