我正在尝试使用accord.net进行文本分类。但我找不到表示稀疏向量和矩阵的方法。例如,我们有很多文本,经过ngrams和散列的标记后,每个文本都表示为一个特征索引(由featureHasher给出),权重(tf)。并且不可能将所有数据作为非稀疏矩阵加载到存储器中。有没有办法进行增量处理或表示稀疏矩阵或使用稀疏数据进行特征减少?
答案 0 :(得分:3)
不幸的是,目前并非所有模型和方法都支持稀疏矩阵。但是,如果您尝试进行文本分类,则可以使用具有稀疏内核的支持向量机来执行此操作。
可以在Accord.Statistics.Kernels.Sparse命名空间中找到稀疏内核,例如SparseLinear和SparseGaussian。这些内核期望以LibSVM的稀疏格式给出数据。可以在问题LibSVM's FAQ下的Why sometimes not all attributes of a data appear in the training/model files?中找到此格式的规范。
基本上,在这种格式中,一个特征向量将表示为
1 0 2 0
表示为
1:1 3:2
或换句话说,作为 position:value 对的列表,其中位置从1开始。
以下是如何使用LibSVM的稀疏线性格式将SpM与SparseLinear内核一起使用的示例:
// Example AND problem
double[][] inputs =
{
new double[] { }, // 0 and 0: 0 (label -1)
new double[] { 2,1 }, // 0 and 1: 0 (label -1)
new double[] { 1,1 }, // 1 and 0: 0 (label -1)
new double[] { 1,1, 2,1 } // 1 and 1: 1 (label +1)
};
// Dichotomy SVM outputs should be given as [-1;+1]
int[] labels =
{
// 0, 0, 0, 1
-1, -1, -1, 1
};
// Create a Support Vector Machine for the given inputs
// (sparse machines should use 0 as the number of inputs)
var machine = new KernelSupportVectorMachine(new SparseLinear(), inputs: 0);
// Instantiate a new learning algorithm for SVMs
var smo = new SequentialMinimalOptimization(machine, inputs, labels);
// Set up the learning algorithm
smo.Complexity = 100000.0;
// Run
double error = smo.Run(); // should be zero
double[] predicted = inputs.Apply(machine.Compute).Sign();
// Outputs should be -1, -1, -1, +1
Assert.AreEqual(-1, predicted[0]);
Assert.AreEqual(-1, predicted[1]);
Assert.AreEqual(-1, predicted[2]);
Assert.AreEqual(+1, predicted[3]);