我目前正尝试使用Ocaml构建一个Hopfield网络。我无法使用一些函数来完成这一切,并且不了解如何完成它们。
首先是能量函数。
以下是我对该功能的看法:
let rec energy(state, weightMatrix) =
if weightMatrix == [] then 0.0
else
(hd(state) *. hd(weightMatrix))/2.0 +. energy(tl(state),tl(weightMatrix));;
状态是它所处的状态,而weightMatrix是权重矩阵。它遵循以下等式:
这方面的一个例子是:
state = = [1.0; -1.0; 1.0; -1.0] and
weight = [[0.; -1.; 1.; -1.]; [-1.; 0.; -1.; 1.];[1.; -1.; 0.; -1.];[-1.; 1.; -1.; 0.]]
# energy(state,weight);;
- : float = -6.
当我运行我的函数时,我在函数的最后一行出现以下错误:
Error: This expression has type float but an expression was expected of type
int
编辑:修复上述错误后,我现在遇到此错误:
Error: This expression has type float list list
but an expression was expected of type float list
Type float list is not compatible with type float
我认为我的问题可以在这里看到:
I am getting: val energy : float list * float list -> float = <fun>
but want: val energy : float list * float list list -> float = <fun>
此外,
我必须创建两个进入网络中下一个状态的功能,但是我在逻辑上思考如何完成这个功能。我的功能概要是:
let nextState(currentState, weightMatrix, alpha) =
;;
如果有人能为我清除一些这样的话会很棒!
答案 0 :(得分:1)
第一个错误是由/
引起的,它是整数除法。你可能想要/.
。很容易忘记浮动运算符中的点。
对于你的状态转换功能,我不太了解任何建议,抱歉。
答案 1 :(得分:0)
我的测试说:
# let rec energy (state, weightMatrix) =
if weightMatrix == [] then 0.0
else
(hd(state) *. hd(weightMatrix))/. 2.0 +. energy(tl(state),tl(weightMatrix));;
val energy : float list * float list -> float = <fun>
# let st = [1.0; -1.0; 1.0; -1.0];;
val st : float list = [1.; -1.; 1.; -1.]
# let wg = [[0.; -1.; 1.; -1.]; [-1.; 0.; -1.; 1.];[1.; -1.; 0.; -1.];[-1.; 1.; -1.; 0.]];;
val wg : float list list =
[[0.; -1.; 1.; -1.]; [-1.; 0.; -1.; 1.]; [1.; -1.; 0.; -1.];
[-1.; 1.; -1.; 0.]]
# energy (st, wg);;
Error: This expression has type float list list
but an expression was expected of type float list
Type float list is not compatible with type float
绝对正确。重量是一个列表。你不能像这样将列表除以2.0。
我不明白你想要计算的公式,我只能说:你必须分解列表清单。