C#の機械学習ライブラリ[終了]


116

C#に機械学習ライブラリはありますか?私はWEKAのようなものを求めています。ありがとうございました。


89
これは建設的な質問ではないことに同意しません。Google検索で表示される自動化された結果に対して、ユーザーが作成したライブラリの候補のセットがあると非常に便利だと思います。クローズノートに記載されているように、ライブラリの提案に「事実、参照、および特定の専門知識」を伴うことができない理由はわかりません。
Ismail

2
@IsmailDegani投票して、再開することはできますか?
James Ko

4
フレームワークを探している人:質問がロックされているため、以下の回答は日付が付けられています。Accord.NETと呼ばれる人気のあるオープンソースのC#機械学習フレームワークがあり、ここにそのWebページがあります。accord
James Ko

2
ML.NETは、Microsoftが多額の投資をしているものです。C#youtube.com
watch?v=

1
また、最も人気のある機械学習ライブラリをPythonからC#に移植するための取り組みであるscisharpstack.orgもチェックしてください
henon

回答:


59

GitHubでこの素晴らしいリストをチェックしてください。リストされているフレームワークの中で、Accord.NETはオープンソースであり、2,000を超えるスターで最も人気があります。

また、Microsoftが提供する.NETの公式機械学習ライブラリも確認してください。https//github.com/dotnet/machinelearning


古い

codeprojectにはAForge.net と呼ばれるニューラルネットワークライブラリがあります。(Googleのコードでホストされているコード)(また、AForgeホームページを確認してください - ホームページによると、新しいバージョンでは、遺伝的アルゴリズムと機械学習もサポートされるようになりました。最後に遊んだときから、かなり進歩しているようです)

今まで使ったことがないのでWEKAのようなものかわかりません。

使用方法に関する記事もあります


1
少なくとも、このトピックにあまり詳しくない人にとっては悪くありませんが、それほど良い選択ではありません。彼らはフォームに部分クラスを使用せず(サンプルの背後にあるコードを読みにくくします)、適切なドキュメントを見つけることができません。
RCIX 2009年

@RCIX:私はそれが厳密に単純ではないことに同意します。まず、ニューラルネットワークとその背後にある数学を本当に理解する必要があります。それは確かにNNを教えるように設計されているのではなく、あなたが何をしているのか知っているときにそれらを実装するように設計されています。ドキュメントはここにあります-aforgenet.com/framework/docs、しかしはい、彼らは少しまばらに見えます。個人的に、私は数年使用していません。それ以来、追加されているように見えますので、おそらく複雑さが増しています。
Simon P Stevens、

1
AForgeがgithub.com/accord-net/frameworkに統合されました
Nikolay Kostov


14

Wekaは、シェーンが述べたように、IKVMといくつかの「グルーコード」を使用して、C#から非常に簡単に使用できます。weka ページのチュートリアルに従って、「。Netバージョン」のwekaを作成してから、次のテストを実行してみてください。

[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番目のテストでは、ファイルから永続化された分類子を使用して例を分類する方法を示します。個別の属性をサポートする必要がある場合は、いくつかの変更が必要になります。上記のコードは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);
    }
}



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.