@@ -49,6 +49,19 @@ class SVC:
49
49
Traceback (most recent call last):
50
50
...
51
51
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
52
65
"""
53
66
54
67
def __init__ (
@@ -57,9 +70,13 @@ def __init__(
57
70
regularization : float = np .inf ,
58
71
kernel : str = "linear" ,
59
72
gamma : float = 0.0 ,
73
+ degree : float = 0.0 ,
74
+ coef0 : float = 0.0 ,
60
75
) -> None :
61
76
self .regularization = regularization
62
77
self .gamma = gamma
78
+ self .degree = degree
79
+ self .coef0 = coef0
63
80
if kernel == "linear" :
64
81
self .kernel = self .__linear
65
82
elif kernel == "rbf" :
@@ -73,6 +90,14 @@ def __init__(
73
90
# in the future, there could be a default value like in sklearn
74
91
# sklear: def_gamma = 1/(n_features * X.var()) (wiki)
75
92
# 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
76
101
else :
77
102
msg = f"Unknown kernel: { kernel } "
78
103
raise ValueError (msg )
@@ -98,6 +123,23 @@ def __rbf(self, vector1: ndarray, vector2: ndarray) -> float:
98
123
"""
99
124
return np .exp (- (self .gamma * norm_squared (vector1 - vector2 )))
100
125
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
+
101
143
def fit (self , observations : list [ndarray ], classes : ndarray ) -> None :
102
144
"""
103
145
Fits the SVC with a set of observations.
0 commit comments