C#中的机器学习库


116

C#中是否有任何机器学习库?我喜欢WEKA之类的东西。谢谢。


89
我不同意这不是一个建设性的问题。我认为,针对Google搜索显示的自动结果,提供一组用户策划的图书馆建议非常有用。我不明白为什么为什么图书馆的建议不能伴随有“事实,参考和特定专业知识”的描述,如封闭笔记所述。
Ismail Degani

2
@IsmailDegani您可以投票重新打开吗?
詹姆斯·高

4
寻求框架的人:由于问题已锁定,以下答案之所以过时。有一个流行的,开放源代码的C#机器学习框架,称为Accord.NET,这是其网页:Accord-framework.net
James Ko,

2
ML.NET是Microsoft投入大量资金的一种。我创建了这个1小时的视频,可以帮助您使用C#youtube.com
watch?v=83LMXWmzRDM

1
另请查看scisharpstack.org,这是一项将最流行的机器学习库从Python
移植

Answers:


59

在GitHub上查看这个很棒的列表。在列出的框架中,Accord.NET是开源的,并且最受欢迎,拥有2,000多颗星。

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


代码项目上有一个称为AForge.net的神经网络库。(代码托管在Google代码中)(也请查看AForge主页 -根据该主页,新版本现在还支持遗传算法和机器学习。自从我上一次玩过它以来,它似乎已经取得了很大进步)

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

(也有关于它的用法的文章)


1
不错,尽管至少对于一个不太熟悉该主题的人来说,确实不是一个好选择。他们没有在表单中使用局部类(这使得很难阅读其示例后面的代码),而且我也找不到适合的文档。
RCIX

@RCIX:我同意这并不完全简单,您确实需要首先了解神经网络及其背后的数学。当然,它的目的不是教NN,而是在您知道自己在做什么时将其实现。这些文档在这里-aforgenet.com/framework/docs,但是是的,它们看上去确实比较稀疏。就我个人而言,我已经有好几年没有使用它了,从那以后它看起来确实增加了很多,所以它的复杂性可能会增加。
西蒙·史蒂文斯



14

如Shane所述,可以使用IKVM和一些“胶水代码”很容易地从C#中使用Weka。在weka页面上按照教程创建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);
    }
}



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.