internal static double k_function(svm_node[] x, svm_node[] y, svm_parameter param)
{
switch (param.kernel_type)
{
case svm_parameter.LINEAR:
return dot(x, y);
case svm_parameter.POLY:
return Math.Pow(param.gamma*dot(x, y) + param.coef0, param.degree);
case svm_parameter.RBF:
{
double sum = 0;
int xlen = x.Length;
int ylen = y.Length;
int i = 0;
int j = 0;
while (i < xlen && j < ylen)
{
if (x[i].index == y[j].index)
{
double d = x[i++].value_Renamed - y[j++].value_Renamed;
sum += d*d;
}
else if (x[i].index > y[j].index)
{
sum += y[j].value_Renamed*y[j].value_Renamed;
++j;
}
else
{
sum += x[i].value_Renamed*x[i].value_Renamed;
++i;
}
}
while (i < xlen)
{
sum += x[i].value_Renamed*x[i].value_Renamed;
++i;
}
while (j < ylen)
{
sum += y[j].value_Renamed*y[j].value_Renamed;
++j;
}
return Math.Exp((- param.gamma)*sum);
}
case svm_parameter.SIGMOID:
return tanh(param.gamma*dot(x, y) + param.coef0);
default:
return 0; // java
}
}
}