biblioteki uczenia maszynowego w C # [zamknięte]

116

Czy są jakieś biblioteki uczenia maszynowego w C #? Szukam czegoś takiego jak WEKA . Dziękuję Ci.

Dervin Thunk
źródło
89
Nie zgadzam się, że to nie jest konstruktywne pytanie. Myślę, że bardzo przydatne jest posiadanie zestawu sugestii bibliotecznych wyselekcjonowanych przez użytkowników w odniesieniu do automatycznych wyników wyszukiwania Google. Nie rozumiem, dlaczego sugestiom bibliotecznym nie mogą towarzyszyć „fakty, odniesienia i konkretne ekspertyzy”, jak opisano w uwagach końcowych.
Ismail Degani
2
@IsmailDegani Czy możesz więc głosować za ponownym otwarciem?
James Ko,
4
KAŻDY POSZUKUJE RAM: Poniższe odpowiedzi są nieaktualne, ponieważ pytanie jest zablokowane. Istnieje popularna platforma uczenia maszynowego C # typu open source o nazwie Accord.NET, a tutaj jest jej strona internetowa: accord-framework.net
James Ko,
2
ML.NET to taki, w który Microsoft dużo inwestuje. Stworzyłem ten 1-godzinny film, który może pomóc Ci rozpocząć pracę z ML.NET przy użyciu C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Sprawdź również scisharpstack.org , próbę przeniesienia najpopularniejszych bibliotek uczenia maszynowego z języka Python na
język

Odpowiedzi:

59

Sprawdź tę niesamowitą listę na GitHub. Spośród wymienionych frameworków Accord.NET jest open-source i najpopularniejszy z ponad 2000 gwiazdek.

Sprawdź również oficjalną bibliotekę uczenia maszynowego dla .NET dostarczoną przez firmę Microsoft: https://github.com/dotnet/machinelearning


STARY

W projekcie kodu znajduje się biblioteka sieci neuronowej o nazwie AForge.net. (Kod hostowany w kodzie Google ) ( Zapoznaj się również ze stroną główną AForge - zgodnie ze stroną główną nowa wersja obsługuje teraz również algorytmy genetyczne i uczenie maszynowe. Wygląda na to, że bardzo się rozwinął, odkąd ostatnio z nią grałem)

Nie wiem, że to coś w rodzaju WEKA, ponieważ nigdy tego nie używałem.

(jest też artykuł o jego użyciu )

Simon P. Stevens
źródło
1
Nieźle, ale przynajmniej dla kogoś niezbyt zaznajomionego z tematem, to naprawdę nie jest dobry wybór. Nie używają klas częściowych dla swoich formularzy (utrudnia to odczytanie kodu za ich przykładami) i nie mogę znaleźć odpowiedniej dokumentacji.
RCIX
@RCIX: Zgadzam się, że to nie jest do końca proste, naprawdę musisz najpierw zrozumieć sieci neuronowe i matematykę, która za nimi stoi. Z pewnością nie jest przeznaczony do nauczania NN, ale raczej do ich wdrażania, gdy wiesz, co robisz. Dokumenty są tutaj - aforgenet.com/framework/docs , ale tak, wyglądają trochę skąpo. Osobiście nie używałem go od kilku lat i wygląda na to, że od tamtej pory wiele się dodał, więc prawdopodobnie urosła w złożoność.
Simon P Stevens
1
AForge jest teraz połączony z github.com/accord-net/framework
Nikolay Kostov
15

Możesz również użyć Weka z C # . Najlepszym rozwiązaniem jest skorzystanie z IKVM , tak jak w tym samouczku , chociaż można również użyć oprogramowania mostkującego.

Shane
źródło
1
O jakim „oprogramowaniu pomostowym” mówisz? które?
lmsasu
14

Weka może być bardzo łatwo używany z C #, jak stwierdził Shane, używając IKVM i jakiegoś „kodu kleju”. Postępuj zgodnie z samouczkiem na stronie weka, aby utworzyć `` wersję .Net '' weka, a następnie możesz 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, jak budujesz klasyfikator i klasyfikujesz za jego pomocą nowy Przykład, drugi pokazuje, jak możesz użyć utrwalonego klasyfikatora z pliku do sklasyfikowania przykładu. Jeśli potrzebujesz również obsługi atrybutów dyskretnych, konieczna będzie pewna modyfikacja. Powyższy kod używa 2 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);
    }
}
Gregor Slavec
źródło
13

Stworzyłem bibliotekę ML w C #, która jest przeznaczona do pracy z typowymi obiektami POCO.

Seth Juarez
źródło
2

Istnieje również projekt o nazwie Encog, który zawiera kod C #. Utrzymuje go Jeff Heaton, autor książki „Wprowadzenie do sieci neuronowej”, którą kupiłem jakiś czas temu. Baza kodu Git jest tutaj: https://github.com/encog/encog-dotnet-core

vanni.torelli
źródło