Ejemplo n.º 1
0
/**
 * Unpacks the gain matrix for a specific time t.
 *
 * This could be pre-computed if it becomes a performance bottleneck.
 *
 * @param t time along the trajectory
 *
 * @retval gain matrix at that time with dimension: state_dimension x u_dimension
 */
Eigen::MatrixXd Trajectory::GetGainMatrix(double t) {
    int index = GetIndexFromTime(t);

    Eigen::VectorXd k_row = kpoints_.row(index);


    Eigen::MatrixXd k_mat(udimension_, dimension_);

    for (int i = 0; i < udimension_; i++) {

        // +1 because the column index is time
        int start_pos = i * dimension_ + 1;

        k_mat.row(i) = k_row.segment(start_pos, dimension_);
    }

    return k_mat;


}
Ejemplo n.º 2
0
void NuSVC::train_binary(const DataSet &dataset, int i, int j, SyncArray<float_type> &alpha, float_type &rho) {
    DataSet::node2d ins = dataset.instances(i, j);//get instances of class i and j
    int n_pos = dataset.count()[i];
    int n_neg = dataset.count()[j];
    SyncArray<int> y(ins.size());
    alpha.resize(ins.size());
    SyncArray<float_type> f_val(ins.size());
    alpha.mem_set(0);
    f_val.mem_set(0);
    float_type sum_pos = param.nu * ins.size() / 2;
    float_type sum_neg = sum_pos;
    int *y_data = y.host_data();
    float_type *alpha_data = alpha.host_data();
    for (int l = 0; l < n_pos; ++l) {
        y_data[l] = +1;
        alpha_data[l] = min(1., sum_pos);
        sum_pos -= alpha_data[l];
    }
    for (int l = 0; l < n_neg; ++l) {
        y_data[n_pos + l] = -1;
        alpha_data[n_pos + l] = min(1., sum_neg);
        sum_neg -= alpha_data[n_pos + l];
    }
    vector<int> ori = dataset.original_index(i, j);

    KernelMatrix k_mat(ins, param);
    int ws_size = get_working_set_size(ins.size(), k_mat.n_features());
    NuSMOSolver solver(false);
    solver.solve(k_mat, y, alpha, rho, f_val, param.epsilon, 1, 1, ws_size, max_iter);

    LOG(INFO)<<"rho = "<<rho;
    int n_sv = 0;
    alpha_data = alpha.host_data();
    for (int l = 0; l < alpha.size(); ++l) {
        alpha_data[l] *= y_data[l];
        if (alpha_data[l] != 0) n_sv++;
    }
    LOG(INFO)<<"#sv = "<<n_sv;
}