Skip to content

Commit 0a8a6d4

Browse files
authored
Update support_vector_machines.py to add the polynomial kernel
1 parent a2fa32c commit 0a8a6d4

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

machine_learning/support_vector_machines.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ class SVC:
4949
Traceback (most recent call last):
5050
...
5151
ValueError: gamma must be > 0
52+
53+
>>> SVC(kernel="polynomial")
54+
Traceback (most recent call last):
55+
...
56+
ValueError: polynomial kernel requires degree
57+
>>> SVC(kernel="polynomial",degree=None)
58+
Traceback (most recent call last):
59+
...
60+
ValueError: degree must be float or int
61+
>>> SVC(kernel="polynomial",degree=-1.0)
62+
Traceback (most recent call last):
63+
...
64+
ValueError: degree must be > 0
5265
"""
5366

5467
def __init__(
@@ -57,9 +70,13 @@ def __init__(
5770
regularization: float = np.inf,
5871
kernel: str = "linear",
5972
gamma: float = 0.0,
73+
degree: float=0.0,
74+
coef0: float = 0.0,
6075
) -> None:
6176
self.regularization = regularization
6277
self.gamma = gamma
78+
self.degree = degree
79+
self.coef0 = coef0
6380
if kernel == "linear":
6481
self.kernel = self.__linear
6582
elif kernel == "rbf":
@@ -73,6 +90,14 @@ def __init__(
7390
# in the future, there could be a default value like in sklearn
7491
# sklear: def_gamma = 1/(n_features * X.var()) (wiki)
7592
# previously it was 1/(n_features)
93+
elif kernel == "polynomial":
94+
if self.degree == 0:
95+
raise ValueError("polynomial kernel requires degree")
96+
if not isinstance(self.degree, (float, int)) :
97+
raise ValueError("degree must be float or int")
98+
if not self.degree > 0:
99+
raise ValueError("degree must be > 0")
100+
self.kernel = self.__polynomial
76101
else:
77102
msg = f"Unknown kernel: {kernel}"
78103
raise ValueError(msg)
@@ -98,6 +123,23 @@ def __rbf(self, vector1: ndarray, vector2: ndarray) -> float:
98123
"""
99124
return np.exp(-(self.gamma * norm_squared(vector1 - vector2)))
100125

126+
127+
def __polynomial(self, vector1: ndarray, vector2: ndarray) -> float:
128+
"""
129+
Polynomial kernel: (x . y + coef0)^degree
130+
131+
Note: for more information see:
132+
https://en.wikipedia.org/wiki/Polynomial_kernel
133+
134+
Args:
135+
vector1 (ndarray): first vector
136+
vector2 (ndarray): second vector
137+
138+
Returns:
139+
float: (vector1 . vector2 + coef0)^degree
140+
"""
141+
return (np.dot(vector1, vector2) + self.coef0) ** self.degree
142+
101143
def fit(self, observations: list[ndarray], classes: ndarray) -> None:
102144
"""
103145
Fits the SVC with a set of observations.

0 commit comments

Comments
 (0)