2015-06-15 51 views
2

我正在嘗試使用accord.net進行文本分類。但是我找不到表示稀疏矢量和矩陣的方法。例如,我們有很多文本,並且在使用ngrams和散列進行標記之後,每個文本都用一個權重(tf)表示爲特徵索引(由featureHasher給出)。並且不可能將所有數據作爲非稀疏矩陣加載到內存中。有沒有辦法做增量處理或表示稀疏矩陣或用稀疏數據做特徵減少?如何使用Accord.Net進行文本分類?

回答

2

不幸的是,目前並不是所有的模型和方法都支持稀疏矩陣。但是,如果您嘗試進行文本分類,則可以使用具有稀疏內核的支持向量機進行分類。

可以在Accord.Statistics.Kernels.Sparse命名空間中找到稀疏內核,例如SparseLinear和SparseGaussian。這些內核希望數據以LibSVM的稀疏格式提供。這個格式的規範可以在LibSVM's FAQWhy sometimes not all attributes of a data appear in the training/model files?這個問題下找到。

基本上,在這種格式中,作爲

1 0 2 0 

被表示爲

1:1 3:2 

,或者換句話說,將被表示的特徵向量,作爲位置的列表:值雙,其中職位起始於1

下面是關於如何使用支持向量機與使用SVM的稀疏線性格式的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]); 
+0

稀疏矢量你還需要在在訓練時間在內存中的輸入和輸出,也可以培養分批? – Telavian

+0

你仍然需要它們在內存中。不幸的是,對於SVM,批量訓練非常棘手。但是,如果您使用的是64位Windows,則可以使用https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110)分配總大小大於2 GB的陣列。 aspx,並讓操作系統根據需要將其交換出來 – Cesar

+0

這取決於矩陣的大小。然而,完全可能的尺寸爲50,000x500,000的double類型的稀疏矩陣需要大約1500 GB的空間。如果交換空間不斷被使用,這也可能需要永遠培訓。 – Telavian

相關問題