使用OCaml的Hopfield网络

时间:2014-02-12 19:45:48

标签: function logic ocaml

我目前正尝试使用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是权重矩阵。它遵循以下等式:

Formula

这方面的一个例子是:

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) =

;;

如果有人能为我清除一些这样的话会很棒!

2 个答案:

答案 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。

我不明白你想要计算的公式,我只能说:你必须分解列表清单。