Я пытаюсь использовать accord.net для текста classifaction. Но я не могу найти способ представления разреженных векторов и матриц. Например, у нас есть много текстов и после токенизации с помощью ngrams и хэширования, каждый текст представлен как индекс функции (заданный функциейHasher) с весом (tf). И невозможно загрузить все данные в виде не разреженной матрицы в память. Есть ли способ сделать инкрементную обработку или представлять разреженную матрицу или уменьшить функцию с разреженными данными?Как сделать классификацию текста с помощью Accord.Net?
ответ
К сожалению, не все модели и методы поддерживают разреженные матрицы в это время. Однако, если вы пытаетесь выполнить категоризацию текста, вы можете сделать это, используя машину поддержки Vector с ядром Sparse.
Редкие ядра можно найти в пространстве имен 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
или, другими словами, в виде списка позиции: значение пар , где позиция начинается с 1.
Вот пример того, как использовать SVMs с SparseLinear ядром, используя редкий линейный формат 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]);
с редкими векторами вы все еще необходимы на входах и выходах в памяти во время обучения или вы можете тренировать в партиях? – Telavian
Вы все еще нуждаетесь в них в памяти. К сожалению, с помощью SVM очень сложно тренироваться партиями. Однако, если вы используете 64-битную Windows, вы можете выделить массивы размером более 2 ГБ, используя https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110). aspx, и пусть ОС позаботится об их замене и при необходимости – Cesar
Это работает в зависимости от размера матрицы. Однако разреженная матрица типа double с размерами 50 000 x 500 000, что вполне возможно, потребует около 1500 ГБ пространства. Это также, вероятно, потребует бесконечного обучения, если пространство подкачки будет постоянно использоваться. – Telavian