2009-10-26 144 views
97

C#中是否有任何机器学习库?我在WEKA之后。 谢谢。C机器学习库#

+71

我不同意这不是一个建设性的问题。我认为对谷歌搜索的自动化结果提供一套用户策划库建议是非常有用的。我不明白为什么图书馆的建议不能像近期报告中所述的“事实,参考资料和具体专业知识”。 – 2013-05-14 16:34:36

+0

@IsmailDegani你可以投票重新开放吗? – 2018-02-24 04:35:40

+0

任何人都在寻找框架:下面的答案是过时的,因为问题被锁定。有一个流行的开源C#机器学习框架,名为Accord.NET,这里是它的网页:http://accord-framework.net/ – 2018-02-24 04:36:55

回答

49

在codeproject上有一个名为AForge.net的神经网络库。 (代码托管在Google code)(也检出AForge homepage - 根据该网页,新版本现在支持遗传算法和机器学习以及它看起来像它的进步了很多,因为我最近一起玩。)

我不我不知道它就像WEKA一样,从来没有用过。

(有也是一篇关于它的usage

+0

好的。 Upvoted。 – 2009-10-26 10:38:53

+0

不错,尽管至少对于不太熟悉这个主题的人来说,这真的不是一个好的选择。他们不使用部分类的形式(使得难以阅读其样本背后的代码),并且我找不到适当的文档。 – RCIX 2009-10-26 10:58:36

+0

@RCIX:我同意这并不简单,你首先需要了解神经网络及其背后的数学知识。这当然不是为了教导NN而设计的,而是当你知道你在做什么时实施它们。文档在这里 - http://www.aforgenet.com/framework/docs/,但是,他们看起来有点稀疏。就我个人而言,我已经有好几年没有使用过它了,看起来它自那以后增加了很多,所以它可能会变得越来越复杂。 – 2009-10-26 11:10:27

12

我在C#中创建了一个ML library,它被设计用于处理常见的POCO对象。

14

Weka可以很容易地从C#中使用,就像Shane所说的那样,使用IKVM和一些“胶水代码”。便接踵而来上weka page教程创建WEKA的“.NET版本”,那么你可以尝试运行以下测试:

[Fact] 
public void BuildAndClassify() 
{ 
    var classifier = BuildClassifier(); 
    AssertCanClassify(classifier); 
} 

[Fact] 
public void DeserializeAndClassify() 
{ 
    BuildClassifier().Serialize("test.weka"); 
    var classifier = Classifier.Deserialize<LinearRegression>("test.weka"); 
    AssertCanClassify(classifier); 
} 

private static void AssertCanClassify(LinearRegression classifier) 
{ 
    var result = classifier.Classify(-402, -1); 
    Assert.InRange(result, 255.8d, 255.9d); 
} 

private static LinearRegression BuildClassifier() 
{ 
    var trainingSet = new TrainingSet("attribute1", "attribute2", "class") 
    .AddExample(-173, 3, -31) 
    .AddExample(-901, 1, 807) 
    .AddExample(-901, 1, 807) 
    .AddExample(-94, -2, -86); 

    return Classifier.Build<LinearRegression>(trainingSet); 
} 

首先测试表明,你如何建立一个分类,并用它归类一个新例子,第二个显示,你如何使用文件中的持久分类器来分类示例。如果你需要太支持离散属性,一些修改将是必要的。上面的代码使用2个辅助类:

public class TrainingSet 
{ 
    private readonly List<string> _attributes = new List<string>(); 
    private readonly List<List<object>> _examples = new List<List<object>>(); 

    public TrainingSet(params string[] attributes) 
    { 
     _attributes.AddRange(attributes); 
    } 

    public int AttributesCount 
    { 
     get { return _attributes.Count; } 
    } 

    public int ExamplesCount 
    { 
     get { return _examples.Count; } 
    } 

    public TrainingSet AddExample(params object[] example) 
    { 
     if (example.Length != _attributes.Count) 
     { 
     throw new InvalidOperationException(
      String.Format("Invalid number of elements in example. Should be {0}, was {1}.", _attributes.Count, 
      _examples.Count)); 
     } 


     _examples.Add(new List<object>(example)); 

     return this; 
    } 

    public static implicit operator Instances(TrainingSet trainingSet) 
    { 
     var attributes = trainingSet._attributes.Select(x => new Attribute(x)).ToArray(); 
     var featureVector = new FastVector(trainingSet.AttributesCount); 

     foreach (var attribute in attributes) 
     { 
     featureVector.addElement(attribute); 
     } 

     var instances = new Instances("Rel", featureVector, trainingSet.ExamplesCount); 
     instances.setClassIndex(trainingSet.AttributesCount - 1); 

     foreach (var example in trainingSet._examples) 
     { 
     var instance = new Instance(trainingSet.AttributesCount); 

     for (var i = 0; i < example.Count; i++) 
     { 
      instance.setValue(attributes[i], Convert.ToDouble(example[i])); 
     } 

     instances.add(instance); 
     } 

     return instances; 
    } 
} 

public static class Classifier 
{ 
    public static TClassifier Build<TClassifier>(TrainingSet trainingSet) 
     where TClassifier : weka.classifiers.Classifier, new() 
    { 
     var classifier = new TClassifier(); 
     classifier.buildClassifier(trainingSet); 
     return classifier; 
    } 

    public static TClassifier Deserialize<TClassifier>(string filename) 
    { 
     return (TClassifier)SerializationHelper.read(filename); 
    } 

    public static void Serialize(this weka.classifiers.Classifier classifier, string filename) 
    { 
     SerializationHelper.write(filename, classifier); 
    } 

    public static double Classify(this weka.classifiers.Classifier classifier, params object[] example) 
    { 
     // instance lenght + 1, because class variable is not included in example 
     var instance = new Instance(example.Length + 1); 

     for (int i = 0; i < example.Length; i++) 
     { 
     instance.setValue(i, Convert.ToDouble(example[i])); 
     } 

     return classifier.classifyInstance(instance); 
    } 
} 
2

还有一个名为Encog的项目,它具有C#代码。它由Jeff Heaton维护,他是我刚刚购买的“神经网络入门”一书的作者。该代码库的Git是在这里:https://github.com/encog/encog-dotnet-core