C# Hopefield贡献矩阵模式识别
我正在读这本书: Jeff Heaton为C#第二版介绍神经网络 特别是关于Hopefield网络的章节。他解释了如何计算作为模式的布尔数组的贡献矩阵 例如,给定以下模式C# Hopefield贡献矩阵模式识别,c#,algorithm,matrix,neural-network,C#,Algorithm,Matrix,Neural Network,我正在读这本书: Jeff Heaton为C#第二版介绍神经网络 特别是关于Hopefield网络的章节。他解释了如何计算作为模式的布尔数组的贡献矩阵 例如,给定以下模式0101,相应的贡献矩阵(权重)为: 识别模式的过程遵循以下规则: 我们现在必须将这些权重与0101的输入模式进行比较。我们 将仅求和包含的位置对应的权重 输入模式中的1。每个神经元激活的结果 如下所示 N1=-1+-1=-2 N2=0+1=1 N3=-1+-1=-2 N4=1+0=1 如果没有激活功能,这些值将毫无意义。这个
0101
,相应的贡献矩阵(权重)为:
识别模式的过程遵循以下规则:
我们现在必须将这些权重与0101的输入模式进行比较。我们
将仅求和包含的位置对应的权重
输入模式中的1。每个神经元激活的结果
如下所示
N1=-1+-1=-2N2=0+1=1
N3=-1+-1=-2
N4=1+0=1 如果没有激活功能,这些值将毫无意义。这个 用于Hopfield网络的激活函数的值大于任何值 大于零,那么下面的神经元就会激发 N1激活结果为-2;不会触发(0)
N2活化结果为1;将发射(1)
N3活化结果为-2;不会开火(0) N4活化结果为1;将开火(1) 如你所见,我们给所有 激发,对所有未激发的神经元使用二进制值0。这个 Hopfield网络的最终二进制输出为0101。这是 与输入模式相同 他还说: 如果我们还想识别1001,那么我们将计算两者 贡献矩阵并添加结果以创建连接 权重矩阵 所以我计算第二个贡献矩阵:
0 -1 -1 1
-1 0 1 -1
-1 1 0 -1
1 -1 -1 0
并将两个矩阵相加:
0 -2 0 0
-2 0 0 0
0 0 0 -2
0 0 -2 0
显然(按照前面的规则)最后的矩阵不能识别前面的任何模式。怎么可能呢?错误在哪里
编辑:(添加作者提供的示例)
考虑到所提供的信息,这两种模式是:
1100
->[11-1-1]
0 1 -1 -1
1 0 -1 -1
-1 -1 0 1
-1 -1 1 0
0 -1 -1 -1
-1 0 1 1
-1 1 0 1
-1 1 1 0
1000
->[1-1-1-1]
0 1 -1 -1
1 0 -1 -1
-1 -1 0 1
-1 -1 1 0
0 -1 -1 -1
-1 0 1 1
-1 1 0 1
-1 1 1 0
补充:
0 0 -2 -2
0 0 0 0
-2 0 0 2
-2 0 2 0
乘以[11-1-1]
:
4 0 -4 -4
乘以[1-1-1-1]
:
4 0 -4 -4
在这两种情况下,识别的模式都是
1000
(1100
缺失)。因此,这里有些东西不起作用。这个来源看起来不太好。例如,它使用术语“逆”而不是“转置”。此外,还错误地描述了调用模式的算法。幸运的是,如果您查看它们的实现,它似乎工作得很好(尽管它也是一个低质量的代码)
不同之处在于,当您呈现一个向量来回忆模式时,还应该将其转换为双极形式,然后计算权重矩阵每列的点积。因此,在您的示例中,当您呈现向量1001
时,您将计算:
|0 -2 0 0|
[1 -1 -1 1] * |-2 0 0 0| = [2 -2 -2 2]
|0 0 0 -2|
|0 0 -2 0|
应用阈值函数后,它会产生正确的结果:1001
。对于第二个向量,0101
:
|0 -2 0 0|
[-1 1 -1 1] * |-2 0 0 0| = [-2 2 -2 2]
|0 0 0 -2|
|0 0 -2 0|
这也给出了正确的结果:0101
编辑:
在第二个示例中,您似乎已经达到了Hopfield网络能力的极限。首先,您呈现的模式只有一点不同,这使得它们很难区分。这一点,再加上Hopfield网络的容量大约是0.138*n
(),n
是神经元的数量,似乎可以解释这个问题
其他来源,如(第6章)提供了
n/2*log(n)
-的理论范围,以便在没有错误的情况下检索“几乎所有模式”。在此链接中,您还可以找到其他学习规则。你可以找到另一个简单的例子。这是完整的一章:好的,现在它似乎有意义,但考虑到我的编辑(对问题的编辑),即使你的解决方案也不起作用。你能说为什么吗?谢谢。不管怎么说,您认为代码对于实现或者甚至对于算法来说是低质量的吗?在后者中,您是否有其他实现的源代码?@gliderkite我只是指代码本身的质量(一个小例子:愚蠢的bipolara2double
函数名-此函数不将“bipolar转换为double”,而是将存储在double中的布尔转换为bipolar)。至于任何现有的实现,我认为您比我知道得更多,因为我甚至不知道您提供的链接:)