python调用R语言,关联规则可视化
首先当然要配置r语言环境变量什么的
D:\R-3.5.1\bin\x64;
D:\R-3.5.1\bin\x64\R.dll;
D:\R-3.5.1;
D:\ProgramData\Anaconda3\Lib\site-packages\rpy2;
本来用python也可以实现关联规则,虽然没包,但是可视化挺麻烦的
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- from pandas import read_csv
- def loadDataSet():
- dataset = read_csv("F:/goverment/Aprior/No Number.csv")
- data = dataset.values[:,:]
- Data=[]
- for line in data:
- ls=[]
- for i in line:
- ls.append(i)
- Data.append(ls)
- #print(Data)
- return Data
- '''
- return [['a', 'c', 'e'], ['b', 'd'], ['b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b'], ['b', 'c'], ['a', 'b'],
- ['a', 'b', 'c', 'e'], ['a', 'b', 'c'], ['a', 'c', 'e']]'''
- def createC1(dataSet):
- C1 = []
- for transaction in dataSet:
- for item in transaction:
- if not [item] in C1:
- C1.append([item])
- C1.sort()
- '''??????????????????????????????????????????????????????'''
- # 映射为frozenset唯一性的,可使用其构造字典
- return list(map(frozenset, C1))
- # 从候选K项集到频繁K项集(支持度计算)
- def scanD(D, Ck, minSupport):
- ssCnt = {}
- for tid in D:
- for can in Ck:
- if can.issubset(tid):
- if not can in ssCnt:
- ssCnt[can] = 1
- else:
- ssCnt[can] += 1
- numItems = float(len(D))
- retList = []
- supportData = {}
- for key in ssCnt:
- support = ssCnt[key] / numItems
- if support >= minSupport:
- retList.insert(0, key)
- supportData[key] = support
- return retList, supportData
- def calSupport(D, Ck, min_support):
- dict_sup = {}
- for i in D:
- for j in Ck:
- if j.issubset(i):
- if not j in dict_sup:
- dict_sup[j] = 1
- else:
- dict_sup[j] += 1
- sumCount = float(len(D))
- supportData = {}
- relist = []
- for i in dict_sup:
- temp_sup = dict_sup[i] / sumCount
- if temp_sup >= min_support:
- relist.append(i)
- supportData[i] = temp_sup # 此处可设置返回全部的支持度数据(或者频繁项集的支持度数据)
- return relist, supportData
- # 改进剪枝算法
- def aprioriGen(Lk, k): # 创建候选K项集 ##LK为频繁K项集
- retList = []
- lenLk = len(Lk)
- for i in range(lenLk):
- for j in range(i + 1, lenLk):
- L1 = list(Lk[i])[:k - 2]
- L2 = list(Lk[j])[:k - 2]
- L1.sort()
- L2.sort()
- if L1 == L2: # 前k-1项相等,则可相乘,这样可防止重复项出现
- # 进行剪枝(a1为k项集中的一个元素,b为它的所有k-1项子集)
- a = Lk[i] | Lk[j] # a为frozenset()集合
- a1 = list(a)
- b = []
- # 遍历取出每一个元素,转换为set,依次从a1中剔除该元素,并加入到b中
- for q in range(len(a1)):
- t = [a1[q]]
- tt = frozenset(set(a1) - set(t))
- b.append(tt)
- t = 0
- for w in b:
- # 当b(即所有k-1项子集)都是Lk(频繁的)的子集,则保留,否则删除。
- if w in Lk:
- t += 1
- if t == len(b):
- retList.append(b[0] | b[1])
- return retList
- def apriori(dataSet, minSupport=0.2):
- C1 = createC1(dataSet)
- D = list(map(set, dataSet)) # 使用list()转换为列表
- L1, supportData = calSupport(D, C1, minSupport)
- L = [L1] # 加列表框,使得1项集为一个单独元素
- k = 2
- while (len(L[k - 2]) > 0):
- Ck = aprioriGen(L[k - 2], k)
- Lk, supK = scanD(D, Ck, minSupport) # scan DB to get Lk
- supportData.update(supK)
- L.append(Lk) # L最后一个值为空集
- k += 1
- del L[-1] # 删除最后一个空集
- return L, supportData # L为频繁项集,为一个列表,1,2,3项集分别为一个元素。
- # 生成集合的所有子集
- def getSubset(fromList, toList):
- for i in range(len(fromList)):
- t = [fromList[i]]
- tt = frozenset(set(fromList) - set(t))
- if not tt in toList:
- toList.append(tt)
- tt = list(tt)
- if len(tt) > 1:
- getSubset(tt, toList)
- #def calcConf(freqSet, H, supportData, ruleList, minConf=0.7):
- def calcConf(freqSet, H, supportData, Rule, minConf=0.7):
- for conseq in H:
- conf = supportData[freqSet] / supportData[freqSet - conseq] # 计算置信度
- # 提升度lift计算lift = p(a & b) / p(a)*p(b)
- lift = supportData[freqSet] / (supportData[conseq] * supportData[freqSet - conseq])
- ls=[]
- if conf >= minConf and lift > 3:
- for i in freqSet - conseq:
- #print(i," ",end="")
- ls.append(i)
- ls.append(" ")
- #print('-->',end="")
- ls.append('-->')
- for i in conseq:
- #print(i," ",end="")
- ls.append(i)
- ls.append(" ")
- #print('支持度:', round(supportData[freqSet - conseq]*100, 1), "%",' 置信度:', round(conf*100,1),"%",' lift值为', round(lift, 2))
- #ls.append(' 支持度:')
- #ls.append(round(supportData[freqSet - conseq]*100, 1))
- #ls.append("% ")
- #ls.append(' 置信度:')
- ls.append( round(conf*100,1))
- ls.append("% ")
- #ls.append( round(lift, 2))
- #ls.append(round(lift, 2))
- #ruleList.append((freqSet - conseq, conseq, conf))
- if ls!=[]:
- #print(len(ls))
- Rule.append(ls)
- # =============================================================================
- # for line in Rule:
- # for i in line:
- # print(i,end="")
- # print("")
- # =============================================================================
- return Rule
- # =============================================================================
- # print(freqSet - conseq, '-->', conseq, '支持度', round(supportData[freqSet - conseq], 2), '置信度:', round(conf,3),
- # 'lift值为:', round(lift, 2))
- # =============================================================================
- # 生成规则
- def gen_rule(L, supportData, minConf=0.7):
- bigRuleList = []
- for i in range(1, len(L)): # 从二项集开始计算
- for freqSet in L[i]: # freqSet为所有的k项集
- # 求该三项集的所有非空子集,1项集,2项集,直到k-1项集,用H1表示,为list类型,里面为frozenset类型,
- H1 = list(freqSet)
- all_subset = []
- getSubset(H1, all_subset) # 生成所有的子集
- calcConf(freqSet, all_subset, supportData, bigRuleList, minConf)
- return bigRuleList
- if __name__ == '__main__':
- dataSet = loadDataSet()
- #print(dataSet)
- L, supportData = apriori(dataSet, minSupport=0.05)
- rule = gen_rule(L, supportData, minConf=0.5)
- for i in rule:
- for j in i:
- if j==',':
- continue
- else:
- print(j,end="")
- print("")
- '''
- 具体公式:
- P(B|A)/P(B)
- 称为A条件对于B事件的提升度,如果该值=1,说明两个条件没有任何关联,
- 如果<1,说明A条件(或者说A事件的发生)与B事件是相斥的,
- 一般在数据挖掘中当提升度大于3时,我们才承认挖掘出的关联规则是有价值的。
- '''
之后还是用r吧,要下载rpy2,见https://www.cnblogs.com/caiyishuai/p/9520214.html
还要下载两个R的包
- import rpy2.robjects as robjects
- b=('''
- install.packages("arules")
- install.packages("arulesViz")
- ''')
- robjects.r(b)
然后就是主代码了
- import rpy2.robjects as robjects
- a=('''Encoding("UTF-8")
- setwd("F:/goverment/Aprior")
- all_data<-read.csv("F:/goverment/Aprior/NewData.csv",header = T,#将数据转化为因子型
- colClasses=c("factor","factor","factor","factor","factor","factor","factor","factor","factor","factor","factor","factor"))
- library(arules)
- rule=apriori(data=all_data[,c(1,4,5,6,7,8,9,10,12)], parameter = list(support=0.05,confidence=0.7,minlen=2,maxlen=10))
- ''')
- robjects.r(a)
- robjects.r('''
- rule.subset<-subset(rule,lift>1)
- #inspect(rule.subset)
- rules.sorted<-sort(rule.subset,by="lift")
- subset.matrix<-is.subset(rules.sorted,rules.sorted)
- lower.tri(subset.matrix,diag=T)
- subset.matrix[lower.tri(subset.matrix,diag = T)]<-NA
- redundant<-colSums(subset.matrix,na.rm = T)>=1 #这五条就是去冗余(感兴趣可以去网上搜),我虽然这里写了,但我没有去冗余,我的去了以后一个规则都没了
- which(redundant)
- rules.pruned<-rules.sorted[!redundant]
- #inspect(rules.pruned) #输出去冗余后的规则
- ''')
- c=('''
- library(arulesViz)#掉包
- jpeg(file="plot1.jpg")
- #inspect(rule.subset)
- plt<-plot(rule.subset,shading = "lift")#画散点图
- dev.off()
- subrules<-head(sort(rule.subset,by="lift"),50)
- #jpeg(file="plot2.jpg")
- plot(subrules,method = "graph")#画图
- #dev.off()
- rule.sorted <- sort(rule.subset, decreasing=TRUE, by="lift") #按提升度排序
- rules.write<-as(rule.sorted,"data.frame") #将规则转化为data类型
- write.csv(rules.write,"F:/goverment/Aprior/NewRules.csv",fileEncoding="UTF-8")
- ''')
- robjects.r(c)
- #取出保存的规则,放到一个列表中
- from pandas import read_csv
- data_set = read_csv("F:/goverment/Aprior/NewRules.csv")
- data = data_set.values[:, :]
- rul = []
- for line in data:
- ls = []
- for j in line:
- try :
- j=float(j)
- if j>0 and j<=1:
- j=str(round(j*100,2))+"%"
- ls.append(j)
- else:
- ls.append(round(j,2))
- except:
- ls.append(j)
- rul.append(ls)
- for line in rul:
- print(line)
python调用R语言,关联规则可视化的更多相关文章
- Python调用R语言
网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的<数据科学中的R语言>,书中一直强调,工具不 ...
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
- python 调用 R,使用rpy2
python 与 R 是当今数据分析的两大主流语言.作为一个统计系的学生,我最早接触的是R,后来才接触的python.python是通用编程语言,科学计算.数据分析是其重要的组成部分,但并非全部:而R ...
- 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 – 比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...
- python调用C语言接口
python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题 ...
- Python调用R编程——rpy2
在Python调用R,最常见的方式是使用rpy2模块. 简介 模块 The package is made of several sub-packages or modules: rpy2.rinte ...
- .Net调用R语言
///加载自己写的R语言算法库 public List<double> GetZTFB(double[] data) { List<double> par = new List ...
- .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...
- shell中调用R语言并传入参数的两种步骤
shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...
随机推荐
- 一年25个里程碑!免疫疗法“战胜”癌症,靠的是实力(5篇Science、6篇Nature )--转载
近几年,免疫疗法的成功使癌症治疗进入了新的时代.无论是科研界,还是商业界,都丝毫没有掩饰对这一领域的热情.2016年,Cell杂志公布的年度十大最佳论文中,免疫疗法占两席.事实上,这两项成果只是去年癌 ...
- shell 变量赋值运算
.变量赋值: name=lbg 等号前后不能有空格 name="Lebron James" 变量值中有空格要用双引号 echo ${name} 用${}更保险 shopt -s - ...
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- 《WAP》第一次作业:团队亮相
一.队名:WAP! 二.团队成员组长 组员 : 201571030302/杜有海 201571030327/乌勒扎 201571030304/郝明宇 201571030318/马麒 组长: 20157 ...
- RabbitMQ入门_03_推拉模式
我们知道,消费者有两种方式从消息中间件获取消息: 推模式:消息中间件主动将消息推送给消费者 拉模式:消费者主动从消息中间件拉取消息 推模式将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息. ...
- 雷林鹏分享:Ruby 正则表达式
Ruby 正则表达式 正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的 ...
- ADSL拨号上网或者光纤上网设置概要(原创)
不管是在梧州设置光纤还是在太平设置ADSL拨号上网每次设置上网一体机的时候都是遇到各种麻烦...这次又是弄了N久,每次问题各不一样.总结一下操作过程,方便以后又遇问题回头查询自个微博.一.设置电话线的 ...
- Android Studio之高德地图实现定位和3D地图显示
在应用开发中,地图开发是经常需要使用的“组件”,国内比较出名的是就是百度地图和高德地图. 此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码. 效果如图: 首先 ...
- tortoiseGIT保存用户名密码
虽然GIT可以使用SSH来免去输入用户名密码的麻烦,但是更多的人我相信还是比较喜欢使用tortoiseGIT. 使用HTTP模式的代码库可以通过保存用户名密码的方式来免去重复输入的麻烦. 首先安装gi ...
- copy assign retain 修饰属性的set 方法
@property (nonatomic,retain) NSString * name; - (void)setName:(NSString*)name { [name retain]; 把传进 ...