2009-10-26 2 views
97

Есть ли какие-либо компьютерные библиотеки для изучения в C#? Я за чем-то вроде WEKA. Спасибо.машины, изучающие библиотеки в C#

+71

Я не согласен, что это не конструктивный вопрос. Я думаю, что очень полезно иметь набор пользовательских советов по библиотеке по автоматическим результатам, поиск Google появляется. Я не понимаю, почему предложения библиотеки не могут сопровождаться «фактами, ссылками и конкретным опытом», как описано в примечаниях к закрытию. –

+0

@IsmailDegani Можете ли вы проголосовать за повторное открытие? –

+0

ЛЮБОЙ СМОТРЕТЬ ДЛЯ РАМКИ: приведенные ниже ответы датируются, потому что вопрос заблокирован. Существует популярная платформа C# для обучения с открытым исходным кодом под названием Accord.NET, и вот ее веб-страница: http://accord-framework.net/ –

ответ

49

В кодебере есть библиотека нейронной сети под названием AForge.net. (Код размещен на Google code) (Также проверку на AForge homepage - Согласно странице, новая версия теперь поддерживает генетические алгоритмы и машинное обучение, а также Похоже, что прогрессировал очень много, так как я в последний раз играл с ним.)

Я надеваю Я не знаю, что это что-то вроде WEKA, поскольку я никогда не использовал это.

(есть также статья о его usage)

+0

Хорошая. Upvoted. –

+0

Неплохо, хотя хотя бы для кого-то, не очень знакомого с темой, это действительно не тот хороший выбор. Они не используют частичные классы для своих форм (затрудняет чтение кода за их образцами), и я не могу найти для него приличную документацию. – RCIX

+0

@RCIX: Я согласен, что это не совсем просто, вам действительно нужно понять нейронные сети и математику позади них. Это, конечно, не предназначено для обучения NN, а скорее для их реализации, когда вы знаете, что делаете. Документы находятся здесь: http://www.aforgenet.com/framework/docs/, но да, они выглядят немного редкими. Лично я не использовал его в течение нескольких лет, и похоже, что с тех пор он много добавлен, поэтому он, вероятно, вырос сложнее. –

14

Вы также можете use Weka with C#. Лучшим решением является использование IKVM, as in this tutorial, хотя вы также можете использовать мостовое программное обеспечение.

+1

В чем «разводящее программное обеспечение» вы говорите? который? – lmsasu

12

Я создал в C# ML library, который предназначен для работы с общими объектами POCO.

14

Weka можно использовать с C# очень легко, как сказал Шейн, используя IKVM и некоторый «код клея». Folow учебник по weka page, чтобы создать «версию .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 вспомогательных класса:

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

Существует также проект под названием Encog с кодом C#. Его поддерживает Джефф Хитон, автор книги «Введение в нейронную сеть», которую я купил некоторое время назад. Кодовая Git здесь: https://github.com/encog/encog-dotnet-core

Смежные вопросы