(x, y []SVM_Node, param *SVM_Parameter)
| 228 | } |
| 229 | |
| 230 | func k_function(x, y []SVM_Node, param *SVM_Parameter) float64 { |
| 231 | switch param.kernel_type { |
| 232 | case LINEAR: |
| 233 | return dot(x, y) |
| 234 | case POLY: |
| 235 | return powi(param.gamma*dot(x, y)+param.coef0, param.degree) |
| 236 | case RBF: |
| 237 | { |
| 238 | var sum float64 |
| 239 | sum = 0 |
| 240 | xlen := len(x) |
| 241 | ylen := len(y) |
| 242 | i := 0 |
| 243 | j := 0 |
| 244 | for i < xlen && j < ylen { |
| 245 | if x[i].index == y[j].index { |
| 246 | d := x[i].value - y[j].value |
| 247 | i++ |
| 248 | j++ |
| 249 | sum += d * d |
| 250 | } else if x[i].index > y[j].index { |
| 251 | sum += y[j].value * y[j].value |
| 252 | j++ |
| 253 | } else { |
| 254 | sum += x[i].value * x[i].value |
| 255 | i++ |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | for i < xlen { |
| 260 | sum += x[i].value * x[i].value |
| 261 | i++ |
| 262 | } |
| 263 | |
| 264 | for j < ylen { |
| 265 | sum += y[j].value * y[j].value |
| 266 | j++ |
| 267 | } |
| 268 | return math.Exp(-param.gamma * sum) |
| 269 | } |
| 270 | case SIGMOID: |
| 271 | return math.Tanh(param.gamma*dot(x, y) + param.coef0) |
| 272 | case PRECOMPUTED: |
| 273 | return x[int(y[0].value)].value |
| 274 | } |
| 275 | return 0 |
| 276 | } |
| 277 | |
| 278 | // An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889--1918 |
| 279 | // Solves: |
no test coverage detected