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