@@ -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 int
61+ >>> SVC(kernel="polynomial",degree=-1)
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 : int = 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 , int ) :
97+ raise ValueError ("degree must be 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