吃瓜程序

本文纯属娱乐,寒假了没事找事干(话说我好像也不是没事,该准备考研了),用C#控制台实现了一下好瓜坏瓜从假设空间求对应数据集的版本空间。

概念

假设空间:属性所有可能取值组成的可能的样本。

版本空间:与已知数据集一致的所有假设的子集集合。

img

(绿色加号代表正类样本,红色小圈代表负类样本)

GB 是最大泛化正假设边界(maximally General positive hypothesis Boundary),;

SB 是最大精确正假设边界(maximally Specific positive hypothesis Boundary)

GB与SB之间所围成的区域就是版本空间。

西瓜问题

先写出假设空间,再根据训练数据集求其版本空间

  1. 假设空间,即所有可能的组合(加上空集)
  2. 再根据训练数据集,与正类(即好瓜)不匹配的删除,与负类(即坏瓜)匹配的删除。

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
namespace ConsoleApp1
{
struct Gua //瓜的结构体
{
public string Se; //色泽
public string Gen; //根蒂
public string Qiao; //敲声
public bool isEmpty; //是否为空集
public bool isHaoGua; //是否为好瓜,用于标记训练数据集
}

class Program
{
static string print(Gua gua) //用于输出瓜的属性,即toString函数
{
if (gua.isEmpty)
{
return "∅";
}
return "色泽=" + gua.Se + ", 根蒂=" + gua.Gen + ", 敲声=" + gua.Qiao;
}

static void Main(string[] args)
{
string[] seze = { "*", "青绿", "乌黑" }; //色泽
string[] gendi = { "*", "蜷缩", "硬挺", "稍蜷" }; //根蒂
string[] qiaosheng = { "*", "浊响", "清脆", "沉闷" }; //敲声
List<Gua> Space = new List<Gua>(); //初始为假设空间的列表
List<Gua> TrainData = new List<Gua>(); //训练数据集
Gua gua = new Gua(); //添加空集
gua.isEmpty = true;
gua.isHaoGua = false;
Space.Add(gua);


foreach (var item in seze) //求假设空间
{
foreach (var item1 in gendi)
{
foreach (var item2 in qiaosheng)
{
Gua g = new Gua();
g.Se = item;
g.Gen = item1;
g.Qiao = item2;
g.isEmpty = false;
g.isHaoGua = false;
Space.Add(g);
}
}
}

//此处为输入训练数据集
Gua hao = new Gua(); //该数据为书中表1.1的数据1
hao.isHaoGua = true;
hao.isEmpty = false;
hao.Se = seze[1];
hao.Gen = gendi[1];
hao.Qiao = qiaosheng[1];
TrainData.Add(hao);

Gua hao1 = new Gua(); //该数据为书中表1.1的数据2
hao1.isHaoGua = true;
hao1.isEmpty = false;
hao1.Se = seze[2];
hao1.Gen = gendi[1];
hao1.Qiao = qiaosheng[1];
TrainData.Add(hao1);

Gua huai = new Gua(); //该数据为书中表1.1的数据3
huai.isHaoGua = false;
huai.isEmpty = false;
huai.Se = seze[1];
huai.Gen = gendi[2];
huai.Qiao = qiaosheng[2];
TrainData.Add(huai);

Gua huai1 = new Gua(); //该数据为书中表1.1的数据4
huai1.isHaoGua = false;
huai1.isEmpty = false;
huai1.Se = seze[2];
huai1.Gen = gendi[3];
huai1.Qiao = qiaosheng[3];
TrainData.Add(huai1);


//通过训练数据集对假设空间进行剔除,求其版本空间
foreach (var item in TrainData)
{
for (int i = Space.Count-1; i >= 0; i--)
{
var item1 = Space[i];
if (item.isHaoGua)//如果有好瓜
{
if (item1.isEmpty)//如果有好瓜则不可能存在空集,删除空集
{
Space.Remove(item1);
continue;
}

if ((item1.Se.Equals(item.Se) || item1.Se.Equals("*")) && (item1.Gen.Equals(item.Gen) || item1.Gen.Equals("*"))
&& (item1.Qiao.Equals(item.Qiao) || item1.Qiao.Equals("*"))) //和好瓜相匹配的数据不删除
{
continue;
}
else
{
Space.Remove(item1);
}
}
else
{
if ((item1.Se.Equals(item.Se) || item1.Se.Equals("*")) && (item1.Gen.Equals(item.Gen) || item1.Gen.Equals("*"))
&& (item1.Qiao.Equals(item.Qiao) || item1.Qiao.Equals("*"))) //和坏瓜相匹配的数据删除
{
Space.Remove(item1);
}
}
}
}


foreach (var item in Space) //输出
{
Console.WriteLine(print(item));
}
Console.ReadKey();
}
}
}
Donate comment here