- 从特殊的训练样例中归纳出一般函数是机器学习的核心问题。一般函数是对理想目标函数的函数逼近(function approximation)。简而言之,从特殊到普通。与此对应的是演绎推理(deductive reasoning),就是从一般性的前提出发,通过推导(即“演绎”),得到具体的称述或个别结论的过程(可以看作预测过程,根据一般规律得出结论)。
- 归纳学习假设:任一假设如果在足够大的训练样例集中很好地逼近目标函数,它也能在未见实例中很好地逼近目标函数。只是这里的足够大的定义不是很好确定。另外,这只是一个假设,虽然具有合理性,但难道这个假设就一定是最好的么?
- 概念学习是指从有关某个布尔函数的输入输出训练样例中推断出该布尔函数。这里假设并限定了目标函数是布尔函数。另外,这是一个由特殊向一般的过程。
- 如果把概念学习看做是一个搜索过程,范围是假设的表示所隐含定义的整个空间。搜索的目标就是为了寻找能最好地拟合训练样例的假设。
- 在心理学中,概念学习就是学习把具有共同属性的事物集合在一起并冠以一个名称,把不具有此类属性的事物排除出去。学习的过程具有排他性。由此,也可以看出为什么ML中的概念学习总表示为一个布尔函数(排他性,不是即非啊)。
- 归纳学习假设:任一假设如果在足够大的训练样例中很好地逼近目标函数,它也能在未见实例中很好地逼近目标函数。
- 概念学习可以看作是一个搜索过程,范围是假设的表示所隐含定义的整个空间。搜索的目标是为了寻找能最好地拟合训练样例的假设。
- FIND-S:寻找极大特殊假设(从特殊到普通的线路),对反例不做处理,并且只是所有可能假设(all possible hypothesis)H中的一个。
- 将h初始化为H中最特殊的假设。
- 对每一个正例x,对h的每一个属性约束ai,如果x满足ai那么不做任何处理;否则将h中ai替换为x满足的下一个更一般约束。
- 输入假设h。
- 候选消除算法(Candidate-Elimination)的输出是与训练样例一致的所有假设的集合。
- 当一个假设h与训练样例集合D一致,当且仅当对D中每一个样例<x, c(x)>都有h(x) = c(x)。数学表示为:Consistent(h, D) ≡ (∀<x, c(x)> ∈ D) h(x) = c(x) 注:通俗讲,就是假设输出和样本输出完全一致。
- 关于假设空间H和训练样例集D的变型空间,标记为VSH,D,是H中与训练样例D一致的所有假设构成的子集。数学表示为:VSH,D ≡ { h ∈ H | Consistent(h, D)}
- 列表消除算法:
- 变型空间VersionSpace←包含H中所有假设的列表
- 对每个训练样例<x, c(x)>,从变型空间中移除所有h(x)≠ c(x)的假设h
- 输出VersionSpace中的假设列表。
- 定义:令hj和hk为在X上定义的布尔函数。称hj more_general_than_or_equal_to hk(记作hj≥ghk),当且仅当(∀x∈ X) [(hk(x) = 1) →(hj(x) = 1)] 注:满足hk必然满足hj
- 定义:关于假设空间H和训练数据D的一般边界(general boundary)G,是在H中与D相一致的极大一般(maximally general)成员的集合。 G ≡ { g ∈ H | Consistent(g, D) ∧ (¬ ∃g'∈H)[(g' > gg)∧Consistent(g, D)]}
- 定义:关于假设空间H和训练数据D的特殊边界(specific boundary)S,是在H中与D相一致的极大特殊(maximally specific)成员的集合。S ≡ { s ∈ H | Consistent(s, D) ∧ (¬ ∃s'∈H)[(s > ss')∧Consistent(s', D)]}
- 变型空间表示定理:令X为一任意的实例集合,H为X上定义的布尔函数假设的集合。令c:→X{0, 1}为X上定义的任一目标概念,并令D为任一训练样例的集合{<x, c(x)>}。对所有的X,H,c,D以及良好定义的S和G: VSH,D = { h ∈ H | (∃s∈S)(∃g∈G)(g≥gh≥gs)}
图1 实例视图
17. 使用变形空间的候选消除算法。在最初阶段G和S:G0←{ <?, ?, ?, ?, ?, ?> }(最一般)和S0←{ <Φ, Φ, Φ, Φ, Φ, Φ> }(最不一般)
从上图可以看出,变形空间具有层次性,且根据属性个数来划分。G是0开始,而S是从max开始。候选消除算法成立的条件:1.在训练样例中没有错误;2.H中确实包含描述目标概念的正确假设。如果S和G收敛到一个空的结合,那么说明样例中有错误。
将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中另一假设更特殊
18. 定义:考虑对于实例集合X的概念学习算法L(归纳学习)。令c为X上定义的任一概念,并令Dc = {<x, c(x)>}为c的任意训练样例集合。令L(xi, Dc)表示经过数据Dc的训练后L赋予实例xi的分类。L的归纳偏置是最小断言集合B(前提集合),它使任意目标概念c和相应的训练样例Dc满足:(∀xi ∈ X)[(B ∧ Dc ∧ xi) ├ L(xi, Dc)]。注:这里的前提就是c ∈ H这个前提,即B = { c ∈ H },符号├是演绎的意思。
这是概念学习的一个简单示例的C++代码。
1 #include <iostream>
2 using namespace std;
3 typedef enum Sky{Sunny,Rainy}Sky;
4 typedef enum AirTemp{Warm,Cold,Cool}AirTemp;
5 typedef enum Humidity{Normal,High}Humidity;
6 typedef enum Wind{Strong}Wind;
7 //typedef enum Water{Warm,Cold}Water;
8 typedef enum Forecast{Same,Change}Forecast;
9 typedef struct Sample
10 {
11 Sky sky;
12 AirTemp airTemp;
13 Humidity humidity;
14 Wind wind;
15 AirTemp water;
16 Forecast forecast;
17 bool EnjoySport;
18 }Sample;
19 typedef struct Record
20 {
21 Sample yangben;
22 int xiabiao[6];
23 }Record;
24 void InitSampleArray(Sample sap[4])
25 {
26 sap[0].sky = Sunny;
27 sap[0].airTemp = Warm;
28 sap[0].humidity = Normal;
29 sap[0].wind = Strong;
30 sap[0].water = Warm;
31 sap[0].forecast = Same;
32 sap[0].EnjoySport = true;
33 sap[1].sky = Sunny;
34 sap[1].airTemp = Warm;
35 sap[1].humidity = High;
36 sap[1].wind = Strong;
37 sap[1].water = Warm;
38 sap[1].forecast = Same;
39 sap[1].EnjoySport = true;
40 sap[2].sky = Rainy;
41 sap[2].airTemp = Cold;
42 sap[2].humidity = High;
43 sap[2].wind = Strong;
44 sap[2].water = Warm;
45 sap[2].forecast = Change;
46 sap[2].EnjoySport = false;
47 sap[3].sky = Sunny;
48 sap[3].airTemp = Warm;
49 sap[3].humidity = High;
50 sap[3].wind = Strong;
51 sap[3].water = Cool;
52 sap[3].forecast = Change;
53 sap[3].EnjoySport = true;
54 }
55 void InitRecord(Sample& s,Record& r)
56 {
57 r.yangben.airTemp = s.airTemp;
58 r.yangben.EnjoySport = s.EnjoySport;
59 r.yangben.forecast = s.forecast;
60 r.yangben.humidity = s.humidity;
61 r.yangben.sky = s.sky;
62 r.yangben.water = s.water;
63 r.yangben.wind = s.wind;
64 for(int i = 0;i < 6;i++)
65 r.xiabiao[i] = 1;
66
67 }
68 void GenerateRule(Sample sap[],Record& record)
69 {
70 for(int i = 1;i < 4;i++)
71 {
72 if(sap[i].EnjoySport == true)
73 {
74 if(sap[i].airTemp != record.yangben.airTemp)
75 {
76 record.xiabiao[0] = 0;
77 }
78 if(sap[i].forecast != record.yangben.forecast)
79 {
80 record.xiabiao[1] = 0;
81 }
82 if(sap[i].humidity != record.yangben.humidity)
83 {
84 record.xiabiao[2] = 0;
85 }
86 if(sap[i].sky != record.yangben.sky)
87 {
88 record.xiabiao[3] = 0;
89 }
90 if(sap[i].water != record.yangben.water)
91 {
92 record.xiabiao[4] = 0;
93 }
94 if(sap[i].wind != record.yangben.wind)
95 {
96 record.xiabiao[5] = 0;
97 }
98 }
99 }
100 for(int i = 0;i < 6;i++)
101 {
102 cout << record.xiabiao[i] << endl;
103 }
104 }
105 void Test(Sample& test,Record& record)
106 {
107 test.EnjoySport = true;
108 if(record.xiabiao[0] == 1)
109 {
110 if(record.yangben.airTemp != test.airTemp)
111 {
112 test.EnjoySport = false;
113 }
114 }
115 else if(record.xiabiao[1] == 1)
116 {
117 if(record.yangben.forecast != test.forecast)
118 {
119 test.EnjoySport = false;
120 }
121 }
122 else if(record.xiabiao[2] == 1)
123 {
124 if(record.yangben.humidity != test.humidity)
125 {
126 test.EnjoySport = false;
127 }
128 }
129 else if(record.xiabiao[3] == 1)
130 {
131 if(record.yangben.sky != test.sky)
132 {
133 test.EnjoySport = false;
134 }
135 }
136 else if(record.xiabiao[4] == 1)
137 {
138 if(record.yangben.water != test.water)
139 {
140 test.EnjoySport = false;
141 }
142 }
143 else if(record.xiabiao[5] == 1)
144 {
145 if(record.yangben.wind != test.wind)
146 {
147 test.EnjoySport = false;
148 }
149 }
150
151 if(test.EnjoySport == true)
152 {
153 cout << "喜欢运动!" << endl;
154 }
155 else
156 {
157 cout << "不喜欢运动!" << endl;
158 }
159 }
160 int main()
161 {
162 Sample sap[4];
163 InitSampleArray(sap);
164 Record record;
165 InitRecord(sap[0],record);
166 GenerateRule(sap,record);
167 Sample test;
168 test.airTemp = Cool;
169 test.forecast = Change;
170 test.humidity = Normal;
171 test.sky = Rainy;
172 test.water = Cold;
173 test.wind = Strong;
174 Test(test,record);
175 getchar();
176 }