Apriori 算法
概念
支持度:某个商品组合出现的次数与总次数之间的比例
置信度:置信度是个条件概念,就是说在 A 发生的情况下,B 发生的概率是多少
提升度:衡量 A 出现的情况下,是否会对 B 出现的概率有所提升
提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)
缺点
- 可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了;
- 每次计算都需要重新扫描数据集,来计算每个项集的支持度。
Apriori 的改进算法:FP-Growth 算法
- 创建了一棵 FP 树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。
- 整个生成过程只遍历数据集 2 次,大大减少了计算量。
其他算法
CBA 算法、GSP 算法
使用 Apriori 工具包
Apriori 虽然是十大算法之一,不过在 sklearn 工具包中并没有它,也没有 FP-Growth 算法,可以通过https://pypi.org/ 搜索工具包,推荐下面的这个包
pip install efficient-apriori
itemsets, rules = apriori(data, min_support, min_confidence)
- data 是要提供的数据集,它是一个 list 数组类型。
- min_support 参数为最小支持度,在 efficient-apriori 工具包中用 0 到 1 的数值代表百分比,比如 0.5 代表最小支持度为 50%。
- min_confidence 是最小置信度,数值也代表百分比,比如 1 代表 100%。
爬取豆瓣宁浩导演的电影以及主演:
# coding:utf-8
from lxml import etree
from selenium import webdriver
from efficient_apriori import apriori
import time
import csv
class Apriori():
def __init__(self):
self.flags = []
def download(self, request_url, csv_write):
# 模拟浏览器行为
driver = webdriver.Chrome()
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(movie.text)
print(name_list.text)
names = name_list.text.replace(' ', '').split('/')
if names[0].strip() == director and movie.text not in self.flags:
names[0] = movie.text
self.flags.append(movie.text)
csv_write.writerow(names)
print('OK') # 代表这页数据下载成功
if num >= 14: # 有可能一页会有14个电影
return True
else:
return False
def start(self):
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')
# 开始的ID为0,每页增加15
start = 0
while start < 10000:
request_url = base_url + str(start)
# 下载数据,并返回是否有下一页
flag = self.download(request_url, csv_write)
if flag:
start = start + 15
else:
break
out.close()
print('finished')
def run_apriori(self):
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)
data.append(name_new[1:])
itemsets, rules = apriori(data, min_support=0.4, min_confidence=1)
print(itemsets)
print(rules)
if __name__ == '__main__':
director = '宁浩'
file_name = r'D:\Study\数据分析实战\宁浩.csv'
run = Apriori()
run.start()
run.run_apriori()
运行结果:
{1: {('黄渤',): 7, ('徐峥',): 6}, 2: {('徐峥', '黄渤'): 6}}
[{徐峥} -> {黄渤}]

1万+

被折叠的 条评论
为什么被折叠?



