2009-10-26 38 views
97

C#には機械学習ライブラリはありますか?私はWEKAのようなものの後です。 ありがとうございます。C#の機械学習ライブラリ

+71

私がいることを同意しますこれは建設的な質問ではありません。私は、Google検索が自動化された結果を上回る、ユーザーが選んだライブラリの提案をすることは非常に便利だと思います。クローズノートに書かれているように、図書館の提案に「事実、参考資料、特定の専門技術」を付けることができない理由はわかりません。 –

+0

@IsmailDeganiあなたは今すぐ再開することができますか? –

+0

フレームワークを探している人:質問がロックされているため、以下の回答に日付があります。 Accord.NETと呼ばれる一般的なオープンソースのC#マシン学習フレームワークがあり、そのWebページは次のとおりです。http://accord-framework.net/ –

答えて

49

codeprojectにAForge.netというニューラルネットワークライブラリがあります。 (コードがGoogle codeでホスト)(またAForge homepageをチェックアウト - 。ホームページによると、新バージョンでは、今だけでなく、遺伝的アルゴリズムと機械学習をサポートし、私は最後のそれと遊んだので、それは多くのことを進んだように見えます)

Iドン私がそれを使ったことがないのでWEKAのようなものだと分かっています。

+0

いいです。 Upvoted。 –

+0

少なくとも、トピックに精通していない人にとっては、それは本当に良い選択ではありません。フォームの部分クラスを使用しない(サンプルの背後にあるコードを読むのが難しくなる)、それについてはまともなドキュメントが見つからない。 – RCIX

+0

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

14

することもできますuse Weka with C#

は、(それがusageだ上でも記事があります)。最適な解決方法はIKVM, as in this tutorialですが、ブリッジソフトウェアを使用することもできます。

+1

「ブリッジソフトウェア」とは何ですか?どれ? – lmsasu

12

共通のPOCOオブジェクトで動作するように設計されたC#でML libraryを作成しました。

14

Weaneは、Shaneが述べているように、IKVMといくつかの 'glue code'を使ってC#から非常に簡単に使用できます。 WEKAの「.NETバージョン」を作成するために、weka page上のチュートリアルをFolow、あなたは以下のテストを実行しようとすることができます:あなたが分類器を構築し、それを新しい例を分類する方法、

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

また、C#コードを持つEncogというプロジェクトもあります。これは、以前買った「ニューラルネットワークの紹介」の著者Jeff Heatonによって維持されています。コードベースGitはここにある:https://github.com/encog/encog-dotnet-core