C# 中是否有任何机器学习库?我追求类似WEKA的东西。谢谢你。
6 回答
在 GitHub 上查看这个很棒的列表。在列出的框架中,Accord.NET 是开源的,并且最受欢迎,拥有超过 2,000 颗星。
另外,请查看 Microsoft 提供的 .NET 官方机器学习库:https ://github.com/dotnet/machinelearning
老的
codeproject 上有一个名为AForge.net的神经网络库。(代码托管在Google 代码上)(也可以查看 AForge 主页- 根据主页,新版本现在还支持遗传算法和机器学习。自从我上次玩它以来,它看起来进步了很多)
我不知道它是不是像 WEKA 一样,因为我从未使用过它。
(还有一篇关于它的用法的文章)
您还可以将 Weka 与 C# 一起使用。最好的解决方案是使用IKVM,如本教程中所示,尽管您也可以使用桥接软件。
正如 Shane 所说,Weka 可以很容易地从 C# 中使用,使用 IKVM 和一些“胶水代码”。按照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# 中创建了一个ML 库,旨在处理常见的 POCO 对象。
还有一个名为 Encog 的项目包含 C# 代码。它由 Jeff Heaton 维护,他是我不久前买的一本“神经网络简介”一书的作者。代码库 Git 在这里:https ://github.com/encog/encog-dotnet-core