C# 中的机器学习库 [关闭]

Posted

技术标签:

【中文标题】C# 中的机器学习库 [关闭]【英文标题】:machine learning libraries in C# [closed] 【发布时间】:2010-12-10 02:11:54 【问题描述】:

C# 中是否有任何机器学习库?我追求类似WEKA 的东西。 谢谢。

【问题讨论】:

我不同意这不是一个建设性的问题。我认为在谷歌搜索出现的自动结果上提供一组用户策划的图书馆建议非常有用。我不明白为什么图书馆建议不能附有“事实、参考资料和特定专业知识”,如结束注释中所述。 任何正在寻找框架的人:以下答案已过时,因为问题已被锁定。有一个流行的开源 C# 机器学习框架,称为 Accord.NET,这是它的网页:accord-framework.net ML.NET 是微软投入大量资金的领域。我制作了这个 1 小时的视频,它可以帮助您使用 C# youtube.com/watch?v=83LMXWmzRDM 开始使用 ML.NET 还可以查看scisharpstack.org,它致力于将最流行的机器学习库从 Python 移植到 C# 【参考方案1】:

查看 GitHub 上的 this awesome list。在列出的框架中,Accord.NET 是开源的,并且最受欢迎,拥有超过 2,000 颗星。

另外,请查看 Microsoft 提供的 .NET 官方机器学习库:https://github.com/dotnet/machinelearning


codeproject 上有一个名为AForge.net 的神经网络库。 (代码托管在Google code)(另请查看AForge homepage - 根据主页,新版本现在还支持遗传算法和机器学习。看起来自从我上次玩以来进步了很多)

我不知道它是不是像 WEKA 一样,因为我从未使用过。

(还有一篇文章是usage)

【讨论】:

不错,但至少对于不太熟悉该主题的人来说,这确实不是一个好的选择。他们的表单不使用部分类(这使得他们很难阅读示例背后的代码),而且我找不到合适的文档。 @RCIX:我同意这并不简单,您确实需要首先了解神经网络及其背后的数学。它当然不是为了教授神经网络而设计的,而是在你知道自己在做什么的时候实施它们。文档在这里 - aforgenet.com/framework/docs,但是是的,它们看起来确实有点稀疏。就我个人而言,我已经有好几年没有使用它了,而且从那以后它看起来确实增加了很多,所以它可能变得越来越复杂。 AForge 现已合并到 github.com/accord-net/framework【参考方案2】:

我也在搜索 .NET 的机器学习库,并在 nuget.org/machine-learning 上找到了来自 Microsoft Research 的 Infer.NET:

Infer.NET

【讨论】:

【参考方案3】:

还有一个名为 Encog 的项目包含 C# 代码。它由 Jeff Heaton 维护,他是我不久前买的一本“神经网络简介”一书的作者。代码库 Git 在这里:https://github.com/encog/encog-dotnet-core

【讨论】:

【参考方案4】:

正如 Shane 所说,Weka 可以很容易地从 C# 中使用,使用 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);
    

【讨论】:

【参考方案5】:

我在 C# 中创建了一个 ML library,旨在与常见的 POCO 对象一起使用。

【讨论】:

【参考方案6】:

您也可以use Weka with C#。最好的解决方案是使用IKVM, as in this tutorial,尽管您也可以使用桥接软件。

【讨论】:

你在说什么“桥接软件”?哪些?

以上是关于C# 中的机器学习库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用C# 探索 ML.NET 中的不同机器学习任务

使用哪个机器学习库[关闭]

用于 Apache Mahout 的 .net 模拟的机器学习库 [关闭]

基于C#的机器学习--c# .NET中直观的深度学习

图像处理和机器学习中的 Ada 状态 [关闭]

对机器学习中的特征应用不同的转换[关闭]