繁体   English   中英

我可以将类型作为参数传递给此函数吗?

[英]Can I pass a type as a parameter to this function?

以下代码,大部分是从

http://accord-framework.net/docs/html/T_Accord_MachineLearning_VectorMachines_Learning_SequentialMinimalOptimization.htm

工作正常。

module SVMModule

open Accord.MachineLearning
open Accord.MachineLearning.VectorMachines
open Accord.MachineLearning.VectorMachines.Learning
open Accord.Statistics.Kernels
open Accord.Math.Optimization.Losses

// open MathNet.Numerics.LinearAlgebra.Matrix

let inputs = [| [| 0.; 0. |]; [| 0.; 1. |]; [| 1.; 0. |]; [| 1.; 1. |] |]
let xor = [| 0; 1; 1; 0 |]
/// Creates and trains a Support Vector Machine given inputs and outputs.
/// The kernel can be Linear, Gaussian, or Polynomial.
/// The default tolerance is 1e-2.
let train (C: float) (tol: float) (inputs: float [] []) =
    let learn = SequentialMinimalOptimization<Gaussian>()

    learn.UseComplexityHeuristic <- true
    learn.UseKernelEstimation <- true
    if C >= 0. then learn.Complexity <- C
    if tol > 0. then learn.Tolerance <- tol

    let svm = learn.Learn(inputs, xor)
    svm

let svm = train 0.5 1e-2 inputs
let prediction = svm.Decide inputs

printfn "SVM_0 Prediction: %A" prediction

我想实现train的多态版本,例如

let train (kernel: string) (C: float) (tol: float) (inputs: float [] []) =
    let learn =
        if kernel = "Gaussian" then 
           SequentialMinimalOptimization<Gaussian>()
        else
           SequentialMinimalOptimization<Linear>()
    // More code

这是行不通的,因为if表达式必须在其所有分支中返回相同类型的对象。

我想知道是否有一种方法可以将LinearGaussian传递为train类型(这些确实是类型),这样我就不必为每种类型( trainGaussiantrainLinear )编写一个训练函数。 Akso,即使我花了编写这些单独的函数的麻烦,我想根据用户的选择在运行时调用它们也很困难,因为if语句的相同问题将使其丑陋。

我已经使用接口在F#实现了多态,但是使用我自己构建的类。 这些类在Accord.NET ,即使它们从基类继承,我也无法处理类型问题和实现多态性。

感谢您的任何建议。

简单地将具体的Gaussian类型替换为类似't的类型参数,并可以选择将其作为显式类型参数进行train ,应该很简单。 在执行此操作时,我已对您现有的代码进行了非常小的清理:

let train<'t> (C: float) (tol: float) (inputs: float [] []) =
    let learn = SequentialMinimalOptimization<'t>(UseComplexityHeuristic = true, UseKernelEstimation = true)
    if C >= 0. then learn.Complexity <- C
    if tol > 0. then learn.Tolerance <- tol

    learn.Learn(inputs, xor)

然后在调用站点,将需要某种方式使编译器知道使用哪种类型,方法是将其显式传递:

let svm = train<Gaussian> 0.5 1e-2 inputs

或依靠类型推断将类型从程序的另一部分传递出去:

let svm:Gaussian = train 0.5 1e-2 inputs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM