空间co-location模式挖掘基于全连接Join-Base原理与实现
简单来说该文章就是将apriori算法应用到空间模式的挖掘,将事务篮子换为co-location模式,将事务等价为行实例和表实例。引入参与率和参与度来等价支持度。频繁项的挖掘和关联规则的生成还是遵循apriori算法的步骤和核心思想,即先验原理(频繁模式的子集一定是频繁的,非频繁模式的超集一定是不频繁的)。
基本理论知识
空间特征
空间特征(或称空间对象、属性),代表了空间中不同种类的事物。空间特征代表了空间中不同种类的事物的集合。记为F = {f1, f2, f3, …, fn}。把一个具体空间位置上的对象称为空间实例。将实例的集合称为实例集,记为 S = S1 U S2 U …Sn,其中Si(1<=i<=n)是对应空间特征fi的实例集合。

邻近关系
空间邻近关系:描述了空间实例之间的空间关系。可以是拓扑、距离、混合关系。空间邻近关系需要满足自反性和对称性。
以距离关系为例,空间邻近关系R为欧式距离小于等于阈值d,表示为:

团
分布图中一个完全联通子图就是一个团。如{A3,B3,C1,D1}就是一个团

空间co-location模式
一组空间特征集合c,其中c⊆F。如图中{A,B,C}就是一个co-location模式。
行实例和表实例
行实例表示团包含了co-location模式c中的所有特征,并且它的子集不包含c中的所有特征。co-location模式c中的所有行实例集合为表实例。
co-location模式c的长度称为co-location模式的阶。如co-location{A,B,C}的阶为3。
如:
例如:假设{A3,C1,C3}都满足两两邻近,但是不是co-location{A,C}的行实例
co-location{A,B,C}的行实例为{A2,B4,C5}和{A3,B3,C1}。所以表实例为{
{A2,B4,C5},{A3,B3,C1}}
参与率与参与度
简单来说就是数据挖掘里面的支持度,在空间数据挖掘中引入参与率
参与率表示为PR(c,fi),它是fi的实例在空间co-location模式c的所有实例中不重复出现的个数与fi总实例个数的比率。

参与度表示为PI(c),它是空间co-location模式c的所有空间特征的PR值中的最小值。

min_prev是用户给定的最小参与度(最小频繁性)阈值,当PI©>=min_prev 时,称为co-location模式c是频繁的。
co-location规则
c1 => c2(p,cp)称为co-location规则,其中c1和c2是co-location模式,c1∩c2不等于空集,p是规则参与度,cp是规则的条件概率。
条件概率cp是从co-location模式c1推出co-location模式c2的可信度

主要步骤
类似于关联规则挖掘,大多数co-location挖掘算法通常将挖掘任务分解为如下两个子任务:
- 频繁co-location产生:其目标是发现满足最小参与度阈值min_prev的所有co-location模式。
- co-location规则产生:其目标是从上一步发现的频繁co-location模式中提取所有高条件概率的规则。
全连接算法Join-Base:
- 候选co-location的生成:由频繁k阶模式,生成k+1阶候选模式,在判断是否频繁,过程类比apriori算法
- 表实例的生成:k阶模式c1和k阶模式c2连接得到k+1阶候选模式c3,则候选模式c3的表实例是由模式c1的表实例和模式c2的表实例按前k-1个特征相同进行链接,同时要求最后两个实例满足邻近关系R。

书中给出的算法步骤

代码实现
我是基于python实现的,算法步骤与书中给出的步骤有一点出入
说明:
P是频繁项,C是候选项,T_cu是未判断是否满足参与率的表实例集合,T是满足参与率的表实例集合。
首先导入需要用到的包
import itertools
import copy
import math
import numpy as np
import matplotlib.pyplot as plt
准备好需要用到的数据
min_prev = 0.3 #最小参与率
min_conf = 0.3 #最小置信度
ET = ["A","B","C","D"]
E = [["A",1,[24,14]]
,["A",2,[64,44]]
,["A",3,[46,24]]
,["A",4,[63,7]]
,["B",1,[13,3]]
,["B",2,[19,45]]
,["B",3,[47.5,10.5]]
,["B",4,[62,52]]
,["B",5,[13,50]]
,["C",1,[39,11]]
,["C",2,[52,50]]
,["C",3,[40,36]]
,["D",1,[40,20]]
,["D",2,[6,10]]]
R = 16 #设最小邻近关系的距离为16
将数据做可视化,看一下数据的基本关系
#定义可视化函数,方便查看数据之间的关系
def drawData(E,R):
values=[x[2]