在C#中的机器学习库
C#中有没有机器学习库? 我在WEKA之后 。 谢谢。
在codeproject上有一个叫做AForge.net的neural network库。 (代码托pipe在谷歌代码 )(也检出了AForge的主页 – 根据主页,新版本现在支持遗传algorithm和机器学习,看起来它进步了很多,自从我上次玩了它)
我不知道这是WEKA,因为我从来没有用过。
(还有一个关于它的用法的文章)
Weka可以很容易地从C#中使用,就像Shane所说的那样,使用IKVM和一些“胶水代码”。 在“ weka”页面上添加教程以创build“weka”的“.Net版本”,然后您可以尝试运行以下testing:
[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); }
第一个testing表明,如何构build一个分类器并用它对新的例子进行分类,第二个例子显示了如何使用文件中的持久分类器对例子进行分类。 如果你需要太支持离散属性,一些修改将是必要的。 上面的代码使用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); } }
您也可以使用Weka和C# 。 最好的解决scheme是使用IKVM ,如本教程中所述 ,尽pipe您也可以使用桥接软件。
我已经在C#中创build了一个ML库 ,用于处理常见的POCO对象。
还有一个名为Encog的项目,它具有C#代码。 它由Jeff Heaton维护,他是我刚刚购买的“neural network入门”一书的作者。 代码库Git在这里: https : //github.com/encog/encog-dotnet-core
我正在为.NET寻找机器学习库,并从Microsoft Research上find了关于nuget.org/machine-learning的Infer.NET :
- Infer.NET