盒子
盒子
文章目录
  1. 实践
  2. 总结
    1. 关联规则(为什么买啤酒的人想去买唇膏?)
    2. 大数据挖掘存在的局限

【PHP-ML】使用Apriori算法挖掘用户购物习惯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Association\Apriori;

// 4位用户购买清单
$samples = [
['啤酒', '尿布', '儿童玩具'],
['尿布', '儿童玩具','笔记本电脑'],
['啤酒','耳机', '唇膏'],
['啤酒','唇膏', '高跟鞋']
];
$labels = [];

/*
* Apriori 参数
* support支持度
* confidence 自信度
*/
$associator = new Apriori($support = 0.5, $confidence = 0.5);
$associator->train($samples, $labels);

$res = $associator->predict(['啤酒']);
print_r($res);
// Array([0] => Array( [0] => 唇膏) )

实践


数据挖掘是从一个数据集中提取信息,并将其转换成可理解的结构,以进一步使用。本次实践模拟用户购买的商品清单,提取关联性,最后根据用户购买欲望推荐关联商品。该实例告诉我们,买啤酒的人想去买唇膏。

总结


定律

1、如果一个集合是频繁项集,则它的所有子集都是频繁项集。

频繁项集的意思是,假设集合{‘啤酒’, ‘尿布’}是频繁项集,那么其中的‘啤酒’、‘尿布’同时出现在一条清单记录中的次数是大于或等于最小支持度的(构造参数中的support),则该集合的子集{‘啤酒’}、{‘尿布’}也必定大于或等于support,也就是说,它的子集也都是频繁项集。

2、如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。

结合第一定律,反之亦然,如果集合{‘啤酒’}不是频繁项集,那么它的超集{‘啤酒’, ‘尿布’}也不是频繁项集。

 

可以通过apriori方法获取所有的频繁项集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$res = $associator->apriori();
print_r($res);
Array
(
[1] => Array
(
[0] => Array
(
[0] => 啤酒
)
[1] => Array
(
[0] => 尿布
)
[2] => Array
(
[0] => 儿童玩具
)
[5] => Array
(
[0] => 唇膏
)
)

[2] => Array
(
[2] => Array
(
[0] => 啤酒
[1] => 唇膏
)
[3] => Array
(
[0] => 尿布
[1] => 儿童玩具
)
)
[3] => Array
(
)
)

关联规则(为什么买啤酒的人想去买唇膏?)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 获取生成的关联规则
$rules = $associator->getRules();
print_r($rules);

Array
(
[0] => Array
(
[antecedent] => Array
(
[0] => 啤酒
)
[consequent] => Array
(
[0] => 唇膏
)
[support] => 0.5
[confidence] => 0.66666666666667
)
[1] => Array
(
[antecedent] => Array
(
[0] => 唇膏
)
[consequent] => Array
(
[0] => 啤酒
)

[support] => 0.75
[confidence] => 1
)
[2] => Array
(
[antecedent] => Array
(
[0] => 尿布
)
[consequent] => Array
(
[0] => 儿童玩具
)
[support] => 0.5
[confidence] => 1
)
[3] => Array
(
[antecedent] => Array
(
[0] => 儿童玩具
)
[consequent] => Array
(
[0] => 尿布
)
[support] => 0.5
[confidence] => 1
)
)

可以通过getRules方法获取生成的关联规则。由上可知,一共生成了4组关联,每一组有4个属性,意思很明确,

从以上的购物清单可知,存在4组关联,


  • 买啤酒会去买唇膏

  • 买唇膏会去买啤酒

  • 买尿布会去买儿童玩具

  • 买儿童玩具会去买尿布


因为我们输入了“啤酒”,所以,推荐给我们“唇膏”。

大数据挖掘存在的局限


wiki:

先验算法采用广度优先搜索算法进行搜索并采用结构来对候选项目集进行高效计数。它通过长度为k-1的候选项目集来产生长度为k的候选项目集,然后从中删除包含不常见子模式的候选项。根据向下封闭性引理,该候选项目集包含所有长度为k的频繁项目集。之后,就可以通过扫描交易数据库来决定候选项目集中的频繁项目集。

在写demo的过程中也发现了这个问题,当商品数量多,清单条数大,生成的候选项集非常多,在筛选效率上存在一定的局限性。这时候或许就要选择别的算法了:)

请我喝一杯咖啡
扫一扫,支持funsoul
  • 微信扫一扫