| 402 | |
| 403 | |
| 404 | class Kernel: |
| 405 | def __init__(self, kernel, degree=1.0, coef0=0.0, gamma=1.0): |
| 406 | self.degree = np.float64(degree) |
| 407 | self.coef0 = np.float64(coef0) |
| 408 | self.gamma = np.float64(gamma) |
| 409 | self._kernel_name = kernel |
| 410 | self._kernel = self._get_kernel(kernel_name=kernel) |
| 411 | self._check() |
| 412 | |
| 413 | def _polynomial(self, v1, v2): |
| 414 | return (self.gamma * np.inner(v1, v2) + self.coef0) ** self.degree |
| 415 | |
| 416 | def _linear(self, v1, v2): |
| 417 | return np.inner(v1, v2) + self.coef0 |
| 418 | |
| 419 | def _rbf(self, v1, v2): |
| 420 | return np.exp(-1 * (self.gamma * np.linalg.norm(v1 - v2) ** 2)) |
| 421 | |
| 422 | def _check(self): |
| 423 | if self._kernel == self._rbf and self.gamma < 0: |
| 424 | raise ValueError("gamma value must be non-negative") |
| 425 | |
| 426 | def _get_kernel(self, kernel_name): |
| 427 | maps = {"linear": self._linear, "poly": self._polynomial, "rbf": self._rbf} |
| 428 | return maps[kernel_name] |
| 429 | |
| 430 | def __call__(self, v1, v2): |
| 431 | return self._kernel(v1, v2) |
| 432 | |
| 433 | def __repr__(self): |
| 434 | return self._kernel_name |
| 435 | |
| 436 | |
| 437 | def count_time(func): |
no outgoing calls