Bibliotheken für maschinelles Lernen in C # [geschlossen]

116

Gibt es in C # Bibliotheken für maschinelles Lernen? Ich bin nach so etwas wie WEKA . Danke dir.

Dervin Thunk
quelle
89
Ich bin nicht der Meinung, dass dies keine konstruktive Frage ist. Ich denke, es ist sehr nützlich, eine Reihe von vom Benutzer kuratierten Bibliotheksvorschlägen über die automatisierten Ergebnisse zu haben, die bei einer Google-Suche angezeigt werden. Ich verstehe nicht, warum Bibliotheksvorschläge nicht von "Fakten, Referenzen und spezifischem Fachwissen" begleitet werden können, wie in den ausführlichen Anmerkungen beschrieben.
Ismail Degani
2
@IsmailDegani Kannst du dann für eine Wiedereröffnung stimmen?
James Ko
4
JEMAND, DER NACH RAHMEN SUCHT: Die folgenden Antworten sind datiert, da die Frage gesperrt ist. Es gibt ein beliebtes Open-Source-C # -Maschinelles Lernframework namens Accord.NET und hier ist seine Webseite: accord-framework.net
James Ko
2
In ML.NET investiert Microsoft viel. Ich habe dieses 1-stündige Video erstellt, das Ihnen helfen kann, mit ML.NET unter Verwendung von C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Schauen Sie sich auch scisharpstack.org an , um die beliebtesten Bibliotheken für maschinelles Lernen von Python nach C # zu
portieren

Antworten:

59

Schauen Sie sich diese fantastische Liste auf GitHub an. Von den aufgeführten Frameworks ist Accord.NET Open Source und mit über 2.000 Sternen das beliebteste.

Schauen Sie sich auch die offizielle Bibliothek für maschinelles Lernen für .NET an, die von Microsoft bereitgestellt wird: https://github.com/dotnet/machinelearning


ALT

Es gibt eine neuronale Netzwerkbibliothek namens AForge.net im Codeprojekt. (Code, der bei Google gehostet wird ) ( Schauen Sie sich auch die AForge-Homepage an - Laut der Homepage unterstützt die neue Version jetzt auch genetische Algorithmen und maschinelles Lernen. Es sieht so aus, als ob es seit meinem letzten Spiel viel Fortschritte gemacht hat.)

Ich weiß nicht, dass es so etwas wie WEKA ist, da ich das nie benutzt habe.

(Es gibt auch einen Artikel über seine Verwendung )

Simon P Stevens
quelle
1
Nicht schlecht, aber zumindest für jemanden, der mit dem Thema nicht sehr vertraut ist, ist es wirklich keine so gute Wahl. Sie verwenden keine Teilklassen für ihre Formulare (macht es schwierig, den Code hinter ihren Beispielen zu lesen), und ich kann keine anständige Dokumentation dafür finden.
RCIX
@RCIX: Ich stimme zu, es ist nicht gerade einfach, man muss zuerst die neuronalen Netze und die Mathematik dahinter verstehen. Es ist sicherlich nicht dazu gedacht, NNs zu unterrichten, sondern sie zu implementieren, wenn Sie wissen, was Sie tun. Die Dokumente sind hier - vorgenet.com/framework/docs , aber ja, sie sehen ein bisschen spärlich aus. Persönlich habe ich es seit einigen Jahren nicht mehr benutzt und es sieht so aus, als ob es seitdem viel hinzugefügt wurde, so dass es wahrscheinlich an Komplexität zugenommen hat.
Simon P Stevens
1
AForge ist jetzt in github.com/accord-net/framework
Nikolay Kostov
14

Weka kann sehr einfach von C # aus verwendet werden, wie Shane sagte, mit IKVM und etwas 'Klebercode'. Befolgen Sie das Tutorial auf der Weka-Seite , um die '.Net-Version' von Weka zu erstellen. Anschließend können Sie versuchen, die folgenden Tests auszuführen:

[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);
}

Der erste Test zeigt, wie Sie einen Klassifikator erstellen und damit ein neues Beispiel klassifizieren, der zweite zeigt, wie Sie einen persistierten Klassifikator aus einer Datei verwenden können, um ein Beispiel zu klassifizieren. Wenn Sie auch diskrete Attribute unterstützen möchten, sind einige Änderungen erforderlich. Der obige Code verwendet 2 Hilfsklassen:

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);
    }
}
Gregor Slavec
quelle
13

Ich habe eine ML-Bibliothek in C # erstellt, die für die Verwendung mit gängigen POCO-Objekten ausgelegt ist.

Seth Juarez
quelle
2

Es gibt auch ein Projekt namens Encog mit C # -Code. Es wird von Jeff Heaton gepflegt, dem Autor eines Buches "Introduction to Neural Network", das ich vor einiger Zeit gekauft habe. Die Codebasis Git ist hier: https://github.com/encog/encog-dotnet-core

vanni.torelli
quelle