对于粗糙集的算法这里不再过多赘述,主要讲解下实现思路和张贴代码。

实验是根据山东大学学报的基于粗糙集的协同过滤算法研究进行复现。

约简前后的对比放在下面这个链接里面,同时还有一个spyder保存下来的变量缓存。

链接:https://pan.baidu.com/s/1dCqh0sTY-qWwA3BU9eBCZQ 
提取码:oy8e

  1. 首先使用DataFrame读取Movielens的数据集
  2. 这里的决策系统及决策表的建立是将用户当作样本,项目当成属性,决策属性为用户的划分。
  3. 选择一个条件子集C,同时建立子集B⊆C,条件a∈C-B。
  4. 使用子集C对样本进行划分并求出下近似集。使用子集B对样本进行划分求出另一下近似集。
  5. 依据计算公式求出依赖度,并删除符合约简条件的属性a。
  6. 重复4、5步骤直到遍历完所有项目。

以上是算法的核心逻辑块,但是这里存在一个遍历的问题,即可能会存在约简的片面性和不完整性,对于不同的子集属性a的依赖度是不相同的,但算法会在其中一个确定不需要属性a的过程将其删除。

在划分和寻找下近似过程中建议参考不同的约简算法,我为了图省事直接进行循环遍历造成很多不必要的算力浪费,省也没省下反而花费更多时间计算,时间复杂度太高了,建议各位认真看看约简相关的算法去重构一下。

其本质是不断的集合操作,但是会造成大量重复。

下面张贴划分的代码,其user的含义使制定一个user的项目集为属性集C。因在全局范围内已有Date变量所以这里用Data来作为传入参数。

约简代码已改进。这个版本能保证约简完全并且时间快几倍。

def getSpDS(Data,userset):JudList=[]count=0tempul=set(Data.index.get_level_values(0))itemset=set()if userset !=set():for user in userset:if user in Data.index.get_level_values(0):aitemset=set(Data.loc[user].index)itemset=itemset | aitemsetelse:passdatalist=[]#用来存放 [(user,itemset)] #获得可能相关的所有用户,得到用户集tempul#去重 这是所有与目标用户相关的用户集#将数据打包成统一格式for temp in tempul:if ({temp},set(np.array(Data.loc[temp].index).tolist())) not in datalist:               datalist.append( ({temp},set(np.array(Data.loc[temp].index).tolist())&itemset  )  )#此步为避免重复计算exam=[]for data in datalist:exam.append(data)for dataa in datalist:           if data!=dataa and dataa not in exam:newone=data[1] & dataa[1]if newone !=set():if len(newone)>=len(data[1]) and len(newone)>=len(dataa[1]):datalist.append((data[0] | dataa[0],newone))datalist.remove(data)datalist.remove(dataa)count+=1breakelse:continueelse:continueelse:continueexam.clear()   JudList.extend(datalist)exam=[]temp=[]for tup in JudList:if tup not in exam:exam.append(tup)        for tupp in JudList:if tupp not in exam and tupp!=tup:if tupp[0].issubset(tup[0]) and len(tup[0])!=len(tupp[0]):print(1)if len(tupp[1])>len(tup[1]):temp.append(tup)JudList.append((tup[0]-tupp[0],tup[1]))else:temp.append(tupp)exam.append(tupp)continueelif tup[0]&tupp[0]!=set():print(2)if len(tupp[1])>len(tup[1]):itemset=tupp[1]else:itemset=tup[1]same=tup[0]&tupp[0]JudList.append((same,itemset))if tupp[0]-same!=set():JudList.append((tupp[0]-same,tupp[1]))if tup[0]-same!=set():JudList.append((tup[0]-same,tup[1]))exam.append(tupp)exam.append(tup)temp.append(tupp)temp.append(tup)else:continueelse:continueelse:continuefor tp in temp:if tp in JudList:JudList.remove(tp)temp=[]t=set()for tup in JudList:if tup[1]==set():temp.append(tup)for tup in temp:t=t | tup[0]JudList.remove(tup)JudList.append((t,set()))finnal=[]for tup in JudList:if tup not in finnal and tup[0] !=[] and tup[0]!=set():count+=1finnal.append(tup)print("----")print("计算次数",count)print(finnal)print("----")return finnal

为使约简略微完整,这里子集贪心选择了具有此项目的所有用户的项目集。

def reduceAtr(Data):tobeuser=set(np.array(Data.index.get_level_values(0)))tobeitem=set(np.array(Data.index.get_level_values(1)))DataAtr=getAveRecord(Data)DecUser=getAllAtr(Data,DataAtr)AllCard=len(tobeuser)#C为User的项目集#B为去掉后的项目集D2tbi=[]for item in tobeitem:tbi.append((item,len(Data.xs(item,level=1).index)))tbi.sort(key=lambda x:x[1])for item in tbi:waituser=set(np.array(Data.xs(item[0],level=1).index))D1=getSpDS(Data, waituser)print(D1)D1N=0for tup in D1:if tup[0].issubset(DecUser[0]) or tup[0].issubset(DecUser[1]) or tup[0].issubset(DecUser[2]):D1N+=len(tup[0])tobetrain=Data.drop(item[0],level=1,inplace=False)D2=getSpDS(tobetrain,waituser)D2N=0print(D2)for tup in D2:if tup[0].issubset(DecUser[0]) or tup[0].issubset(DecUser[1]) or tup[0].issubset(DecUser[2]):D2N+=len(tup[0])if D1N/AllCard-D2N/AllCard==0:          print("约简开始")print(waituser)print(item[0])Data.drop(item[0],level=1,inplace=True)return Data

基于pandas的粗糙集依赖度约简算法思路及实现相关推荐

  1. 【机器学习】粗糙集属性约简算法与mRMR算法的本质区别

    1. 粗糙集属性约简算法仅仅选出属性重要度大的条件加入约减中,没有考虑约简中条件属性相互之间的冗余性,得到的约简往往不是都必要的,即含有冗余属性. 2. mRMR算法则除了考虑特征与类别之间的相关性, ...

  2. 混合型数据的邻域条件互信息熵属性约简算法

    混合型数据的邻域条件互信息熵属性约简算法 兰海波 中国气象局公共气象服务中心 摘要:属性约简是粗糙集理论的重要研究内容之一,其主要目的是消除信息系统中不相关的属性,降低数据维度并提高数据知识发现性能. ...

  3. 【机器学习】粗糙集属性约简—Attribute Reduction

    介绍 RoughSets算法是一种比较新颖的算法,粗糙集理论对于数据的挖掘方面提供了一个新的概念和研究方法.本篇文章我不会去介绍令人厌烦的学术概念,就是简单的聊聊RoughSets算法的作用,直观上做 ...

  4. 粗糙集约简 程序 matlab,粗糙集属性约简matlab程序

    粗糙集-属性约简-matlab程序 Data2为条件属性, decision2为决策属性 %%%my_test函数实现 clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%读取 ...

  5. 粗糙集matlab程序,粗糙集属性约简matlab程序

    <粗糙集属性约简matlab程序>由会员分享,可在线阅读,更多相关<粗糙集属性约简matlab程序(4页珍藏版)>请在人人文库网上搜索. 1.粗糙集-属性约简-matlab程序 ...

  6. 独家 | 基于Python的遗传算法特征约简(附代码)

    作者:Ahmed Gad 翻译:张睿毅 校对:丁楠雅 本文4700字,建议阅读15分钟. 本教程主要使用numpy和sklearn来讨论如何使用遗传算法(genetic algorithm,GA)来减 ...

  7. python遗传算法_基于Python的遗传算法特征约简(附代码)

    导言 在某些情况下,使用原始数据训练机器学习算法可能不是合适的选择.该算法在接受原始数据训练时,必须进行特征挖掘,以检测不同组之间的差异.但这需要大量的数据来自动执行特征挖掘.对于小数据集,数据科学家 ...

  8. python实现遗传算法实例_基于Python的遗传算法特征约简(附代码)

    作者:Ahmed Gad 翻译:张睿毅 校对:丁楠雅 本文4700字,建议阅读15分钟. 本教程主要使用numpy和sklearn来讨论如何使用遗传算法(genetic algorithm,GA)来减 ...

  9. 粗糙集 遗传matlab,一种基于遗传算法和粗糙集的属性约简方法及精神状态评估方法...

    一种基于遗传算法和粗糙集的属性约简方法及精神状态评估方法 [专利摘要]本发明公开了一种基于遗传算法和粗糙集的属性约简方法及精神状态评估方法,该基于遗传算法和粗糙集完成了粗糙集属性约简方法通过设定合适的 ...

最新文章

  1. .NET中常见的 IL 指令集
  2. IE与Chrome对相对URL解析的区别
  3. 手把手教你研发属于自己的智能无人机
  4. Vuex在项目中使用
  5. 灯塔,大海,大风。(一)
  6. maven 一个简单项目 —— maven权威指南学习笔记(三)
  7. 五子棋 AI(AIpha-beta算法)
  8. 树莓派模拟电路_基于树莓派的热电偶测量模块 MCC 134
  9. 解决斑马打印机打中文的问题
  10. 知网下载论文CAJ格式转为PDF格式
  11. python 表情包 网站源码_Python实现表情包的代码实例
  12. ie 无人操作自动关闭_为什么ie11打开未响应然后闪退_win10ie打开就未响应自动关闭的解决方法...
  13. info There appears to be trouble with your network connection. Retrying
  14. 【数据说第四期】篮球比赛中的投篮选择
  15. python处理视频图像_图像/视频处理选项
  16. N76E003 串口接收字符串,完整输出
  17. back-end 后端开发面试题
  18. 雷达回波脉冲压缩python代码
  19. 从金鸡百花电影节,看“鼓浪屿元宇宙”的元力、魅力与想象力
  20. cockroachDB学习总结

热门文章

  1. 百度搜索标题设置说明
  2. SAP中显示技术名称和描述的设置
  3. Spring Cloud Alibaba Nacos 分布式配置中心
  4. Go语言基础入门(TIME)
  5. win10禁止安装,详细教您win10如何设置禁止安装软件
  6. 智卡调度APP的隐私声明
  7. 大数据多样性体现在包括_书摘:复杂的证据定位:电子数据的多样性
  8. Python基础教程100天:Day03-分支结构
  9. IDEA代码抽取为方法快捷键
  10. ansys时间步长怎么设置_在 ANSYS Workbench 的动态、静态仿真中,设置子步长(时间步长)的目的分别是什么?_学小易找答案...