Парное ядерное преобразование расширяет простое ядерное преобразование добавляя произведения пар входных значений. Т.е. добавлены квадраты входных значений, а также различные попарные комбинации их произведений.
Код парного ядерного преобразования на Java:
package libvmr;
/**
* Парное ядерное преобразование
* @author Yury V. Reshetov
* @version 1.0
*/
public class PairKernelTrick implements KernelTrick {
private String[] variables = null;
/**
* Возвращает идентификаторы используемых переменных
*
* @return идентификаторы переменных
*/
public String[] getVariables() {
return this.variables;
}
/**
* Преобразовать двумерный массив данных
*
* @return преобразованный массив
*/
public double[][] getTransformData(double[][] samples, double[] results) {
String[] tempvariables = new String[samples[0].length + 1];
tempvariables[0] = "";
for (int i = 0; i < samples[0].length; i++) {
tempvariables[i + 1] = " * x" + i;
}
double tempresult[][] = new double[samples.length][samples[0].length + 1];
for (int i = 0; i < samples.length; i++) {
tempresult[i][0] = 1d;
for (int j = 0; j < samples[0].length; j++) {
tempresult[i][j + 1] = samples[i][j];
}
}
this.variables = new String[(samples[0].length + 1) * (samples[0].length + 2) / 2];
int n = 0;
for (int i = 0; i < (samples[0].length + 1); i++) {
for (int j = 0; j < (samples[0].length + 1); j++) {
if (j >= i) {
this.variables[n] = tempvariables[i] + tempvariables[j];
n++;
}
}
}
double result[][] = new double[samples.length][this.variables.length];
for (int k = 0; k < samples.length; k++) {
n = 0;
for (int i = 0; i < (samples[0].length + 1); i++) {
for (int j = 0; j < (samples[0].length + 1); j++) {
// Проверка наличия дубликатов
if (j >= i) {
result[k][n] = tempresult[k][i] * tempresult[k][j];
n++;
}
}
}
}
return result;
}
/**
* Преобразовать одномерный массив
*
* @return одномерный массив
*/
public double[] getTransformData(double[] sample) {
double tempresult[] = new double[sample.length + 1];
for (int i = 0; i < sample.length; i++) {
tempresult[0] = 1d;
for (int j = 0; j < sample.length; j++) {
tempresult[j + 1] = sample[j];
}
}
double result[] = new double[(sample.length + 1) * (sample.length + 2) / 2];
int n = 0;
for (int i = 0; i < (sample.length + 1); i++) {
for (int j = 0; j < (sample.length + 1); j++) {
// Проверка наличия дубликатов
if (j >= i) {
result[n] = tempresult[i] * tempresult[j];
n++;
}
}
}
return result;
}
}