65.9K
CodeProject 正在变化。 阅读更多。
Home

构建伽罗瓦格的哈斯图的快速算法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (20投票s)

2007年3月18日

7分钟阅读

viewsIcon

52470

downloadIcon

2080

人工智能

本示例旨在让机器学习“食肉动物”的概念

为什么选择食肉动物?

食肉动物是一个概念,因为它是一组拥有共同属性的事物,这些属性对于该组的每个成员都有效,并且你找不到比这更大的包含该组事物的共同属性的集合

所以,如果哺乳动物组是 M

共同属性组是 C

那么概念“哺乳动物”就是 M, C

示例

如果我们还有另一个属性组 C1,C1 的属性在所有 M 成员中都通用,并且 C1 > C

那么 M, C 就不是一个概念

另一个例子:假设概念是“桌子”,因为我们知道每张桌子至少有一个平面和四条腿,但是椅子也只有一个平面和四条腿!

现在,我们不会破坏“桌子”这个概念,而是说“椅子”是一个负面例子

因为椅子有四条腿但不是桌子,而咖啡桌是一个正面例子

因为咖啡桌有四条腿,并且桌子

看,如果我们能让我们的程序理解“桌子”这个概念,我们就能让杀毒软件理解“恶意代码”这个概念

而且我们不需要给程序任何巧妙的语义;程序应该自己理解发生了什么

我们将提供正面和负面示例,让程序自己学习

概念,之后我们将询问程序一些问题,它会给出答案,并给出其答案的理由

我们可以通过纠正系统答案来监督学习,但我还没有在代码中实现这一点

有效概念:我们说概念 M, C 是有效的(其中 M 是对象,C 是属性),如果它包含足够的正面示例。什么是足够的?我们稍后会讨论。

一致概念:我们说有效概念是一致的,如果没有负面示例。由于很难找到一致的概念,所以我们说

一致:只有很少量的负面示例

相关概念:有效且半一致的概念称为相关概念。

最大的相关概念:现在你可以猜到,我们正在寻找的是。

优势:与神经网络不同,版本空间不需要大量的正面和负面示例来学习。而且正如你将看到的,Bordat 能够进行解释,而神经网络则不能。

属性值的定义

因为我们要构建的网络是二元的,所以

属性值属于 {0, 1}

并且由新数据表提供的属性

应仔细选择,因此属性必须全面且充分

你应该花足够的时间来制作新的数据表,因为大的数据表会导致程序挂起

程序常量

因为你的表可能很小,以便加快学习过程,你应该为 Alpha、Beta、Theta _Alpha、Theta _Beta 设置小而合适的值。

它们有什么作用?

Alpha、Beta 是下一份 PDF 文件中提到的限制,它们将控制

“有效性”函数,该函数将对概念进行判断,如上所述。

Theta _Alpha、Theta _Beta 用于决策系统以接受或拒绝对象

它们根据表中的总属性数量设置,并且

它们对结果属性的数量极其敏感。

当我们完成学习时,我们将获得我们概念的理想属性。

识别对象

新对象将由用户提供,用户将告诉我们

其对象的属性。我们将把其属性与我们的理想属性进行比较。

我们从 BORDAT 获得,所以我们将使用计数器变量。

迭代将扫描用户属性并与我们的属性进行比较。

当它们匹配时,我们增加计数器。

当它们不同时,我们减少计数器。

在此迭代之后,我们将把我们的计数器与 Theta_Alpha 进行比较。

和 Theta_Beta。

如果计数器小于 Theta_Beta 限制以拒绝异常对象,则用户的对象不属于我们的概念。

如果计数器大于 Theta_Alpha 限制以接受熟悉对象,则用户的对象属于我们的概念。

否则,我们无法判断该对象是异常还是熟悉,这称为

系统沉默

现在你可以想象这种情况:你输入了一个小表来加快学习速度。

并且因为属性不是很多,一个大的 Theta_Beta 值会导致程序拒绝所有对象,而小的 Theta_Alpha 会使程序

接受所有对象。

改变 Alpha、Beta 值将改变 Bordat 的行为。

巨大的 Alpha 将使所有概念无效,负的 Beta 将不允许任何

概念有效且稳固。

我认为不玩弄它们的价值是明智的。

简单来说,Bordat 是如何工作的?

输入是一个对象和属性的表。

主要概念是所有对象,没有属性,我们将从那里开始。

因为我们已经知道对象之间没有共享属性,如果存在共享属性,最好删除它们,因为它们是中性的,不会帮助学习概念。

我们将计算对象组的闭包,设其基数为 n。

STAR

我们将在基数为 n1 的子组中寻找概念。

对于每个有效且半一致的概念,在父概念和这个新概念子节点之间建立 HASSE 连接。

对于每个有效概念,递归地重复 STAR,这样我们就可以在其子节点中寻找可能的有效且半一致的概念。

当我们从所有父节点生成的所有子节点都不复存在时,我们就停止。

优化后的 Bordat

你可以看到 Bordat 有这个问题:

如果我生成了某个节点 X 的子节点,并且我们得到了一个子节点 Z,它

被认为是相关概念,尽管它是另一个相关父节点 Y 的子节点。

Y 和 X 处于同一级别,我们没有生成 Y 的子节点,因为它已经相关。

所以 Z 不是“最大的相关概念”,因为存在 Y,Y > Z,并且 Y 是相关的。

为了解决这个问题,声明一个公共数组,它将包含最大的相关概念。

每次找到一个新的相关概念时,我们都会将其与数组中的元素进行比较。如果它不包含在数组的任何概念中,我们就将其添加到数组中。如果它包含在数组的某个概念中,我们就不会生成其子节点。

在我们的实现中,我们不会绘制 HASSE 图,而是寻找合适的

识别用户概念的属性,并在此过程中,我们将看到一个已构建概念的列表。

未来发展

解释

通过比较属性和给定属性,新对象

并解释程序行为,当对象属于时,提及共享

“合适属性”组和“给定属性”组之间的属性。

当对象不属于时,提及“合适属性”组中不属于“给定属性”组的属性。

模糊逻辑

可以使用模糊属性进行学习,例如描述“声誉”

对象“客户”的属性,我们将说“非常好”或

“非常糟糕”。分类应用程序,当然我们必须更改函数。

有效性和其他相关事项。

简而言之,有些属性无法在经典逻辑空间中回答。

如何使用代码

一个重要的条件是数据文件的格式。

表的第一行将用作属性名称。

第一列将用作对象名称。

每个新列之前都应该有一个空格列,因此每行中的单词总是用一个或多个空格分隔。

数据文件格式必须是 *RTF,以下是按钮的使用:

加载数据

首先从文件中导入数据。

设置 + 对象

在列表框中确认选择的正面和负面示例。

保存表

将新的用户表保存到文件中。

设置 Alpha Beta Theta 的值

为常量值设置新值。

启动 Bordat

程序将使用 Bordat 来学习你的表。

询问已学概念

程序将要求你通过定义其属性列表来选择一个对象。

这是什么?

它将给出系统对你对象的判断。

注意:exe 图标是 48x48,可能不会出现在你的桌面上,除非你启用了大图标。在 Vista 中不是必需的。

© . All rights reserved.