bibliotecas de aprendizado de máquina em C # [fechado]

116

Existe alguma biblioteca de aprendizado de máquina em C #? Estou atrás de algo como WEKA . Obrigado.

Dervin Thunk
fonte
89
Discordo que esta não seja uma pergunta construtiva. Acho que é muito útil ter um conjunto de sugestões de biblioteca com curadoria de usuário sobre os resultados automatizados que uma pesquisa do Google exibe. Não vejo por que as sugestões da biblioteca não podem ser acompanhadas por "fatos, referências e conhecimentos específicos", conforme descrito nas notas fechadas.
Ismail Degani
2
@IsmailDegani Você pode votar para reabrir então?
James Ko
4
QUALQUER UM PROCURANDO QUADROS: As respostas abaixo são datadas porque a pergunta está bloqueada. Há uma estrutura de aprendizado de máquina C # popular de código aberto chamada Accord.NET e aqui está sua página da Web: Accord-framework.net
James Ko
2
ML.NET é aquele em que a Microsoft está investindo muito. Eu criei este vídeo de 1 hora que pode ajudá-lo a começar com ML.NET usando C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Verifique também scisharpstack.org , um esforço para portar as bibliotecas de aprendizado de máquina mais populares de Python para C #
henon

Respostas:

59

Confira esta lista incrível no GitHub. Dos frameworks listados, Accord.NET é open-source e o mais popular com mais de 2.000 estrelas.

Além disso, verifique a biblioteca oficial de aprendizado de máquina para .NET fornecida pela Microsoft: https://github.com/dotnet/machinelearning


VELHO

Há uma biblioteca de rede neural chamada AForge.net no codeproject. (Código hospedado no código do Google ) (Verifique também a página inicial do AForge - de acordo com a página inicial, a nova versão agora suporta algoritmos genéticos e aprendizado de máquina também. Parece que progrediu muito desde a última vez que joguei com ele)

Não sei se é algo como WEKA, pois nunca usei isso.

(há também um artigo sobre seu uso )

Simon P Stevens
fonte
1
Nada mal, embora pelo menos para alguém não muito familiarizado com o assunto, não seja uma escolha tão boa. Eles não usam classes parciais para seus formulários (torna difícil ler o código por trás de seus exemplos) e não consigo encontrar uma documentação decente para isso.
RCIX
@RCIX: Concordo que não é exatamente simples, você realmente precisa entender as redes neurais e a matemática por trás delas primeiro. Certamente não foi projetado para ensinar NNs, mas sim para implementá-los quando você sabe o que está fazendo. Os documentos estão aqui - aforgenet.com/framework/docs , mas sim, eles parecem um pouco esparsos. Pessoalmente, não o uso há vários anos e parece que foi adicionado muito desde então, então provavelmente sua complexidade aumentou.
Simon P Stevens
1
AForge agora está integrado a github.com/accord-net/framework
Nikolay Kostov
15

Você também pode usar Weka com C # . A melhor solução é usar o IKVM , como neste tutorial , embora você também possa usar o software de ponte.

Shane
fonte
1
De que "software de ponte" você está falando? quais?
lmsasu de
14

Weka pode ser usado a partir de C # muito facilmente, como Shane afirmou, usando IKVM e algum 'código de colagem'. Siga o tutorial na página do weka para criar a 'versão .Net' do weka, então você pode tentar executar os seguintes testes:

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

O primeiro teste mostra como você constrói um classificador e classifica um novo exemplo com ele, o segundo mostra como você pode usar um classificador persistente de um arquivo para classificar um exemplo. Se você também precisar de suporte a atributos discretos, algumas modificações serão necessárias. O código acima usa 2 classes auxiliares:

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

Eu criei uma biblioteca de ML em C # que foi projetada para funcionar com objetos POCO comuns.

Seth Juarez
fonte
2

Há também um projeto chamado Encog que possui código C #. É mantido por Jeff Heaton, autor de um livro "Introdução à Rede Neural" que comprei há algum tempo. O codebase Git está aqui: https://github.com/encog/encog-dotnet-core

vanni.torelli
fonte
2

Estou pesquisando bibliotecas de aprendizado de máquina para .NET também e encontrei o Infer.NET da Microsoft Research em nuget.org/machine-learning :

Ole Lynge
fonte