bibliotecas de aprendizaje automático en C # [cerrado]

116

¿Hay bibliotecas de aprendizaje automático en C #? Estoy tras algo como WEKA . Gracias.

Dervin Thunk
fuente
89
No estoy de acuerdo con que esta no sea una pregunta constructiva. Creo que es muy útil tener un conjunto de sugerencias de bibliotecas seleccionadas por el usuario sobre los resultados automatizados que aparecen en una búsqueda de Google. No veo por qué las sugerencias de la biblioteca no pueden ir acompañadas de "hechos, referencias y experiencia específica" como se describe en las notas finales.
Ismail Degani
2
@IsmailDegani ¿Puedes votar para reabrir entonces?
James Ko
4
CUALQUIERA QUE BUSQUE MARCOS: Las siguientes respuestas están fechadas porque la pregunta está bloqueada. Existe un marco de aprendizaje de máquina C # de código abierto popular llamado Accord.NET y aquí está su página web: accord-framework.net
James Ko
2
ML.NET es uno en el que Microsoft está invirtiendo mucho. He creado este video de 1 hora que puede ayudarlo a comenzar con ML.NET usando C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Consulte también scisharpstack.org , un esfuerzo por migrar las bibliotecas de aprendizaje automático más populares de Python a C #
henon

Respuestas:

59

Echa un vistazo a esta increíble lista en GitHub. De los marcos enumerados, Accord.NET es de código abierto y el más popular con más de 2.000 estrellas.

Además, consulte la biblioteca oficial de aprendizaje automático para .NET proporcionada por Microsoft: https://github.com/dotnet/machinelearning


ANTIGUO

Hay una biblioteca de redes neuronales llamada AForge.net en el proyecto de código. (Código alojado en el código de Google ) ( Consulte también la página de inicio de AForge : según la página de inicio, la nueva versión ahora también admite algoritmos genéticos y aprendizaje automático. Parece que ha progresado mucho desde la última vez que jugué con ella)

No sé si es algo parecido a WEKA, ya que nunca lo he usado.

(también hay un artículo sobre su uso )

Simon P Stevens
fuente
1
No está mal, aunque al menos para alguien que no esté muy familiarizado con el tema, realmente no es una buena elección. No usan clases parciales para sus formularios (dificulta la lectura del código detrás de sus ejemplos) y no puedo encontrar documentación decente para ello.
RCIX
@RCIX: Estoy de acuerdo en que no es exactamente simple, primero necesitas entender las redes neuronales y las matemáticas detrás de ellas. Ciertamente, no está diseñado para enseñar a los NN, sino para implementarlos cuando sepa lo que está haciendo. Los documentos están aquí: aforgenet.com/framework/docs , pero sí, se ven un poco escasos. Personalmente, no lo he usado durante varios años, y parece que se ha agregado mucho desde entonces, por lo que probablemente haya aumentado su complejidad.
Simon P Stevens
1
AForge ahora se fusiona en github.com/accord-net/framework
Nikolay Kostov
14

Weka se puede usar desde C # muy fácilmente como dijo Shane, usando IKVM y algún 'código de pegamento'. Siga el tutorial en la página de weka para crear la 'versión .Net' de weka, luego puede intentar ejecutar las siguientes pruebas:

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

La primera prueba muestra cómo se construye un clasificador y se clasifica un nuevo ejemplo con él, la segunda muestra cómo se puede usar un clasificador persistente de un archivo para clasificar un ejemplo. Si también necesita admitir atributos discretos, será necesaria alguna modificación. El código anterior usa 2 clases de ayuda:

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
fuente
13

He creado una biblioteca ML en C # que está diseñada para trabajar con objetos POCO comunes.

Seth Juárez
fuente
2

También hay un proyecto llamado Encog que tiene código C #. Lo mantiene Jeff Heaton, el autor de un libro "Introducción a las redes neuronales" que compré hace un tiempo. El código base Git está aquí: https://github.com/encog/encog-dotnet-core

vanni.torelli
fuente