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


title: 【PHP-ML】使用Apriori算法挖掘用户购物习惯
date: 2018-01-12
categories:

  • 技术
    tags:
  • PHP
  • PHP-ML
  • 机器学习
  • 学习笔记


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方法获取所有的频繁项集。


$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
    (
    )
)

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

// 获取生成的关联规则
$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:
先验算法采用 广度优先搜索算法进行搜索并采用 树结构来对候选项目集进行高效计数。它通过长度为 的候选项目集来产生长度为 的候选项目集,然后从中删除包含不常见子模式的候选项。根据 向下封闭性引理,该候选项目集包含所有长度为 的频繁项目集。之后,就可以通过扫描交易数据库来决定候选项目集中的频繁项目集。
在写demo的过程中也发现了这个问题,当商品数量多,清单条数大,生成的候选项集非常多,在筛选效率上存在一定的局限性。这时候或许就要选择别的算法了:)

你可能感兴趣的:(【PHP】,【PHP-ML】)