C #’daki makine öğrenimi kitaplıkları [kapalı]


116

C #'da herhangi bir makine öğrenimi kitaplığı var mı? WEKA gibi bir şeyin peşindeyim . Teşekkür ederim.


89
Bunun yapıcı bir soru olmadığına katılmıyorum. Bir Google aramasının ortaya çıkardığı otomatik sonuçlar üzerinde kullanıcı tarafından seçilmiş bir dizi kitaplık önerisine sahip olmanın çok yararlı olduğunu düşünüyorum. Kapanış notlarında açıklandığı gibi kütüphane önerilerine neden "gerçekler, referanslar ve belirli uzmanlık" eşlik edemiyor anlamıyorum.
Ismail Degani

2
@IsmailDegani Daha sonra yeniden açmak için oy verebilir misiniz?
James Ko

4
ÇERÇEVE ARAYAN HERKES: Soru kilitli olduğu için aşağıdaki cevaplar tarihli. Accord.NET adında popüler, açık kaynaklı bir C # makine öğrenimi çerçevesi var ve işte web sayfası: accord-framework.net
James Ko

2
ML.NET, Microsoft'un çok yatırım yaptığı bir yerdir. C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala

1
Python'dan C #'ya en popüler makine öğrenimi kitaplıklarını taşıma çabası olan scisharpstack.org'a da göz atın
henon

Yanıtlar:


59

GitHub'daki bu harika listeye göz atın . Listelenen çerçeveler arasında Accord.NET açık kaynaklıdır ve 2.000'den fazla yıldızla en popüler olanıdır.

Ayrıca Microsoft tarafından sağlanan .NET için resmi makine öğrenimi kitaplığına bakın: https://github.com/dotnet/machinelearning


ESKİ

Kod projesinde AForge.net adında bir sinir ağı kitaplığı var . ( Google kodunda barındırılan kod ) (Ayrıca AForge ana sayfasını kontrol edin - Ana sayfaya göre, yeni sürüm artık genetik algoritmaları ve makine öğrenimini de destekliyor. En son oynadığımdan bu yana çok ilerleme kaydetmiş gibi görünüyor)

Bunu hiç kullanmadığım için WEKA gibi bir şey olduğunu bilmiyorum.

(ayrıca kullanımıyla ilgili bir makale var )


1
Fena değil ama en azından konuya pek aşina olmayan biri için bu gerçekten iyi bir seçim değil. Formları için kısmi sınıflar kullanmıyorlar (örneklerinin arkasındaki kodu okumayı zorlaştırıyor) ve bunun için uygun belgeler bulamıyorum.
RCIX

@RCIX: Kesinlikle basit olmadığına katılıyorum, gerçekten önce sinir ağlarını ve arkasındaki matematiği anlamanız gerekiyor. Kesinlikle NN'leri öğretmek için değil, ne yaptığınızı bildiğinizde bunları uygulamak için tasarlandı. Dokümanlar burada - aforgenet.com/framework/docs , ama evet, biraz seyrek görünüyorlar. Şahsen, onu birkaç yıldır kullanmadım ve o zamandan beri çok fazla eklenmiş gibi görünüyor, bu yüzden muhtemelen karmaşıklık içinde büyümüştür.
Simon P Stevens

1
AForge şimdi birleştirilir github.com/accord-net/framework
Nikolay Kostov


14

Weka, Shane'in belirttiği gibi IKVM ve bazı 'yapıştırıcı kodu' kullanarak C # 'dan çok kolay kullanılabilir. Weka'nın '.Net sürümünü' oluşturmak için weka sayfasındaki öğreticiyi izleyin, ardından aşağıdaki testleri çalıştırmayı deneyebilirsiniz:

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

İlk test, bir sınıflandırıcıyı nasıl oluşturduğunuzu ve onunla yeni bir Örneği nasıl sınıflandırdığınızı gösterir, ikincisi, bir örneği sınıflandırmak için bir dosyadan kalıcı bir sınıflandırıcıyı nasıl kullanabileceğinizi gösterir. Ayrık öznitelikleri çok desteklemeye ihtiyacınız varsa, bazı değişiklikler gerekli olacaktır. Yukarıdaki kod 2 yardımcı sınıf kullanır:

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



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.