librerie di machine learning in C # [chiuse]


116

Esistono librerie di machine learning in C #? Sto cercando qualcosa come WEKA . Grazie.


89
Non sono d'accordo sul fatto che questa non sia una domanda costruttiva. Penso che sia molto utile avere una serie di suggerimenti di libreria curati dall'utente sui risultati automatici che una ricerca su Google presenta. Non vedo perché i suggerimenti della biblioteca non possano essere accompagnati da "fatti, riferimenti e competenze specifiche" come descritto nelle note di chiusura.
Ismail Degani

2
@IsmailDegani Puoi votare per riaprire allora?
James Ko

4
CHIUNQUE CERCA FRAMEWORK: Le risposte seguenti sono datate perché la domanda è bloccata. Esiste un framework di apprendimento automatico C # popolare e open source chiamato Accord.NET ed ecco la sua pagina web: accord-framework.net
James Ko

2
ML.NET è uno in cui Microsoft sta investendo molto. Ho creato questo video di 1 ora che può aiutarti a iniziare con ML.NET usando C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala

1
Dai un'occhiata anche a scisharpstack.org , uno sforzo per portare le librerie di machine learning più popolari da Python a C #
henon

Risposte:


59

Dai un'occhiata a questo fantastico elenco su GitHub. Tra i framework elencati, Accord.NET è open source e il più popolare con oltre 2.000 stelle.

Inoltre, controlla la libreria ufficiale di machine learning per .NET fornita da Microsoft: https://github.com/dotnet/machinelearning


VECCHIO

C'è una libreria di rete neurale chiamata AForge.net sul progetto in codice. (Codice ospitato su Google code ) ( Controlla anche la homepage di AForge - Secondo la homepage, la nuova versione ora supporta anche algoritmi genetici e apprendimento automatico. Sembra che sia progredito molto dall'ultima volta che ci ho giocato)

Non so che sia qualcosa di simile a WEKA perché non l'ho mai usato.

(c'è anche un articolo sul suo utilizzo )


1
Non male anche se almeno per qualcuno che non ha molta familiarità con l'argomento non è davvero una buona scelta. Non usano classi parziali per i loro moduli (rende difficile leggere il codice dietro i loro esempi) e non riesco a trovare una documentazione decente per questo.
RCIX

@ RCIX: Sono d'accordo che non sia esattamente semplice, devi davvero capire prima le reti neurali e la matematica dietro di esse. Certamente non è progettato per insegnare agli NN ma piuttosto per implementarli quando sai cosa stai facendo. I documenti sono qui - aforgenet.com/framework/docs , ma sì, sembrano un po 'sparsi. Personalmente, non lo uso da diversi anni e da allora sembra che sia stato aggiunto molto, quindi probabilmente è cresciuto in complessità.
Simon P Stevens,



14

Weka può essere usato da C # molto facilmente come ha affermato Shane, usando IKVM e un po 'di "codice colla". Segui il tutorial sulla pagina di weka per creare la "versione .Net" di weka, quindi puoi provare a eseguire i seguenti test:

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

Il primo test mostra come costruire un classificatore e classificare un nuovo Esempio con esso, il secondo mostra come usare un classificatore persistente da un file per classificare un esempio. Se hai bisogno di supportare troppo attributi discreti, alcune modifiche saranno necessarie. Il codice sopra usa 2 classi helper:

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



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.