候選消除算法是一種基于歸納推理的機(jī)器學(xué)習(xí)算法,用于從給定的訓(xùn)練數(shù)據(jù)中學(xué)習(xí)一個(gè)概念。它的目的是將訓(xùn)練數(shù)據(jù)中的所有實(shí)例歸納成一個(gè)最具一般性的概念描述,即“概念學(xué)習(xí)”的過程。
候選消除算法的基本思想是:初始化一個(gè)最特殊的概念描述和一個(gè)最一般的概念描述,然后逐步修正它們,直到最終得到一個(gè)最具一般性的概念描述,即所求的概念。
具體來說,算法的步驟如下:
1.初始化最特殊概念描述和最一般概念描述:
最特殊概念描述S0:將所有屬性值均初始化為“?”,表示不確定;
最一般概念描述G0:將所有屬性值均初始化為“?”,表示不包含任何屬性值。
2.對(duì)于每個(gè)訓(xùn)練實(shí)例,進(jìn)行如下處理:
①如果實(shí)例是正例(屬于所求概念),則更新最特殊概念描述S和最一般概念描述G:
對(duì)于S中的每個(gè)屬性,如果實(shí)例中該屬性值與S中的對(duì)應(yīng)屬性值不同,則將S中該屬性值改為“?”;
對(duì)于G中的每個(gè)屬性,如果實(shí)例中該屬性值與G中的對(duì)應(yīng)屬性值不同,則將G中該屬性值改為實(shí)例中的屬性值。
②如果實(shí)例是反例(不屬于所求概念),則只更新最一般概念描述G:
對(duì)于G中的每個(gè)屬性,如果實(shí)例中該屬性值與G中的對(duì)應(yīng)屬性值相同,則將G中該屬性值改為“?”。
最終得到的最具一般性的概念描述即為所求概念。
下面以一個(gè)簡單的示例來說明候選消除算法的應(yīng)用過程。假設(shè)我們要從以下5個(gè)訓(xùn)練實(shí)例中學(xué)習(xí)一個(gè)概念:
根據(jù)算法步驟,我們首先初始化最特殊概念描述和最一般概念描述:
S0: < ?, ?, ? >
G0: < ?, ?, ? >
然后對(duì)于每個(gè)訓(xùn)練實(shí)例,進(jìn)行如下處理:
對(duì)于實(shí)例1:屬于所求概念,因此更新S和G:
S1: < 青蛙, 爬行, 水生 >
G1: < 青蛙, 爬行, 水生 >
對(duì)于實(shí)例2:屬于所求概念,因此更新S和G:
S2: < ?, ?, ? >
G2: < 青蛙, 爬行, 水生 >
對(duì)于實(shí)例3:不屬于所求概念,因此只更新G:
S3: < ?, ?, ? >
G3: < 青蛙, 爬行, 水生 >
對(duì)于實(shí)例4:不屬于所求概念,因此只更新G:
S4: < ?, ?, ? >
G4: < ?, ?, ? >
對(duì)于實(shí)例5:屬于所求概念,因此更新S和G:
S5: < ?, ?, 水生 >
G5: < ?, ?, 水生 >
最終得到的最具一般性的概念描述為:
< ?, ?, 水生 >
即“水生動(dòng)物”。
以下是Python代碼實(shí)現(xiàn)候選消除算法:
import numpy as np
def candidate_elimination(examples):
# 初始化最特殊概念描述和最一般概念描述
S = np.array(['?' for _ in range(len(examples[0]) - 1)])
G = np.array(['?' for _ in range(len(examples[0]) - 1)])
# 對(duì)于每個(gè)訓(xùn)練實(shí)例,進(jìn)行如下處理
for i, example in enumerate(examples):
x, y = example[:-1], example[-1]
if y == '是': # 正例
# 更新最特殊概念描述S和最一般概念描述G
for j in range(len(x)):
if S[j] != '?' and S[j] != x[j]:
S[j] = '?'
G[j] = x[j] if S[j] == '?' else S[j]
else: # 反例
# 只更新最一般概念描述G
for j in range(len(x)):
if S[j] != '?' and S[j] != x[j]:
G[j] = S[j]
# 打印每次迭代的結(jié)果
print(f'第{i+1}次迭代:S={S}, G={G}')
# 最終得到的最具一般性的概念描述即為所求概念
concept = G if G[0] != '?' else S
return concept
登錄后復(fù)制






