【问题标题】:Accord.NET (KNN) using F#: Distance FunctionAccord.NET (KNN) 使用 F#:距离函数
【发布时间】:2014-01-05 06:35:30
【问题描述】:

我第一次在 F# 中使用 Accord.NET,在创建计算 KNN 距离的函数时遇到问题。

这是我的代码

static member RunKNN =
    let inputs = MachineLearningEngine.TrainingInputClass
    let outputs = MachineLearningEngine.TrainingOutputClass

    let knn = new KNearestNeighbors<int*int*int*int>(1,inputs,outputs,null)
    let input = 1,1,1,1
    knn.Compute(input)

当我将 null 换成这样的函数时

let distanceFunction = fun (a:int,b:int,c:int,d:int)
                           (e:int,f:int,g:int,h:int)
                           (i:float) ->
                           0 

我遇到这样的异常:

*Error 1 这个表达式应该有类型 System.Func 但这里有类型 int * int * int * int -> int * int * int * int -> float -> int*

到目前为止,我发现的唯一一篇接近我的问题的文章是 this 一篇。显然,F# 和 C# 处理委托的方式有问题?

我在 Accord.NET here 的 Google 群组上发布了同样的问题。

提前致谢

【问题讨论】:

    标签: f# accord.net


    【解决方案1】:

    像这样声明距离函数:

    let distanceFunction (a:int,b:int,c:int,d:int) (e:int,f:int,g:int,h:int) =  
      0.0
    

    (它在输入中接受两个元组并返回一个浮点数),然后从中创建一个委托:

    let distanceDelegate = 
      System.Func<(int * int * int * int),(int * int * int * int),float>(distanceFunction)
    

    将此委托传递给 Accord.NET 应该可以解决问题。

    【讨论】:

    • 太棒了。非常感谢
    【解决方案2】:

    我猜你应该像这样使用元组形式

    let distanceFunction = fun ((a:int,b:int,c:int,d:int),
                               (e:int,f:int,g:int,h:int),
                               (i:float)) ->
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2019-05-08
      • 2017-01-20
      • 2018-06-09
      • 1970-01-01
      相关资源
      最近更新 更多