| 1908 | }; |
| 1909 | |
| 1910 | static decision_function |
| 1911 | svm_train_one(const svm_problem* prob, const svm_parameter* param, double Cp, double Cn) |
| 1912 | { |
| 1913 | double* alpha = Malloc(double, prob->l); |
| 1914 | Solver::SolutionInfo si; |
| 1915 | |
| 1916 | switch (param->svm_type) { |
| 1917 | |
| 1918 | case C_SVC: |
| 1919 | solve_c_svc(prob, param, alpha, &si, Cp, Cn); |
| 1920 | break; |
| 1921 | |
| 1922 | case NU_SVC: |
| 1923 | solve_nu_svc(prob, param, alpha, &si); |
| 1924 | break; |
| 1925 | |
| 1926 | case ONE_CLASS: |
| 1927 | solve_one_class(prob, param, alpha, &si); |
| 1928 | break; |
| 1929 | |
| 1930 | case EPSILON_SVR: |
| 1931 | solve_epsilon_svr(prob, param, alpha, &si); |
| 1932 | break; |
| 1933 | |
| 1934 | case NU_SVR: |
| 1935 | solve_nu_svr(prob, param, alpha, &si); |
| 1936 | break; |
| 1937 | } |
| 1938 | |
| 1939 | info("obj = %f, rho = %f\n", si.obj, si.rho); |
| 1940 | |
| 1941 | // output SVs |
| 1942 | |
| 1943 | int nSV = 0; |
| 1944 | int nBSV = 0; |
| 1945 | |
| 1946 | for (int i = 0; i < prob->l; i++) { |
| 1947 | if (std::abs(alpha[i]) > 0) { |
| 1948 | ++nSV; |
| 1949 | |
| 1950 | if (prob->y[i] > 0) { |
| 1951 | if (std::abs(alpha[i]) >= si.upper_bound_p) |
| 1952 | ++nBSV; |
| 1953 | } |
| 1954 | else { |
| 1955 | if (std::abs(alpha[i]) >= si.upper_bound_n) |
| 1956 | ++nBSV; |
| 1957 | } |
| 1958 | } |
| 1959 | } |
| 1960 | |
| 1961 | info("nSV = %d, nBSV = %d\n", nSV, nBSV); |
| 1962 | |
| 1963 | decision_function f; |
| 1964 | f.alpha = alpha; |
| 1965 | f.rho = si.rho; |
| 1966 | return f; |
| 1967 | } |
no test coverage detected