2009-10-26 13 views
97

Gibt es irgendwelche Maschinen lernen Bibliotheken in C#? Ich bin nach etwas wie WEKA. Danke.Machine Learning-Bibliotheken in C#

+71

Ich bin nicht einverstanden, dass Das ist keine konstruktive Frage. Ich denke, es ist sehr nützlich, eine Reihe von benutzerdefinierten kuratierten Bibliotheksvorschlägen über die automatisierten Ergebnisse zu haben, die eine Google-Suche aufzeigt. Ich sehe nicht, warum Bibliotheksvorschläge nicht durch "Fakten, Referenzen und spezifische Fachkenntnisse" begleitet werden können, wie in den Schlussnotizen beschrieben. –

+0

@IsmailDegani Können Sie wählen, um wieder zu öffnen? –

+0

SUCHE NACH FRAMEWORKS: Die Antworten unten sind datiert, weil die Frage gesperrt ist. Es gibt ein beliebtes, Open-Source C# Machine Learning Framework namens Accord.NET und hier ist seine Webseite: http://accord-framework.net/ –

Antwort

49

Es gibt eine neuronale Netzwerkbibliothek namens AForge.net auf dem Codeprojekt. (Kodex bei Google code gehostet) (auch die AForge homepage Kasse - Laut der Homepage, die neue Version unterstützt nun auch genetische Algorithmen und Maschine als auch das Lernen Es sieht aus wie es eine Menge Fortschritte gemacht, seit ich das letzte Mal mit ihm gespielt.)

I don Ich weiß nicht, dass es WEKA ist, wie ich es noch nie benutzt habe.

(es gibt auch einen Artikel über es usage)

+0

Nice one. Upvoted. –

+0

Nicht schlecht, aber zumindest für jemanden, der mit dem Thema nicht sehr vertraut ist, ist es wirklich keine gute Wahl. Sie verwenden keine partiellen Klassen für ihre Formen (macht es schwierig, den Code hinter ihren Beispielen zu lesen), und ich kann keine anständige Dokumentation dafür finden. – RCIX

+0

@RCIX: Ich stimme zu, es ist nicht gerade einfach, Sie müssen wirklich neuronale 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 - http://www.aforgenet.com/framework/docs/, aber ja, sie sehen etwas spärlich aus. Persönlich habe ich es seit mehreren Jahren nicht mehr verwendet, und es sieht so aus, als ob es seitdem viel hinzugefügt worden ist, also ist es wahrscheinlich in der Komplexität gewachsen. –

12

Ich habe eine ML library in C# erstellt, die mit allgemeinen POCO-Objekten arbeiten soll.

14

Weka kann sehr einfach von C# verwendet werden, wie Shane feststellte, mit IKVM und einem "Klebecode". Folow das Tutorial auf weka page die ‚.Net Version‘ von weka zu erstellen, dann 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); 
} 

Erster Test zeigt, wie Sie einen Klassifikator bauen und ein neues Beispiel mit ihm klassifizieren, Der zweite zeigt, wie Sie einen persistenten Klassifikator aus einer Datei verwenden können, um ein Beispiel zu klassifizieren. Wenn Sie diskrete Attribute unterstützen müssen, 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); 
    } 
} 
2

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