| 7 | #include "thundersvm/model/svr.h" |
| 8 | |
| 9 | void SVR::train(const DataSet &dataset, SvmParam param) { |
| 10 | model_setup(dataset, param); |
| 11 | |
| 12 | int n_instances = dataset.n_instances(); |
| 13 | //duplicate instances |
| 14 | DataSet::node2d instances_2(dataset.instances()); |
| 15 | instances_2.insert(instances_2.end(), dataset.instances().begin(), dataset.instances().end()); |
| 16 | |
| 17 | KernelMatrix kernelMatrix(instances_2, param); |
| 18 | |
| 19 | SyncArray<float_type> f_val(n_instances * 2); |
| 20 | SyncArray<int> y(n_instances * 2); |
| 21 | |
| 22 | float_type *f_val_data = f_val.host_data(); |
| 23 | int *y_data = y.host_data(); |
| 24 | for (int i = 0; i < n_instances; ++i) { |
| 25 | f_val_data[i] = param.p - dataset.y()[i]; |
| 26 | y_data[i] = +1; |
| 27 | f_val_data[i + n_instances] = -param.p - dataset.y()[i]; |
| 28 | y_data[i + n_instances] = -1; |
| 29 | } |
| 30 | |
| 31 | SyncArray<float_type> alpha_2(n_instances * 2); |
| 32 | alpha_2.mem_set(0); |
| 33 | int ws_size = get_working_set_size(n_instances * 2, kernelMatrix.n_features()); |
| 34 | CSMOSolver solver; |
| 35 | solver.solve(kernelMatrix, y, alpha_2, rho.host_data()[0], f_val, param.epsilon, param.C, param.C, ws_size, max_iter); |
| 36 | save_svr_coef(alpha_2, dataset.instances()); |
| 37 | |
| 38 | if(param.kernel_type == SvmParam::LINEAR){ |
| 39 | compute_linear_coef_single_model(dataset.n_features(), dataset.is_zero_based()); |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | void SVR::save_svr_coef(const SyncArray<float_type> &alpha_2, const DataSet::node2d &instances) { |
| 44 | LOG(INFO) << "rho = " << rho.host_data()[0]; |
nothing calls this directly
no test coverage detected