Accord.NET(KNN)使用F#:距离函数

时间:2014-01-04 22:00:23

标签: f# accord.net

我第一次在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 

我得到这样的例外:

  

*错误1此表达式应具有类型       System.Func&lt;(int * int * int * int),(int * int * int * int),float&gt;但这里有类型       int * int * int * int - &gt; int * int * int * int - &gt;浮动 - &gt; INT *

到目前为止,我发现的唯一一篇与我的问题相关的文章是this。显然,F#和C#如何处理委托有问题?

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

提前致谢

2 个答案:

答案 0 :(得分:3)

声明距离函数如下:

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应该可以解决问题。

答案 1 :(得分:0)

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

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