关联规则挖掘

(一)几个基本概念
关联规则挖掘就是从数据集中发现项与项之间的关系
以超市购物为例:
在这里插入图片描述
1、支持度

支持度是个百分比,它指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。例如,“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.6。

2、置信度

置信度是个条件概念,就是说在 A 发生的情况下,B 发生的概率是多少。即就是当你购买了商品 A,会有多大的概率购买商品 B。例如,置信度(牛奶→啤酒)=2/4=0.5,代表如果你购买了牛奶,有50%的概率会购买啤酒。

3、提升度

提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度。计算公式如下:提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)
所以提升度有三种可能:
(1)提升度 (A→B)>1:代表有提升;
(2)提升度 (A→B)=1:代表有没有提升,也没有下降;
(3)提升度 (A→B)<1:代表有下降。

(二)Apriori的工作原理

Step1:K=1,计算 K 项集的支持度;
Step2:筛选掉小于最小支持度的项集;
Step3:如果项集为空,则对应 K-1 项集的结果为最终结果。
否则 K=K+1,重复 1-3 步。

Apriori 在计算的过程中有以下几个缺点:
(1)可能产生大量的候选集,因为采用排列组合的方式,把可能的项集都组合出来了;
(2)每次计算都需要重新扫描数据集,来计算每个项集的支持度。
所以 Apriori 算法会浪费很多计算空间和计算时间,为此提出了 FP-Growth 算法进行改进,其特点是:创建了一棵 FP 树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间;整个生成过程只遍历数据集 2 次,大大减少了计算量。

(三)FP-Growth 算法工作原理

Step 1:创建项头表,对于满足最小支持度的单个项按照支持度从高到低进行排序,删除了不满足最小支持度的项
在这里插入图片描述
Step 2:构造FP树,FP树的根节点记作NULL节点,再次扫描数据集,对于每一条数据,按照支持度从高到低的顺序进行创建节点(项头表中的排序结果)并更新节点计数和项头表的链表
在这里插入图片描述
Step 3:通过FP树挖掘频繁项集,运用到”条件模式基“的概念
(待验证)

频繁项集与关联规则学习🔗

首先获得频繁项的前缀路径,然后将前缀路径作为新的数据集,以此构建前缀路径的条件 FP 树。然后对条件 FP 树中的每个频繁项,获得前缀路径并以此构建新的条件 FP 树。不断迭代,直到条件 FP 树中只包含一个频繁项为止

(四)关联规则挖掘原理

关联规则挖掘首先需要对上文得到的频繁项集构建所有可能的规则,然后对每条规则逐个计算置信度,输出置信度大于最小置信度的所有规则。以频繁项集{a,b,c}为例,构建所有可能的规则:{b,c} -> {a}, {a,c} -> {b},{a,b} -> {c},{c} -> {a,b},{b} -> {a,c},{a} -> {b,c}。对每条规则计算置信度后,输出满足要求的规则即可。

(五)实战——导演如何选择演员?

# -*- coding: utf-8 -*-
# 下载某个导演的电影数据集
from efficient_apriori import apriori
from lxml import etree
import time
from selenium import webdriver
import csv
driver = webdriver.Chrome()
# 设置想要下载的导演 数据集
director = u'张艺谋'
# 写CSV文件
file_name = './' + director + '.csv'
base_url = 'https://movie.douban.com/subject_search?search_text='+director+'&cat=1002&start='
out = open(file_name,'w', newline='', encoding='utf-8-sig')
csv_write = csv.writer(out, dialect='excel')
flags=[]
# 下载指定页面的数据
def download(request_url):
  driver.get(request_url)
  time.sleep(1)
  html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
  html = etree.HTML(html)
  # 设置电影名称,导演演员 的XPATH
  movie_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']")
  name_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']")
  # 获取返回的数据个数
  num = len(movie_lists)
  if num > 15: #第一页会有16条数据
    # 默认第一个不是,所以需要去掉
    movie_lists = movie_lists[1:]
    name_lists = name_lists[1:]
  for (movie, name_list) in zip(movie_lists, name_lists):
    # 会存在数据为空的情况
    if name_list.text is None: 
      continue
    # 显示下演员名称
    print(name_list.text)
    names = name_list.text.split('/')
    # 判断导演是否为指定的director
    if names[0].strip() == director and movie.text not in flags:
      # 将第一个字段设置为电影名称
      names[0] = movie.text
      flags.append(movie.text)
      csv_write.writerow(names)
  print('OK') # 代表这页数据下载成功
  print(num)
  if num >= 14: #有可能一页会有14个电影
    # 继续下一页
    return True
  else:
    # 没有下一页
    return False

# 开始的ID为0,每页增加15
start = 0
while start<10000: #最多抽取1万部电影
  request_url = base_url + str(start)
  # 下载数据,并返回是否有下一页
  flag = download(request_url)
  if flag:
    start = start + 15
  else:
    break
out.close()
print('finished')
# -*- coding: utf-8 -*-
from efficient_apriori import apriori
import csv
director = u'张艺谋'
file_name = './'+director+'.csv'
lists = csv.reader(open(file_name, 'r', encoding='utf-8-sig'))
# 数据加载
data = []
for names in lists:
     name_new = []
     for name in names:
           # 去掉演员数据中的空格
           name_new.append(name.strip())
     data.append(name_new[1:])
# 挖掘频繁项集和关联规则
itemsets, rules = apriori(data, min_support=0.05,  min_confidence=1)
print(itemsets)
print(rules)

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值