Парное ядерное преобразование расширяет простое ядерное преобразование добавляя произведения пар входных значений. Т.е. добавлены квадраты входных значений, а также различные попарные комбинации их произведений.
Код парного ядерного преобразования на 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; } }