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


116

Чи є в C # бібліотеки машинного навчання? Я після щось подібне до WEKA . Дякую.


89
Я не згоден, що це не конструктивне питання. Я думаю, що дуже корисно мати набір базованих у користуванні пропозицій бібліотеки щодо автоматизованих результатів, коли з’являється пошук Google. Я не бачу, чому пропозиції бібліотек не можуть супроводжуватися "фактами, посиланнями та специфічною експертизою", як описано у близьких примітках.
Ісмаїл Дегані

2
@IsmailDegani Чи можете ви голосувати за повторне відкриття тоді?
Джеймс Ко

4
БУДЬ-ЯКОГО Шукаю РАМКИ: Нижче наведені відповіді датовані, оскільки питання заблоковано. Існує популярна система відкритого коду машинного навчання з відкритим кодом під назвою 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


СТАРИЙ

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

Я не знаю, це щось схоже на WEKA, оскільки я ніколи цього не використовував.

(також є стаття про його використання )


1
Непогано, хоча принаймні для того, хто не дуже знайомий з цією темою, це насправді не такий вдалий вибір. Вони не використовують часткові класи для своїх форм (ускладнює читання коду за їх зразками), і я не можу знайти гідну документацію для цього.
RCIX

@RCIX: Я погоджуюся, що це не зовсім просто, вам потрібно спочатку зрозуміти нейронні мережі та математику, що стоїть за ними. Це, звичайно, не призначено для навчання НН, а скоріше для їх реалізації, коли ви знаєте, що робите. Документи є тут - aforgenet.com/framework/docs , але так, вони виглядають трохи рідко. Особисто я не користувався ним уже кілька років, і схоже, що з того часу його додають багато, тому, ймовірно, вирощують складність.
Саймон П Стівенс

1
AForge тепер об'єднаний у github.com/accord-net/framework
Микола Костов


14

Weka може бути використаний із C # дуже легко, як заявив Шейн, використовуючи IKVM та деякий "клей-код". Розгляньте підручник на сторінці Weka, щоб створити '.Net версію' weka, тоді ви можете спробувати запустити наступні тести:

[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 #. Це підтримує Джефф Хітон, автор книги "Вступ до нейронної мережі", яку я придбав деякий час тому. Кодова база Git тут: https://github.com/encog/encog-dotnet-core


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.