perpustakaan pembelajaran mesin di C # [ditutup]

116

Apakah ada perpustakaan pembelajaran mesin di C #? Saya mencari sesuatu seperti WEKA . Terima kasih.

Dervin Thunk
sumber
89
Saya tidak setuju bahwa ini bukanlah pertanyaan yang membangun. Saya pikir itu sangat berguna untuk memiliki sekumpulan saran perpustakaan yang dikurasi pengguna atas hasil otomatis pencarian google muncul. Saya tidak mengerti mengapa saran perpustakaan tidak dapat disertai dengan "fakta, referensi, dan keahlian khusus" seperti yang dijelaskan dalam catatan penutup.
Ismail Degani
2
@IsmailDegani Bisakah Anda memilih untuk membuka kembali?
James Ko
4
SIAPA PUN YANG MENCARI KERANGKA: Jawaban di bawah diberi tanggal karena pertanyaannya terkunci. Ada kerangka kerja pembelajaran mesin C # sumber terbuka yang populer yang disebut Accord.NET dan ini halaman webnya
James Ko
2
ML.NET adalah salah satu tempat Microsoft berinvestasi banyak. Saya telah membuat video 1 jam ini yang dapat membantu Anda memulai ML.NET menggunakan C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala
1
Lihat juga scisharpstack.org , upaya untuk mem -port perpustakaan pembelajaran mesin paling populer dari Python ke C #
henon

Jawaban:

59

Lihat daftar luar biasa ini di GitHub. Dari kerangka kerja yang terdaftar, Accord.NET adalah sumber terbuka dan paling populer dengan lebih dari 2.000 bintang.

Selain itu, lihat pustaka pembelajaran mesin resmi untuk .NET yang disediakan oleh Microsoft: https://github.com/dotnet/machinelearning


TUA

Ada pustaka jaringan saraf yang disebut AForge.net di codeproject . (Kode dihosting di kode Google ) (Juga periksa beranda AForge - Menurut beranda, versi baru sekarang mendukung algoritme genetika dan pembelajaran mesin juga. Sepertinya itu berkembang pesat sejak terakhir kali saya memainkannya)

Saya tidak tahu itu seperti WEKA karena saya tidak pernah menggunakannya.

(ada juga artikel tentang penggunaannya )

Simon P Stevens
sumber
1
Tidak buruk meskipun setidaknya untuk seseorang yang tidak terlalu akrab dengan topik itu sebenarnya bukan pilihan yang bagus. Mereka tidak menggunakan kelas parsial untuk formulir mereka (membuatnya sulit untuk membaca kode di belakang sampel mereka), dan saya tidak dapat menemukan dokumentasi yang layak untuk itu.
RCIX
@RCIX: Saya setuju ini tidak sepenuhnya sederhana, Anda benar-benar perlu memahami jaringan saraf dan matematika di baliknya terlebih dahulu. Ini tentu saja tidak dirancang untuk mengajar NN tetapi untuk mengimplementasikannya ketika Anda tahu apa yang Anda lakukan. Dokumennya ada di sini - aforgenet.com/framework/docs , tetapi ya, dokumen tersebut terlihat agak jarang. Secara pribadi, saya belum pernah menggunakannya selama beberapa tahun, dan sepertinya sudah banyak ditambahkan sejak saat itu jadi mungkin berkembang dalam kompleksitas.
Simon P Stevens
1
AForge sekarang digabungkan menjadi github.com/accord-net/framework
Nikolay Kostov
14

Weka dapat digunakan dari C # dengan sangat mudah seperti yang Shane katakan, menggunakan IKVM dan beberapa 'kode lem'. Ikuti tutorial di halaman weka untuk membuat '. Versi Net' dari weka, maka Anda dapat mencoba menjalankan tes berikut:

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

Tes pertama menunjukkan, bagaimana Anda membuat pengklasifikasi dan mengklasifikasikan Contoh baru dengannya, pengujian kedua menunjukkan, bagaimana Anda dapat menggunakan pengklasifikasi tetap dari file untuk mengklasifikasikan contoh. Jika Anda membutuhkan terlalu banyak dukungan atribut diskrit, beberapa modifikasi akan diperlukan. Kode di atas menggunakan 2 kelas 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);
    }
}
Gregor Slavec
sumber
13

Saya telah membuat perpustakaan ML di C # yang dirancang untuk bekerja dengan objek POCO umum.

Seth Juarez
sumber
2

Ada juga proyek bernama Encog yang memiliki kode C #. Ini dikelola oleh Jeff Heaton, penulis buku "Pengantar Jaringan Syaraf" yang saya beli beberapa waktu lalu. Basis kode Git ada di sini: https://github.com/encog/encog-dotnet-core

vanni.torelli
sumber
2

Saya mencari pustaka pembelajaran mesin untuk .NET juga dan menemukan Infer.NET dari Microsoft Research di nuget.org/machine-learning :

Ole Lynge
sumber