本文最后修改时间: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
将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 [] [] [ ] [ ]