библиотеки машинного обучения на C # [закрыто]

116

Есть ли в C # библиотеки машинного обучения? Я ищу что-то вроде WEKA . Спасибо.

Дервин Танк
источник
89
Я не согласен с тем, что это неконструктивный вопрос. Я думаю, что очень полезно иметь набор предложений из отобранных пользователями библиотек вместо автоматических результатов поиска Google. Я не понимаю, почему предложения библиотеки не могут сопровождаться «фактами, ссылками и конкретным опытом», как описано в закрытых примечаниях.
Исмаил Дегани
2
@IsmailDegani Тогда можешь проголосовать за открытие?
Джеймс Ко
4
ЛЮБОЙ ИЩЕТ РАМКИ: ответы ниже датированы, потому что вопрос заблокирован. Существует популярная платформа машинного обучения C # с открытым исходным кодом под названием Accord.NET, и вот ее веб-страница: accord-framework.net
Джеймс Ко,
2
ML.NET - это то место, куда Microsoft вкладывает большие средства. Я создал это 1-часовое видео, которое поможет вам начать работу с ML.NET с использованием C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Также посетите scisharpstack.org , попытку портировать самые популярные библиотеки машинного обучения с Python на C #
henon

Ответы:

59

Посмотрите этот потрясающий список на GitHub. Из перечисленных фреймворков Accord.NET является самой популярной и имеет открытый исходный код, набрав более 2000 звезд.

Также ознакомьтесь с официальной библиотекой машинного обучения для .NET, предоставленной Microsoft: https://github.com/dotnet/machinelearning


OLD

В кодовом проекте есть библиотека нейронной сети AForge.net . (Код размещен в коде Google ) (Также проверьте домашнюю страницу AForge - согласно домашней странице, новая версия теперь поддерживает генетические алгоритмы и машинное обучение. Похоже, она сильно продвинулась с тех пор, как я в последний раз играл с ней)

Я не знаю, это что-то вроде WEKA, потому что я никогда им не пользовался.

(есть также статья о его использовании )

Саймон П. Стивенс
источник
1
Неплохо, хотя, по крайней мере, для тех, кто не очень знаком с этой темой, это действительно не лучший выбор. Они не используют частичные классы для своих форм (затрудняет чтение кода их образцов), и я не могу найти для этого достойную документацию.
RCIX
@RCIX: Я согласен, что это не совсем просто, вам действительно нужно сначала понять нейронные сети и математику, стоящую за ними. Он определенно не предназначен для обучения NN, а скорее для их реализации, когда вы знаете, что делаете. Документы здесь - aforgenet.com/framework/docs , но да, они выглядят немного скудными. Лично я не использовал его несколько лет, и похоже, что с тех пор его много добавили, так что, вероятно, он усложнился.
Саймон П. Стивенс,
1
AForge теперь объединен с github.com/accord-net/framework
Николай Костов
14

Как заявил Шейн, Weka можно очень легко использовать из C #, используя IKVM и некоторый «связующий код». Следуйте инструкциям на странице 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);
    }
}
Грегор Славец
источник
13

Я создал библиотеку ML на C #, которая предназначена для работы с обычными объектами POCO.

Сет Хуарес
источник
2

Также существует проект под названием Encog с кодом C #. Его поддерживает Джефф Хитон, автор книги «Введение в нейронные сети», которую я купил некоторое время назад. Кодовая база Git находится здесь: https://github.com/encog/encog-dotnet-core

vanni.torelli
источник