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 如果没有激活功能,这些值将毫无意义。这个

我正在读这本书:

Jeff Heaton为C#第二版介绍神经网络

特别是关于Hopefield网络的章节。他解释了如何计算作为模式的布尔数组的贡献矩阵

例如,给定以下模式
0101
,相应的贡献矩阵(权重)为:

识别模式的过程遵循以下规则:

我们现在必须将这些权重与0101的输入模式进行比较。我们 将仅求和包含的位置对应的权重 输入模式中的1。每个神经元激活的结果 如下所示

N1=-1+-1=-2
N2=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)。至于任何现有的实现,我认为您比我知道得更多,因为我甚至不知道您提供的链接:)