thư viện máy học trong C # [đã đóng]


116

Có thư viện máy học nào trong C # không? Tôi đang theo đuổi thứ gì đó như WEKA . Cảm ơn bạn.


89
Tôi không đồng ý rằng đây không phải là một câu hỏi mang tính xây dựng. Tôi nghĩ rằng sẽ rất hữu ích khi có một bộ đề xuất thư viện do người dùng quản lý đối với các kết quả tự động mà một tìm kiếm google xuất hiện. Tôi không thấy lý do tại sao các đề xuất thư viện không thể đi kèm với "sự kiện, tài liệu tham khảo và chuyên môn cụ thể" như được mô tả trong phần ghi chú gần.
Ismail Degani

2
@IsmailDegani Bạn có thể bỏ phiếu để mở lại không?
James Ko

4
MỌI NGƯỜI XEM NHỮNG NGƯỜI KHAI THÁC: Các câu trả lời dưới đây được ghi ngày vì câu hỏi đã bị khóa. Có một khung công tác máy học C # mã nguồn mở phổ biến được gọi là Accord.NET và đây là trang web của nó: accord-framework.net
James Ko

2
ML.NET là một nơi mà Microsoft đang đầu tư rất nhiều. Tôi đã tạo video 1 giờ này có thể giúp bạn bắt đầu với ML.NET bằng C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala

1
Ngoài ra hãy xem scisharpstack.org , một nỗ lực để chuyển các thư viện máy học phổ biến nhất từ ​​Python sang C #
henon

Câu trả lời:


59

Kiểm tra danh sách tuyệt vời này trên GitHub. Trong số các khung được liệt kê, Accord.NET là mã nguồn mở và phổ biến nhất với hơn 2.000 sao.

Ngoài ra, hãy kiểm tra thư viện máy học chính thức cho .NET do Microsoft cung cấp: https://github.com/dotnet/machinelearning


Có một thư viện mạng thần kinh được gọi là AForge.net trên bảng mã. (Mã được lưu trữ tại mã Google ) (Đồng thời kiểm tra trang chủ của AForge - Theo trang chủ, phiên bản mới hiện hỗ trợ thuật toán di truyền và học máy. Có vẻ như nó đã tiến bộ rất nhiều kể từ lần cuối tôi chơi với nó)

Tôi không biết đó là bất cứ thứ gì giống như WEKA vì tôi chưa bao giờ sử dụng nó.

(cũng có một bài viết về việc sử dụng nó )


1
Không tệ mặc dù ít nhất là đối với một người không rành về chủ đề này, đó thực sự không phải là một lựa chọn tốt. Họ không sử dụng các lớp một phần cho các biểu mẫu của họ (khiến cho việc đọc mã đằng sau các mẫu của họ trở nên khó khăn) và tôi không thể tìm thấy tài liệu phù hợp cho nó.
RCIX

@RCIX: Tôi đồng ý rằng nó không chính xác đơn giản, bạn thực sự cần phải hiểu các mạng lưới thần kinh và toán học đằng sau chúng. Nó chắc chắn không được thiết kế để dạy NN mà là để thực hiện chúng khi bạn biết bạn đang làm gì. Các tài liệu ở đây - aforgenet.com/framework/docs , nhưng vâng, chúng trông hơi thưa thớt. Cá nhân tôi đã không sử dụng nó trong vài năm và có vẻ như nó đã được bổ sung rất nhiều kể từ đó nên có lẽ nó đã phát triển phức tạp.
Simon P Stevens

1
AForge hiện được sáp nhập vào github.com/accord-net/framework
Nikolay Kostov


14

Weka có thể được sử dụng từ C # rất dễ dàng như Shane đã nêu, sử dụng IKVM và một số 'mã keo'. Theo hướng dẫn trên trang weka để tạo 'phiên bản .Net' của weka, sau đó bạn có thể thử chạy các thử nghiệm sau:

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

Thử nghiệm đầu tiên cho thấy, cách bạn xây dựng một trình phân loại và phân loại một Ví dụ mới với nó, lần thứ hai cho thấy, làm thế nào bạn có thể sử dụng một trình phân loại bền vững từ một tệp để phân loại một ví dụ. Nếu bạn cần quá hỗ trợ các thuộc tính rời rạc, một số sửa đổi sẽ là cần thiết. Đoạn mã trên sử dụng 2 lớp trình trợ giúp:

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


2

Ngoài ra còn có một dự án gọi là Encog có mã C #. Nó được duy trì bởi Jeff Heaton, tác giả của cuốn sách "Giới thiệu về mạng thần kinh" mà tôi đã mua cách đây một thời gian. Cơ sở mã hóa Git có tại đây: https://github.com/encog/encog-dotnet-core


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.