| 5 | #include <thundersvm/solver/nusmosolver.h> |
| 6 | |
| 7 | void NuSVC::train_binary(const DataSet &dataset, int i, int j, SyncArray<float_type> &alpha, float_type &rho) { |
| 8 | DataSet::node2d ins = dataset.instances(i, j);//get instances of class i and j |
| 9 | int n_pos = dataset.count()[i]; |
| 10 | int n_neg = dataset.count()[j]; |
| 11 | SyncArray<int> y(ins.size()); |
| 12 | alpha.resize(ins.size()); |
| 13 | SyncArray<float_type> f_val(ins.size()); |
| 14 | alpha.mem_set(0); |
| 15 | f_val.mem_set(0); |
| 16 | float_type sum_pos = param.nu * ins.size() / 2; |
| 17 | float_type sum_neg = sum_pos; |
| 18 | int *y_data = y.host_data(); |
| 19 | float_type *alpha_data = alpha.host_data(); |
| 20 | for (int l = 0; l < n_pos; ++l) { |
| 21 | y_data[l] = +1; |
| 22 | alpha_data[l] = min(1., sum_pos); |
| 23 | sum_pos -= alpha_data[l]; |
| 24 | } |
| 25 | for (int l = 0; l < n_neg; ++l) { |
| 26 | y_data[n_pos + l] = -1; |
| 27 | alpha_data[n_pos + l] = min(1., sum_neg); |
| 28 | sum_neg -= alpha_data[n_pos + l]; |
| 29 | } |
| 30 | vector<int> ori = dataset.original_index(i, j); |
| 31 | |
| 32 | KernelMatrix k_mat(ins, param); |
| 33 | int ws_size = get_working_set_size(ins.size(), k_mat.n_features()); |
| 34 | NuSMOSolver solver(false); |
| 35 | solver.solve(k_mat, y, alpha, rho, f_val, param.epsilon, 1, 1, ws_size, max_iter); |
| 36 | |
| 37 | LOG(INFO)<<"rho = "<<rho; |
| 38 | int n_sv = 0; |
| 39 | alpha_data = alpha.host_data(); |
| 40 | for (int l = 0; l < alpha.size(); ++l) { |
| 41 | alpha_data[l] *= y_data[l]; |
| 42 | if (alpha_data[l] != 0) n_sv++; |
| 43 | } |
| 44 | LOG(INFO)<<"#sv = "<<n_sv; |
| 45 | } |
| 46 | |
| 47 | void NuSVC::model_setup(const DataSet &dataset, SvmParam ¶m) { |
| 48 | SVC::model_setup(dataset, param); |
nothing calls this directly
no test coverage detected