2009-10-26 5 views
97

Czy istnieją biblioteki uczenia maszynowego w języku C#? Mam coś takiego jak WEKA. Dziękuję.biblioteki uczenia maszynowego w języku C#

+71

nie zgadzam się, że to nie jest konstruktywne pytanie. Wydaje mi się, że bardzo użyteczne jest posiadanie zestawu sugestii biblioteki wybieranych przez użytkowników w porównaniu z automatycznymi wynikami wyszukiwania w wyszukiwarce Google. Nie rozumiem, dlaczego sugestiom bibliotecznym nie mogą towarzyszyć "fakty, referencje i określona wiedza specjalistyczna", jak to opisano w uwagach zamykających. –

+0

@IsmailDegani Czy możesz głosować na ponowne otwarcie? –

+0

KAŻDEGO PRZYGOTOWYWANIE DO PROGRAMÓW: Poniższe odpowiedzi są opatrzone datą, ponieważ pytanie jest zablokowane. Istnieje popularna platforma do uczenia maszynowego C# o nazwie Open Accord.NET, a tutaj jest jej strona internetowa: http://accord-framework.net/ –

Odpowiedz

49

Istnieje biblioteka sieci neuronowych o nazwie AForge.net na codeproject. (Kod hostowane na Google code) (Również wyewidencjonowania AForge homepage - Według głównej, nowa wersja obsługuje algorytmy genetyczne i Uczenia Maszynowego jak dobrze to wygląda to postępuje dużo odkąd ostatnio grał z nim.)

I don Wiem, że to jest coś takiego jak WEKA, ponieważ nigdy tego nie używałem.

(tam również artykuł o to usage)

+0

Nice. Rewizja. –

+0

Nieźle, przynajmniej dla kogoś, kto nie bardzo zna ten temat, tak naprawdę nie jest to dobry wybór. Nie używają klas częściowych do swoich formularzy (utrudnia odczytanie kodu za ich próbkami) i nie mogę znaleźć dla nich przyzwoitej dokumentacji. – RCIX

+0

@RCIX: Zgadzam się, że to nie jest takie proste, naprawdę musisz najpierw zrozumieć sieci neuronowe i matematykę. Z pewnością nie jest przeznaczony do nauczania NN, ale raczej do ich realizacji, gdy wiesz, co robisz. Dokumenty są tutaj - http://www.aforgenet.com/framework/docs/, ale tak, wyglądają nieco skromnie. Osobiście nie korzystałem z niego od kilku lat i wygląda na to, że od tego czasu jest dużo dodawane, więc prawdopodobnie rośnie w złożoności. –

12

Utworzono ML library w języku C#, który jest przeznaczony do pracy z typowymi obiektami POCO.

14

Weka może być używany z C# bardzo łatwo, jak powiedział Shane, używając IKVM i jakiegoś "kodu kleju". Folow tutorial na weka page stworzyć „wersję .NET” o WEKA, to można spróbować uruchomić następujące testy:

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

pierwszy test pokazuje, w jaki sposób zbudować klasyfikator i sklasyfikować nowy Przykład z niego, drugi pokazuje, jak można wykorzystać trwały klasyfikator z pliku, aby sklasyfikować przykład. Jeśli potrzebujesz również obsługiwać dyskretne atrybuty, konieczne będą pewne modyfikacje. Powyższy kod używa dwóch klas pomocniczych:

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

Istnieje również projekt o nazwie Encog, który ma kod C#. Prowadzi je Jeff Heaton, autor książki "Wprowadzenie do sieci neuronowej", którą kupiłem jakiś czas temu. Kodzie Git jest tutaj: https://github.com/encog/encog-dotnet-core