python--数据挖掘中GSP算法
一、DSP算法与Apriori的不同
GSP算方法跟Apriori算法很类似
唯一的不同就是频繁项的选择
Apriori算法:https://blog.****.net/qq_43372138/article/details/89279586
Apriori算法频繁项集的选择是无序的
例如:
A=(a,b),B=(b,a)
A,B是两个频繁项集
在Apriori中,A,B是同一个频繁项集
在DSP算法中,A,B是不同的频繁项集
二、DSP算法思想
DSP还是跟Apriori一样先找出含一个元素的频繁项集
然后就不同了
DSP用一个元素的频繁项集进行两辆组合形成规则L2候选序列S2
然后找出S2的频繁项集(这里找频繁项是看候选序列的相对位置,不一定要全部挨在一起)
这时候要生成L3的候选序列该肿么办呢?
例如:
A=(a,b,v)和B=(b,v,d)两个频繁项集
如果A除了第一个元素‘a’,B除了最后一个元素‘d’,A,B其他元素都一样
那么可以生成L3的候选序列S3(a,b,v,d)
然后不停的找L4,L5,L6。。。的候选序列直到找不出来为止
三、实例
数据:
代码:
import re
import pandas as pd
from collections import defaultdict as de
def dell(d,na):
for i in na:
del d[i]
return d
def gps_de(d,n):
name=[]
for k,v in d.items():
if v<n:
name.append(k)
return dell(d,name)
def gps_cr(d):
name=[]
for k,v in d.items():
name.append(k)
name_new=[i+j[-1] for i in name for j in name if i[1:]==j[:-1]]
return name_new
def gps_crdi(name,dataset):
r=de(int)
for i in name:
b=''
for j in range(len(i)-1):
b+=i[j]+'.*'
b+=i[-1]
for i in dataset['booknumber'].values:
i_new=i.replace(',','')
res=re.search(b,i_new)
if not(res==None):
r[b.replace('.*','')]+=1
return r
with open('C:\\Users\\F.S.Z\\Desktop\\gsp.csv')as f:
dataset=pd.read_csv(f)
r_1=[]
r_1_di=de(int)
for i in dataset['booknumber'].values:
for j in set(i.split(',')):
r_1_di[j[0]]+=1
di=gps_de(r_1_di,2)
print('L1:')
print(di)
name=[]
for k,v in di.items():
name.append(k)
name_new=[i+j for i in name for j in name]
r_di=gps_crdi(name_new,dataset)
di_3=gps_de(r_di,2)
nuu=1
while(len(di_3)!=0):
print('L'+str(nuu+1)+':')
print(di_3)
name_n=gps_cr(di_3)
r_di=gps_crdi(name_n,dataset)
di_3=gps_de(r_di,2)
nuu+=1
结果:
a,b。。。是按时间买书名
这样我们就可以按照规则L5有序的进行推荐