【发布时间】:2023-03-29 12:10:01
【问题描述】:
我正在尝试使用accord.net 进行文本分类。但我找不到表示稀疏向量和矩阵的方法。例如,我们有很多文本,在使用 ngram 和散列进行标记化之后,每个文本都表示为具有权重 (tf) 的特征索引(由 featureHasher 给出)。并且不可能将所有数据作为非稀疏矩阵加载到内存中。有没有办法进行增量处理或表示稀疏矩阵或使用稀疏数据进行特征缩减?
【问题讨论】:
标签: accord.net
我正在尝试使用accord.net 进行文本分类。但我找不到表示稀疏向量和矩阵的方法。例如,我们有很多文本,在使用 ngram 和散列进行标记化之后,每个文本都表示为具有权重 (tf) 的特征索引(由 featureHasher 给出)。并且不可能将所有数据作为非稀疏矩阵加载到内存中。有没有办法进行增量处理或表示稀疏矩阵或使用稀疏数据进行特征缩减?
【问题讨论】:
标签: accord.net
不幸的是,目前并非所有模型和方法都支持稀疏矩阵。但是,如果您尝试进行文本分类,则可以使用带有稀疏内核的支持向量机来进行。
可以在 Accord.Statistics.Kernels.Sparse 命名空间中找到稀疏内核,例如 SparseLinear 和 SparseGaussian。这些内核期望数据以 LibSVM 的稀疏格式给出。此格式的规范可以在问题Why sometimes not all attributes of a data appear in the training/model files? 下的LibSVM's FAQ 中找到。
基本上,在这种格式中,一个特征向量可以表示为
1 0 2 0
表示为
1:1 3:2
或者换句话说,作为 position:value 对的列表,其中 position 从 1 开始。
这是一个示例,说明如何使用带有 SparseLinear 内核的 SVM,使用 LibSVM 的稀疏线性格式:
// 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]);
【讨论】: