概念学习-候选消除算法

本文最后修改时间:20180330python

一、概念学习原型

已知
实例空间 X :使用属性描述的实例(定义域)
概念空间 C :目标概念集合(值域)
假设空间 H :假设集合 (各类映射的集合)
训练集合 D :目标概念的正例和反例 (已知的点)
\(\langle x_{1} , c(x_{1})\rangle,\langle x_{2} , c(x_{2})\rangle,...,\langle x_{m} , c(x_{m})\rangle\)
求解(找到一个一一映射的函数)
假设 h :知足 h \(\in\mathcal{H}\) 且 h(x) = c(x) , x \(\in\mathcal{D}\)
我的理解,举个简单的栗子:二维坐标中,已知两个点的坐标(0,0)、(1,1),求一个通过这两点的线,好比有直线y=x,2次曲线\(y=x^{2}\),还有3次曲线\(y=x^{3}\),...,\(y=x^{n}\)。x坐标轴上的点组成的集合就是实例空间X,y坐标轴上的点组成的集合就是概念空间C,这些曲线对应的函数集合就是假设空间H,已知的点坐标就是训练集合D算法

二、变形空间

定义:一条假设 h 与训练样例集合 \(\mathcal{D}\) 是一致的,当且仅当对 \(\mathcal{D}\) 中每条样例 \(\langle x, c(x)\rangle\)都有,即
\(Consistent(h, \mathcal{D})\equiv(\forall\langle x, c(x)\rangle\in\mathcal{D})h(x)=c(x))\)
定义:假设空间 \(\mathcal{H}\) 和训练样例集合 \(\mathcal{D}\) 的变型空间,是 \(\mathcal{D}\) 中与训练样例集合 \(\mathcal{H}\) 一致的全部假设h构成的
子集合,标记为 \(VS_{\mathcal{H, D}}\) ,即
\(VS_{\mathcal{H, D}} \equiv \{h\in\mathcal{H} | Consistent(h, \mathcal{D})\}\)app

三、列表消除算法

  1. 变型空间 VS <-- 假设空间中全部假设列表
  2. 对每一个训练样例 \(\langle x, c(x)\rangle\) ,从变型空间 VS 中删除
    全部知足 \(h(x) \not= c(x)\) 的假设 h
  3. 输出变形空间 VS 中的假设列表

四、候选消除算法

将G集合初始化为H中极大通常假设
将S集合初始化为H中极大特殊假设
对每一个训练例d,进行如下操做:
若是d是一正例
    • 从G中移去全部与d不一致的假设
     • 对S中每一个与d不一致的假设s
       •从S中移去s
       • 把s的全部的极小通常化式h加入到S中,其中h知足
         •h与d一致,并且G的某个成员比h更通常
     • 从S中移去全部这样的假设:它比S中另外一假设更通常
若是d是一个反例
    • 从S中移去全部d不一致的假设
     • 对G中每一个与d不一致的假设g
       •从G中移去g
       •把g的全部的极小特殊化式h加入到G中,其中h知足
         •h与d一致,并且S的某个成员比h更特殊
     •从G中移去全部这样的假设:它比G中另外一假设更特殊函数

# -*- coding: utf-8 -*-
import os
import pandas as pd

def loadData():
    '''数据
Sunny Hot High Week No
Sunny Hot High Strong No
Overcast Hot High Weak Yes
Rain Mild High Weak Yes
Rain Cool Normal Weak Yes
Overcast Cool Normal Strong Yes
Sunny Mild High Weak No
Sunny Cool Normal Weak Yes
Rain Mild Normal Weak Yes
Sunny Mild Normal Strong Yes
Overcast Mild High Strong Yes
Overcast Hot Normal Weak Yes
Rain Mild High Strong No
'''
    set = []
    data = pd.read_csv('data2.txt', sep=r' ', encoding="utf-8", engine='python', header=None)
    for i in xrange(len(data)):
        instance = []
        #print data.iloc[i]
        if 'Sunny' == data.iloc[i][0]:
            instance.append(1);
        elif 'Overcast' == data.iloc[i][0]:
            instance.append(2);
        else: #Rain
            instance.append(4);
                    
        if 'Hot' == data.iloc[i][1]:
            instance.append(1);
        elif 'Mild' == data.iloc[i][1]:
            instance.append(2);
        else: #Cool
            instance.append(4);
            
        if 'High' == data.iloc[i][2]:
            instance.append(1);
        else: #Normal
            instance.append(2);
        
        if 'Strong' == data.iloc[i][3]:
            instance.append(1);
        else: #Weak
            instance.append(2);
        
        if 'Yes' == data.iloc[i][4]:
            instance.append(1);
        else: #No
            instance.append(0);
        set.append(instance)
    return set

#判断假设与实例是否一致,代码和isMoreGeneralOrEqual同样
#h : hypothesis 假设
#d : 训练实例

def isConsistent(h, d):
    if d[4]: #d为h的正例,h包含d时一致,不然不一致
        for i in xrange(4):
            if not (h[i] == (h[i] | d[i])): #不包含
                return False
        return True
    else: #d为h的反例,h不包含d时一致,不然不一致
        for i in xrange(4):
            if not (h[i] == (h[i] | d[i])): #不包含
                return True
        return False
    
#h1 >= h2 h1是否比h2更通常
#h1 : hypothesis 假设1
#h2 : hypothesis 假设2
def isMoreGeneralOrEqual(h1, h2):
    for i in xrange(4):
        if not (h1[i] == (h1[i] | h2[i])): #不包含
            return False
    return True

#生成知足d的极小通常化假设,只能生成1个
def genMinGeneralHypothesis(s, d):
    h = []
    for i in xrange(4):
        if s[i] == d[i]:
            h.append(s[i])
        else:
            h.append(s[i] | d[i])
    return h

#生成知足d的极小特殊化假设,最多能够生成n个,n为维度
def genMinSpecialHypothesis(g, d):
    setH = []
    for i in xrange(4):
        h = list(g)
        if not (g[i] == (g[i] | d[i])): #g[i]不包含d[i]
            continue
        else:
            #去掉d[i]都的特征值,并添加到候选假设集
            h[i] = (g[i] & ~d[i]) 
            setH.append(h)
    return setH

def printResult(set):
    print '[',
    for i in xrange(len(set)):
        print '[',
        if 7 == set[i][0]:
            print '?',
        elif 0 == set[i][0]:
            print '0',
        else:
            if 4 & set[i][0]:
                print 'Rain',
            if 2 & set[i][0]:
                print 'Overcast',
            if 1 & set[i][0]:
                print 'Sunny',
        print ',',
            
        if 7 == set[i][1]:
            print '?',
        elif 0 == set[i][1]:
            print '0',
        else:
            if 4 & set[i][1]:
                print 'Cool',
            if 2 & set[i][1]:
                print 'Mild',
            if 1 & set[i][1]:
                print 'Hot',
        print ',',

        if 3 == set[i][2]:
            print '?',
        elif 2 == set[i][2]:
            print 'Normal',
        elif 1 == set[i][2]:
            print 'High',
        else:
            print '0',
        print ',',
        
        if 3 == set[i][3]:
            print '?',
        elif 2 == set[i][3]:
            print 'Weak',
        elif 1 == set[i][3]:
            print 'Strong',
        else:
            print '0',
        print '], ',
    print ']'

def main():
    setS = [[0, 0, 0, 0]] #极大特殊假设
    setG = [[7, 7, 3, 3]] #极大通常假设
    data = loadData()
    for i in xrange(len(data)):
        if data[i][4]: #正例
            #从G中移去全部与d不一致的假设
            j = 0
            while j < len(setG):
                if not isConsistent(setG[j], data[i]):
                    setG.pop(j)
                    j = j - 1
                j = j + 1
            #对S中每一个与d不一致的假设s , 从S中移去s
            #并把s的全部的极小通常化式h加入到S中,其中h知足 : h与d一致,并且G的某个成员比h更通常
            j = 0
            while j < len(setS):
                if not isConsistent(setS[j], data[i]):
                    #极小通常化式h  感覺只能添加一個h
                    h = genMinGeneralHypothesis(setS[j], data[i])
                    #从S中移去s
                    setS.pop(j)
                    j = j - 1
                    for k in xrange(len(setG)):
                        if isMoreGeneralOrEqual(setG[k], h):
                            setS.append(h)
                j = j + 1            

            #从S中移去全部这样的假设:它比S中另外一假设更通常
            j = 0
            while j < len(setS):
                k = j + 1
                while k < len(setS):
                    if isMoreGeneralOrEqual(setS[j], setS[k]):
                        setS.pop(j)
                        j = j - 1
                        break
                    elif isMoreGeneralOrEqual(setS[k], setS[j]):
                        setS.pop(k)
                        continue
                    k = k + 1
                j = j + 1

        else: #反例
            #从S中移去全部d不一致的假设
            j = 0
            while j < len(setS):
                if not isConsistent(setS[j], data[i]):
                    setS.remove(j)
                    j = j - 1
                j = j + 1
            
            #对G中每一个与d不一致的假设g,从G中移去g            
            #并把g的全部的极小特殊化式h加入到G中,其中h知足:h与d一致,并且S的某个成员比h更特殊
            j = 0
            while j < len(setG):
                if not isConsistent(setG[j], data[i]):
                    #极小特殊化式h
                    setH = genMinSpecialHypothesis(setG[j], data[i])
                    #从G中移去g
                    setG.pop(j)
                    j = j - 1
                    for m in xrange(len(setH)):                        
                        for k in xrange(len(setS)):
                            if isMoreGeneralOrEqual(setH[m], setS[k]):
                                setG.append(setH[m])
                j = j + 1
            
            #从G中移去全部这样的假设:它比G中另外一假设更特殊
            j = 0
            while j < len(setG):
                k = j + 1
                while k < len(setG):
                    if isMoreGeneralOrEqual(setG[j], setG[k]):
                        setG.pop(k)
                        continue
                    elif isMoreGeneralOrEqual(setG[k], setG[j]):
                        setG.pop(j)
                        j = j - 1
                        break
                    k = k + 1
                j = j + 1
        if i < len(data) - 1:
            print 'D' + str(i+1)
            print setS
            print setG
            printResult(setS)
            printResult(setG)
        print ''
    return


if __name__ == "__main__":
    main()

输出结果:学习

D1
[[0, 0, 0, 0]]
[[6, 7, 3, 3], [7, 6, 3, 3], [7, 7, 2, 3], [7, 7, 3, 1]]
[ [ 0 , 0 , 0 , 0 ],  ]
[ [ Rain Overcast , ? , ? , ? ],  [ ? , Cool Mild , ? , ? ],  [ ? , ? , Normal , ? ],  [ ? , ? , ? , Strong ],  ]

D2
[[0, 0, 0, 0]]
[[6, 7, 3, 3], [7, 6, 3, 3], [7, 7, 2, 3], [7, 7, 3, 0]]
[ [ 0 , 0 , 0 , 0 ],  ]
[ [ Rain Overcast , ? , ? , ? ],  [ ? , Cool Mild , ? , ? ],  [ ? , ? , Normal , ? ],  [ ? , ? , ? , 0 ],  ]

D3
[[2, 1, 1, 2]]
[[6, 7, 3, 3]]
[ [ Overcast , Hot , High , Weak ],  ]
[ [ Rain Overcast , ? , ? , ? ],  ]

D4
[[6, 3, 1, 2]]
[[6, 7, 3, 3]]
[ [ Rain Overcast , Mild Hot , High , Weak ],  ]
[ [ Rain Overcast , ? , ? , ? ],  ]

D5
[[6, 7, 3, 2]]
[[6, 7, 3, 3]]
[ [ Rain Overcast , ? , ? , Weak ],  ]
[ [ Rain Overcast , ? , ? , ? ],  ]

D6
[[6, 7, 3, 3]]
[[6, 7, 3, 3]]
[ [ Rain Overcast , ? , ? , ? ],  ]
[ [ Rain Overcast , ? , ? , ? ],  ]

D7
[[6, 7, 3, 3]]
[[6, 7, 3, 3]]
[ [ Rain Overcast , ? , ? , ? ],  ]
[ [ Rain Overcast , ? , ? , ? ],  ]

D8
[]
[]
[ ]
[ ]

D9
[]
[]
[ ]
[ ]

D10
[]
[]
[ ]
[ ]

D11
[]
[]
[ ]
[ ]

D12
[]
[]
[ ]
[ ]
相关文章
相关标签/搜索