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.


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 )


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


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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.