1

Diffsharp の hessian 関数は、System.Double[,] と呼ばれるものを返します。または、変数にカーソルを合わせると、float[,] として表示されます。このオブジェクトは解析が少し難しいようです。理由はわかりません。この質問は関連していますが、特定のサイズのマトリックスのみを扱うため、答えは一般的ではないようです。

このオブジェクトを DenseMatrix にマッサージする次の方法よりもクリーンな方法があるかどうか疑問に思っています。返される行列は常に正方です。

これを変更したい:

System.Double[,]
[[-1.008660933; 9.992007222e-06]
 [9.992007222e-06; 0.4999911596]]

これに、しかしきれいに:

MathNet.Numerics.LinearAlgebra.Double.DenseMatrix
DenseMatrix 2x2-Double
   -1.00866  9.99201E-06
9.99201E-06     0.499991

これが私のコードです。これは、残りの F# コードの中で少しぎこちなく見えます。

let hessianToMatrix (h: float[,]) = 
    let v = h |> Seq.cast<float> |> Seq.toArray |> DenseVector
    let dim = float v.Count |> sqrt |> int    
    let m = DenseMatrix.init dim dim (fun i j -> 0.)
    for r in 0 .. dim-1 do
        for c in 0 .. dim-1 do
            m.[r, c] <- v.[r*dim + c]
    m

let hess = hessian llNormal [|5.; 1.|] |> hessianToMatrix
hess.GetType() |> printfn "\n\n\n%A"
hess |> printfn "%A"
4

1 に答える 1