Algorithm-LibLinear
view release on metacpan or search on metacpan
src/liblinear/linear.cpp view on Meta::CPAN
}
return 1;
}
// elements before the returned index are < pivot, while those after are >= pivot
static int partition(feature_node *nodes, int low, int high)
{
int i;
int index;
swap(nodes[low + rand()%(high-low+1)], nodes[high]); // select and move pivot to the end
index = low;
for(i = low; i < high; i++)
if (compare_feature_node(&nodes[i], &nodes[high]) == -1)
{
swap(nodes[index], nodes[i]);
index++;
}
swap(nodes[high], nodes[index]);
return index;
}
// rearrange nodes so that nodes[:k] contains nodes with the k smallest values.
static void quick_select_min_k(feature_node *nodes, int low, int high, int k)
{
int pivot;
if(low == high)
return;
pivot = partition(nodes, low, high);
if(pivot == k)
return;
else if(k-1 < pivot)
return quick_select_min_k(nodes, low, pivot-1, k);
else
return quick_select_min_k(nodes, pivot+1, high, k);
}
// A two-level coordinate descent algorithm for
// a scaled one-class SVM dual problem
//
// min_\alpha 0.5(\alpha^T Q \alpha),
// s.t. 0 <= \alpha_i <= 1 and
// e^T \alpha = \nu l
//
// where Qij = xi^T xj
src/liblinear/linear.cpp view on Meta::CPAN
}
if (alpha[i] > 0)
{
min_negG_of_Ilow[len_Ilow] = node;
len_Ilow++;
}
}
max_inner_iter = min(max_inner_iter, min(len_Iup, len_Ilow));
quick_select_min_k(max_negG_of_Iup, 0, len_Iup-1, len_Iup-max_inner_iter);
qsort(&(max_negG_of_Iup[len_Iup-max_inner_iter]), max_inner_iter, sizeof(struct feature_node), compare_feature_node);
quick_select_min_k(min_negG_of_Ilow, 0, len_Ilow-1, max_inner_iter);
qsort(min_negG_of_Ilow, max_inner_iter, sizeof(struct feature_node), compare_feature_node);
for (s=0; s<max_inner_iter; s++)
{
i = max_negG_of_Iup[len_Iup-s-1].index;
j = min_negG_of_Ilow[s].index;
if ((alpha[i] == 0 && alpha[j] == 0) ||
(alpha[i] == 1 && alpha[j] == 1))
continue;
src/liblinear/linear.cpp view on Meta::CPAN
break;
}
default:
fprintf(stderr, "ERROR: unknown solver_type\n");
break;
}
delete[] C;
}
// Calculate the initial C for parameter selection
static double calc_start_C(const problem *prob, const parameter *param)
{
int i;
double xTx, max_xTx;
max_xTx = 0;
for(i=0; i<prob->l; i++)
{
xTx = 0;
feature_node *xi=prob->x[i];
while(xi->index != -1)
( run in 0.340 second using v1.01-cache-2.11-cpan-94b05bcf43c )