【问题标题】:machine learning libraries in C# [closed]C# 中的机器学习库 [关闭]
【发布时间】: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#

标签: c# machine-learning


【解决方案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:

【讨论】:

    【解决方案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,尽管您也可以使用桥接软件。

          【讨论】:

          • 你在说什么“桥接软件”?哪些?
          猜你喜欢
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 2017-12-25
          • 2011-02-24
          • 2018-02-20
          • 2013-02-04
          • 2011-06-16
          • 2018-11-16
          相关资源
          最近更新 更多