답변:
GitHub 에서이 멋진 목록 을 확인하세요 . 나열된 프레임 워크 중 Accord.NET은 오픈 소스이며 2,000 개가 넘는 별에서 가장 인기가 있습니다.
또한 Microsoft에서 제공하는 .NET 용 공식 기계 학습 라이브러리를 확인하십시오. https://github.com/dotnet/machinelearning
낡은
코드 프로젝트 에는 AForge.net 이라는 신경망 라이브러리가 있습니다 . ( Google 코드 에서 호스팅되는 코드 ) (또한 AForge 홈페이지를 확인하세요 .-홈페이지 에 따르면 새 버전은 이제 유전 알고리즘과 기계 학습도 지원합니다. 마지막으로 플레이 한 이후로 많이 진행된 것 같습니다.)
나는 그것을 사용한 적이 없기 때문에 그것이 WEKA와 같은 것인지 모른다.
Weka를 C #과 함께 사용할 수도 있습니다 . 가장 좋은 해결책은 이 튜토리얼에서와 같이 IKVM 을 사용 하는 것입니다. 브리징 소프트웨어도 사용할 수 있습니다.
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);
}
}
C # 코드가있는 Encog라는 프로젝트도 있습니다. 이것은 내가 얼마 전에 구입 한 "Introduction to Neural Network"책의 저자 인 Jeff Heaton이 관리하고 있습니다. 코드베이스 Git은 여기에 있습니다 : https://github.com/encog/encog-dotnet-core