跟导师联系了一下,以后一段时间恐怕不会做粗糙集相关的内容,又要回到深度学习的深坑。在只有一张GTX1060 3G的情况下能不能出关于深度学习的成果哦,心里有点没底。哎不管怎么说先把挖的粗糙集的坑先填了,再重温一下深度学习的基本概念。
上一篇文章的主要内容是知识约简和核,但是经过约简并没有对西瓜进行分类。要实现分类需要引入相对约简核相对核的概念。
和上一篇文章所介绍的约简概念不同的是,相对约简聚焦于知识之间的关系。放在西瓜数据集中就是聚焦于条件属性和决策属性之间的关系,再通俗一点说就是看是否是好瓜与{色泽,根蒂,敲声,纹理,脐部,触感}这些属性之间的关系,这么说是不是有点像分类器的概念了。
理论上来讲可以用所有属性对是否是好瓜进行表达。但是有些属性是可省的。可以求条件属性集合的决策属性约简。从而推断出决策规则。注意这两篇文章都是对一致决策表进行讨论。
为方便表达先介绍一下决策表的基本概念。设S=(U,A,V,f)为一个信息系统。如果能将属性集合A划分为一个条件属性集合C(非空)和一个决策属性集合D(非空)的并且C交D为空,则称此信息系统为一个决策表。这里的C对应的是{色泽,根蒂,敲声,纹理,脐部,触感},D对应的是{好瓜}。因此我的目的是pos{Cxx}(D)=pos{C}(D)。{Cxx}就是要求得的约简。
pos{Cxx}(D)实际等于pos{Cxx}(X)的并,其中X属于U/D。这里X就是(好瓜,坏瓜),只需要遍历所有X的Cxx正域,然后一一对比是否和X的C正域相等即可。核心函数下
def Pos_2_attributes(C,D):
answer = []
for A in C:
for B in D:
if A.issubset(B):
answer.append(A)
# 循环的目的是看U/Cxx是否是属于D,换句话说U/Cxx是否是D的正域。
if answer != []:
union = answer[0]
for a in answer:
union = union|a
# 作用是把所有是正域的元素并在一起,便于后面统计是否相等
else:
union = set()
return union
总体代码为:
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 12 10:24:42 2019
@author: BHN
"""
import pandas as pd
import itertools
def Deal_data():
# pandas分为Series和DataFrame两种数据形式。Series可以视为一维数组,DataFrame与array
# 的区别是其数据类型可以是不相同的
df=pd.read_csv('data//watermelon.csv', encoding='gb18030')
# print(df.columns)#打印pandas的标签
# df.drop(df.columns[0],axis=1,inplace=True)#删除某一列
answer = {}
for class_num,a in enumerate(list(df.columns[1:-1])): #删除第一列的序数和最后一列的决策属性
one_class_label = list(set(df[a].values))#DataFrame对应转成numpy的是to_numpy()
# 这行的功能是查看这一个属性中有几种独立的label
single_class_conditional_attribute_set = []
for b in one_class_label:
single_class_conditional_attribute_set.append(set(df[df[a] == b].ID.values))
answer[str(class_num)]=single_class_conditional_attribute_set
answer_decision = {}
one_class_label = list(set(df[df.columns[-1]].values))
single_class_conditional_attribute_set = []
for b in one_class_label:
single_class_conditional_attribute_set.append(set(df[df[df.columns[-1]] == b].ID.values))
answer_decision['0']=single_class_conditional_attribute_set
return answer,answer_decision
def liang_zu_guan_xi_de_deng_jia_lei(list_a,list_b):
answer = []
for A in list_a:
for B in list_b:
tmp = A&B
if tmp != set():
answer.append(tmp)
return answer
def Pos_2_attributes(C,D):
answer = []
for A in C:
for B in D:
if A.issubset(B):
answer.append(A)
# 循环的目的是看U/Cxx是否是属于D,换句话说U/Cxx是否是D的正域。
if answer != []:
union = answer[0]
for a in answer:
union = union|a
# 作用是把所有是正域的元素并在一起,便于后面统计是否相等
else:
union = set()
return union
if __name__ =='__main__':
conditional_attribute_set,decision_attribute_set = Deal_data()
equivalence_class_count = len(conditional_attribute_set)
for level in range(2,equivalence_class_count+2):#因为是二元关系,所以二元关系对的层数是总数减一
# 如果leve为2代表U/{a,b},如果level为3代表U/{a,b,c}
for class_combination in itertools.combinations(range(equivalence_class_count), level):
# 枚举不重复的等价类组合。例如:('A', 'B') ('A', 'C') ('A', 'D') ('B', 'C') ('B', 'D') ('C', 'D')
combination_id = "".join([str(o) for o in class_combination])
previous_equivalence_class_id = combination_id[:-1]
latter_equivalence_class_id = combination_id[-1]
conditional_attribute_set[combination_id] = \
liang_zu_guan_xi_de_deng_jia_lei(\
conditional_attribute_set[previous_equivalence_class_id],\
conditional_attribute_set[latter_equivalence_class_id])
decision_attribute_number = 0
for a in decision_attribute_set['0']:
decision_attribute_number = decision_attribute_number + len(a)
for key in conditional_attribute_set:
union = Pos_2_attributes(conditional_attribute_set[key],decision_attribute_set['0'])
if len(union) == decision_attribute_number:
print(key)
# print(union)
这样就可以求出所有相对约简。
0135
0235
0345
01235
01345
02345
012345
可以看见约简并不唯一。最后可以通过相对约简求得决策规则。决策规则的求取我认为比较简单,在周炜编著的《粗糙集理论及应用》第84页有介绍。我就懒得写了。。。。。。。。。。。