2017-06-23 13 views
1

私はPrincipalComponentAnalysisを行うためにAccordのdotnetフレームワークを使用しています。AccordフレームワークPrincipalComponentAnalysis on large data

私はその後、私はそれにKPCAを適用し、計算された距離行列を持つ:

Dim pca = new KernelPrincipalComponentAnalysis() 
pca.Learn(distances) 
pca.NumberOfOutputs = 2 
Dim actual()() As double = pca.Transform(distances) 

これがうまく機能しています。しかしながら、マトリックスがかなり大きい場合(例えば2000x2000)、pca.learnは数分かかる。 大きな行列を変換するためにサンプリング行列(500x500など)で学習する方法はありますか? 私が試してみました:

pca.Learn(sampling) 
pca.Transform(distances) 

しかし行列は右のサイズを持っていないので、私はエラーを取得します。

よろしく ジャン・ミッシェル・

+0

を使用することができ、異なるサイズのカーネル行列を変換するために私たちのKPCAを使用する方法についての質問に答えるために、あなたは距離行列、またはカーネル行列を渡そうとしていますか?あなたが距離行列として参照しているものが実際にカーネルのものであれば、あなたが求めることは実際に可能でなければなりません。 – Cesar

+0

こんにちはセザール、 マトリックスは5つのドキュメントに対して、例えば文書間の計算された距離を含んでいる: 薄暗いdistances1 = { 新しいダブル(){0、0.0、0.0、1.0、1.0}、 新しいダブル(){0.0、 0、0.0、1.0、1.0}、 新しいDouble(){0.0、0.0、0、1.0、1.0} 新しいDouble(){1.0,1.0,1.0,0,0}、 新しいDouble(){1.0 、1.0、1.0、0.0、0} } 値が0の場合は、ドキュメントが同一であることを意味します。 ジャンミッシェル – jmr

+0

こんにちはCesar、 マトリックスには計算された文書間の距離が含まれています。 5つのドキュメントの 例えば: 薄暗いdistances1 = { 新しいダブル(){0、0.0、0.0、1.0、1.0}、 新しいダブル(){0.0、0、0.0、1.0、1.0}、 新しいダブル( ){0.0、0.0、0、1.0、1.0}、 新しいDouble(){1.0,1.0,1.0,0,0。0}、 新しいDouble(){1.0、1.0、1.0、0.0、0} } 値が0の場合、ドキュメントは同一です。 よろしくお願いいたします。 Jean-Michel – jmr

答えて

0

何あなたは距離行列と呼ぶ行列が実際にカーネル行列である場合に行うことが可能であるべきである尋ねます。あなたがKPCAを使用しているので、私はこれが当てはまると仮定していますので、KPCAが異なるサイズのカーネル行列を使ってメソッドを学習して変換する方法を以下に示します。

// Let's say those were our original data points 
double[][] data = 
{ 
    new double[] { 2.5, 2.4 }, 
    new double[] { 0.5, 0.7 }, 
    new double[] { 2.2, 2.9 }, 
    new double[] { 1.9, 2.2 }, 
    new double[] { 3.1, 3.0 }, 
    new double[] { 2.3, 2.7 }, 
    new double[] { 2.0, 1.6 }, 
    new double[] { 1.0, 1.1 }, 
    new double[] { 1.5, 1.6 }, 
    new double[] { 1.1, 0.9 } 
}; 

ここで、すでにカーネル行列Kが利用可能であるとしましょう。注意:Kを計算する方法は今、Kはすでに利用可能であると仮定すると、我々は

var pca = new KernelPrincipalComponentAnalysis(kernel, PrincipalComponentMethod.KernelMatrix); 

としてKPCAを作成し、

を使用して、それを学ぶことができ

double[] mean = data.Mean(dimension: 0); 
double[][] x = data.Subtract(mean, dimension: 0);  
Linear kernel = new Linear(); 
double[][] K = kernel.ToJagged(x); 

のようなものだっただろう

pca.Learn(K); // note: we pass the kernel matrix instead of the data points 

上記の例では、我々は

// Those are the expected eigenvalues, in descending order: 
double[] eigenvalues = pca.Eigenvalues.Divide(data.Length - 1); // { 1.28, 0.049 }; 

// And this will be their proportion: 
double[] proportions = pca.ComponentProportions; // { 0.96, 0.03 }; 

// We can transform the inputs using 
double[][] actual = pca.Transform(K); 

// The output should be similar to 
double[,] expected = new double[,] 
{ 
    { 0.827970186, -0.175115307 }, 
    { -1.77758033, 0.142857227 }, 
    { 0.992197494, 0.384374989 }, 
    { 0.274210416, 0.130417207 }, 
    { 1.67580142, -0.209498461 }, 
    { 0.912949103, 0.175282444 }, 
    { -0.099109437, -0.349824698 }, 
    { -1.14457216, 0.046417258 }, 
    { -0.438046137, 0.017764629 }, 
    { -1.22382056, -0.162675287 }, 
}.Multiply(-1); 
を持っているでしょう

さて、最後に、我々は

double[][] newData = // this is a smaller matrix than the original 
{ 
    new double[] { 2.2, 2.7 }, 
    new double[] { 1.2, 4.9 }, 
    new double[] { 1.8, 0.2 }, 
}; 

// Subtract the mean before computing a kernel matrix 
double[][] y = newData.Subtract(mean, dimension: 0); 

// Create the kernel matrix for new data 
double[][] newK = kernel.ToJagged2(y, x); 

// Transform using the new kernel matrix 
double[][] output = pca.Transform(newK); 

// Output will be similar to 
double[][] expected = 
{ 
    new double[] { -0.845161763306007, -0.24880030917481 }, 
    new double[] { -1.78468140697569, -2.47530044148084 }, 
    new double[] { 1.26393423496622, 1.15181172492746 } 
};