C #의 기계 학습 라이브러리 [닫힌]


116

C #에 기계 학습 라이브러리가 있습니까? 나는 WEKA 와 같은 것을 찾고 있습니다. 감사합니다.


89
나는 이것이 건설적인 질문이 아니라는 데 동의하지 않습니다. Google 검색이 표시되는 자동화 된 결과에 대해 사용자가 선별 한 라이브러리 제안 세트를 갖는 것이 매우 유용하다고 생각합니다. 닫기 노트에 설명 된대로 라이브러리 제안에 "사실, 참조 및 특정 전문 지식"이 동반되지 않는 이유를 알 수 없습니다.
Ismail Degani 2013 년

2
@IsmailDegani 그러면 재 개설 투표를 할 수 있습니까?
James Ko

4
프레임 워크를 찾는 사람 : 질문이 잠겨 있기 때문에 아래 답변은 날짜가 기재되어 있습니다. Accord.NET이라는 인기있는 오픈 소스 C # 머신 러닝 프레임 워크가 있으며 여기에 웹 페이지가 있습니다. accord-framework.net
James Ko

2
ML.NET은 Microsoft가 많은 투자를하고있는 곳입니다. 난 당신이 C # 사용 ML.NET을 시작하는 데 도움이 될 수 있습니다이 1 시간 비디오를 만든 youtube.com/watch?v=83LMXWmzRDM을
Shivprasad 코이 랄라

1
또한 체크 아웃 scisharpstack.org을 C 번호에 포트에, 파이썬에서 가장 인기있는 기계 학습 라이브러리를위한 노력을
HENON

답변:


59

GitHub 에서이 멋진 목록 을 확인하세요 . 나열된 프레임 워크 중 Accord.NET은 오픈 소스이며 2,000 개가 넘는 별에서 가장 인기가 있습니다.

또한 Microsoft에서 제공하는 .NET 용 공식 기계 학습 라이브러리를 확인하십시오. https://github.com/dotnet/machinelearning


낡은

코드 프로젝트 에는 AForge.net 이라는 신경망 라이브러리가 있습니다 . ( Google 코드 에서 호스팅되는 코드 ) (또한 AForge 홈페이지를 확인하세요 .-홈페이지 에 따르면 새 버전은 이제 유전 알고리즘과 기계 학습도 지원합니다. 마지막으로 플레이 한 이후로 많이 진행된 것 같습니다.)

나는 그것을 사용한 적이 없기 때문에 그것이 WEKA와 같은 것인지 모른다.

( 사용법 에 대한 기사도 있습니다 )


1
적어도 주제에 익숙하지 않은 사람에게는 나쁘지 않지만 실제로는 좋은 선택이 아닙니다. 그들은 양식에 부분 클래스를 사용하지 않으며 (샘플 뒤에있는 코드를 읽기 어렵게 만듭니다) 적절한 문서를 찾을 수 없습니다.
RCIX

@RCIX : 정확히 간단하지 않다는 데 동의합니다. 먼저 신경망과 그 뒤에 숨은 수학을 이해해야합니다. 확실히 NN을 가르치기위한 것이 아니라 수행중인 작업을 알고있을 때이를 구현하도록 설계되었습니다. 문서는 여기에 있습니다 -aforgenet.com/framework/docs ,하지만 예, 약간 드물게 보입니다. 개인적으로 몇 년 동안 사용하지 않았고 그 이후로 많이 추가 된 것처럼 보이므로 아마도 복잡해 졌을 것입니다.
Simon P Stevens

1
AForge는 이제 github.com/accord-net/framework에 병합되었습니다 .
Nikolay Kostov


14

Weka는 Shane이 말했듯이 IKVM과 일부 '접착 코드'를 사용하여 C #에서 매우 쉽게 사용할 수 있습니다. weka 페이지 에서 튜토리얼을 따라 weka 의 '.Net 버전'을 생성 한 후 다음 테스트를 실행할 수 있습니다.

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

첫 번째 테스트에서는 분류기를 빌드하고이를 사용하여 새 예제를 분류하는 방법을 보여주고, 두 번째 테스트에서는 파일에서 지속 형 분류기를 사용하여 예제를 분류하는 방법을 보여줍니다. 개별 속성을 너무 지원해야하는 경우 일부 수정이 필요합니다. 위의 코드는 2 개의 도우미 클래스를 사용합니다.

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

C # 코드가있는 Encog라는 프로젝트도 있습니다. 이것은 내가 얼마 전에 구입 한 "Introduction to Neural Network"책의 저자 인 Jeff Heaton이 관리하고 있습니다. 코드베이스 Git은 여기에 있습니다 : https://github.com/encog/encog-dotnet-core


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.