利用粗糙集进行西瓜分类(下)

跟导师联系了一下,以后一段时间恐怕不会做粗糙集相关的内容,又要回到深度学习的深坑。在只有一张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页有介绍。我就懒得写了。。。。。。。。。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容