| 7 | #include <thundersvm/solver/csmosolver.h> |
| 8 | |
| 9 | void OneClassSVC::train(const DataSet &dataset, SvmParam param) { |
| 10 | model_setup(dataset, param); |
| 11 | int n_instances = dataset.n_instances(); |
| 12 | SyncArray<float_type> alpha(n_instances); |
| 13 | SyncArray<float_type> f_val(n_instances); |
| 14 | |
| 15 | KernelMatrix kernelMatrix(dataset.instances(), param); |
| 16 | |
| 17 | alpha.mem_set(0); |
| 18 | float_type *alpha_data = alpha.host_data(); |
| 19 | int n = static_cast<int>(param.nu * n_instances); |
| 20 | for (int i = 0; i < n; ++i) { |
| 21 | alpha_data[i] = 1; |
| 22 | } |
| 23 | if (n < n_instances) |
| 24 | alpha_data[n] = param.nu * n_instances - n; |
| 25 | int ws_size = get_working_set_size(n_instances, kernelMatrix.n_features()); |
| 26 | |
| 27 | //TODO batch, thrust |
| 28 | f_val.mem_set(0); |
| 29 | SyncArray<int> y(n_instances); |
| 30 | int *y_data = y.host_data(); |
| 31 | for (int i = 0; i < n_instances; ++i) { |
| 32 | y_data[i] = 1; |
| 33 | } |
| 34 | CSMOSolver solver; |
| 35 | solver.solve(kernelMatrix, y, alpha, rho.host_data()[0], f_val, param.epsilon, 1, 1, ws_size, max_iter); |
| 36 | |
| 37 | //todo these codes are similar to svr, try to combine them |
| 38 | LOG(INFO) << "rho = " << rho.host_data()[0]; |
| 39 | vector<float_type> coef_vec; |
| 40 | for (int i = 0; i < n_instances; ++i) { |
| 41 | if (alpha_data[i] != 0) { |
| 42 | sv.push_back(dataset.instances()[i]); |
| 43 | sv_indices.push_back(i); |
| 44 | coef_vec.push_back(alpha_data[i]); |
| 45 | } |
| 46 | } |
| 47 | LOG(INFO) << "#sv = " << sv.size(); |
| 48 | n_sv.host_data()[0] = sv.size(); |
| 49 | n_sv.host_data()[1] = 0; |
| 50 | n_total_sv = sv.size(); |
| 51 | coef.resize(coef_vec.size()); |
| 52 | coef.copy_from(coef_vec.data(), coef_vec.size()); |
| 53 | |
| 54 | if(param.kernel_type == SvmParam::LINEAR){ |
| 55 | compute_linear_coef_single_model(dataset.n_features(), dataset.is_zero_based()); |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | vector<float_type> OneClassSVC::predict(const DataSet::node2d &instances, int batch_size) { |
| 60 | vector<float_type> dec_values = SvmModel::predict(instances, batch_size); |
nothing calls this directly
no test coverage detected