何あなたは距離行列と呼ぶ行列が実際にカーネル行列である場合に行うことが可能であるべきである尋ねます。あなたが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 }
};
を使用することができ、異なるサイズのカーネル行列を変換するために私たちのKPCAを使用する方法についての質問に答えるために、あなたは距離行列、またはカーネル行列を渡そうとしていますか?あなたが距離行列として参照しているものが実際にカーネルのものであれば、あなたが求めることは実際に可能でなければなりません。 – Cesar
こんにちはセザール、 マトリックスは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
こんにちは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