Association rules 和 LDA topics

笔记内容:

  • association rules的简要原理及适用范围
  • association rules的R实现及结果解读
  • LDA topics简释,python实现及结果解读
association rules(关联规则)的简要原理及适用范围

各种association rules的教程和介绍里,总会提到超市货架摆放:有些商品总是被一起购买,也就是同时出现在同一笔交易(transaction)里。比方说洗发水和护发素,牛奶和面包等。将这些常常被同时购买的商品摆放在一起,有助于促进消费,提高营业额。
它适用于n组分类变量的组合,了解这些分类变量之间的关联是否紧密。它的input一般是n条list, 每个list里是同时出现的分类变量(items)。在超市的例子里,每个transaction就是一笔交易,当然也可以是一个患者一次就诊的所有诊断结果,处方药物名称,接受的治疗名称... ....

transaction1 a b c d
transaction2 a b c 
transaction3 a e p u o y
transaction4 r b 
...

量化items之间的关联有以下几个参数:
support{a,b,c..}: "How popular the items are" 一个或者多个items的组合,出现的频率。如下所示:

Association rules 和 LDA topics_第1张图片

confidence{x -> y}: 在x出现的条件下,y也出现的可能性。显然,如果x,y调换位置,值会不一样。如下所示,support{apple,beer}是3/8, support{apple}是4/8,则confidence{apple->beer}为3/4.

Association rules 和 LDA topics_第2张图片

lift{x -> y}: 在x出现的条件下,且在矫正了y的出现频率,y也出现的可能性=1则表明x和y没有太大关联,<1即在x出现时,y出现的可能性小,>1为在x出现时,y出现的可能性大。如下所示,lift{apple->beer} = (3/8)/((4/8)*(6/8))=1,说明apple和beer没有什么关联。

Association rules 和 LDA topics_第3张图片
association rules的R实现及结果解读
library(arules)
library(arulesViz)
library(htmlwidgets)
data("Groceries")  #arules的自带数据集

# data <- read.transactions("xxx.csv",fromat='basket')
# 如果从本地导入一条一条的数据则如上所示
rules <- apriori(Groceries, parameter = list(support = 0.001, confidence=0.8))
# support和confidence这里为cutoff值,只选用support大于0.001及confidence大于0.8的组合(rules)
inspect(rules[1:5])  #先只看前20个rules
     lhs                         rhs                    support confidence      lift count
[1]  {liquor,                                                                             
      red/blush wine}         => {bottled beer}     0.001931876  0.9047619 11.235269    19
[2]  {curd,                                                                               
      cereals}                => {whole milk}       0.001016777  0.9090909  3.557863    10
[3]  {yogurt,                                                                             
      cereals}                => {whole milk}       0.001728521  0.8095238  3.168192    17
[4]  {butter,                                                                             
      jam}                    => {whole milk}       0.001016777  0.8333333  3.261374    10
[5]  {soups,                                                                              
      bottled beer}           => {whole milk}       0.001118454  0.9166667  3.587512    11

plot(rules[1:15],method = 'graph',max=1000)
plot(rules[1:15],method = 'graph',engine = 'interactive', max=1000) #生成交互式图

win系统上的交互式图截图如下所示:

Association rules 和 LDA topics_第4张图片

每个绿色圆圈代表一个item。
粉色或者红色的圆圈连接两个items,代表了这两个item的关联程度。红色越表明关联越密切(两者同时出现的可能性更高),越代表关联越不紧密。
粉色或者红色的圆圈大小代表了关联的support,即出现的频率。一个组合(rule)出现的频率越高,圆圈越

找到这些组合意义不仅仅在于发现“谁和谁更可能出现在一起”,也可能为扩展现有知识库提供线索。比方说在基于电子病历的分析中,通过研究大样本量的患者诊断结果,发现某些疾病和某些疾病更有可能同时出现在一起,可以验证现有的医学知识,也可能发现新的疾病关系谱。

LDA topics简释,python实现及结果解读

LDA(隐含迪利克雷分布,Latent Dirichlet Allocation)是一种应用于自然语言处理的主题建模技术,用于将文本转化成一系列主题,即辨别出一个文本讲了那些主题内容。和关联规则(association rules)类似。它提供的是主题分布,即各个主题出现的概率大小。它最终的output是一系列主题,每个主题中是一系列构成这个主题的“词”。

...=_=具体的原理我也不太懂,可以参考一下这篇博客。
(如果哪天我懂了就写上来)
使用gensim模块的python实现:

from gensim.corpora.dictionary import Dictionary
from gensim.models import LdaModel
from tqdm import tqdm  # 用来弄一个进度条
# 比方说input是XXX.csv:
# transaction1,a,b,c,d
# transaction2,a,b,c 
# transaction3,a,e,p,u,o,y
# transaction4,r,b 
# ...

cases_in = []
with open("XXX.csv") as f:
   for line in f:
       line = line.strip('\n')
       li = line.split(',')
       cases_in.append(li)

mdict = Dictionary(cases_in)
mcorpus = [mdict.doc2bow(i) for i in tqdm(fever_in)]
mlda = LdaModel(mcorpus, num_topics=15, iterations=1000, id2word=mdict)
# 设置15个topics

# visualization可视化
from pyLDAvis.gensim import prepare
import pyLDAvis
vis = prepare(mlda, mcorpus, mdict)
pyLDAvis.save_html(vis, open("lda.html"),'wb'))
# 然后可以直接打开html文件在web看到可视化结果

# save topic to txt:把你得到的主题存下来
topic15 = mlda.print_topics()
# print topic15得到:
# [(0, u'0.026*"4019" + 0.017*"486" + 0.014*"2724" + 0.014*"4280" + 0.014*"51881" + 0.012*"2762" + 0.011*"25000" + 0.010*"42731" + 0.010*"3051" + 0.009*"41401"'), (1, u'0.020*"2724" + 0.019*"4...
# 是一个包含了15个topics的list,每个topic是一个tuple, 包括 (topic序号,'出现的概率*词 + 出现的概率*词...')
topic15_df = pd.DataFrame()
for tu in topic15:
   indx = tu[0]
   di = [i.split('*')[1].strip('"') for i in tu[1].split(' +')]
   with open(os.path.join(in_dir,'XXXtopic15.csv'),'a') as f:
       f.write(str(indx) + ',')
       for d in di:
           f.write(d + ',')
       f.write('\n')

于是结果是output出你设置好的若干个topics,这些topics里有一系列词,默认出现频率最高的前10个词。比方说在电子病历分析中,这些词全部都是诊断代码,我们可以归纳出每个topic里的诊断代码是关系紧密的,可能具有共同的"topic"。对于一些topic里的诊断代码用现有医学知识不能关联在一起的,可能会为开发新的医学知识库提供线索,也可能是一些误差。需要根据具体情况分析。

参考链接:
association rules R 实现
association rules 概念参考
LDA的python实现及释义参考
gensim文档

你可能感兴趣的:(Association rules 和 LDA topics)