最近在学习支持向量机,打算自己写个 toy code 玩玩,来加深理解。具体实现时有个小问题。
比如我定义:
class SVM:
def __init__(self,kernel=linear_kernel):
....
其中,linear_kernel 是个函数
def linear_kernel(x,y):
return np.dot(x,y)
我希望在初始化时,可以使用其他的函数,比如:
def gaussian_kernel(x,y,sigma = 5):
return 1.0/(np.sqrt(2*np.pi)* sigma) * np.exp( (x-y)**2 / (2 * sigma ** 2))
这里,sigma 是在 gaussian_kernel 指定的. 我希望能够在实例化 SVM 类时,如果用的是 guassian_kernel,在实例化过程中就把 sigma 的参数给指定了。
model = SVM(kernel=gaussian_kernel) ##在这里如何设定 sigma,好让 sigma 能传入 gaussian_kernel?
我希望类的初始化的参数越少越好,比如,sigma 是属于 gaussian_kernel 的,不是 类 SVM 自己的,所以我不想把 simga 作为 SVM 的一部分。
如果把 sigma 作为 SVM 的一部分,就会出现当我用 linear_kernel 初始化的时候,SVM 不应该有 sigma,但是它出现了。我觉得这样很不好。所以在这里请教如何实现比较好。
1
lcqtdwj 2015-05-12 22:09:02 +08:00
from functools import partial
model = SVM(kernel=partial(gaussian_kernel,sigma=XXX)) XXX是你想要的sigma值 |
2
kaneg 2015-05-12 22:27:38 +08:00
@lcqtdwj 这种写法很简洁,这里提供另一种写法供参考:
class SVM: def __init__(self, kernel=linear_kernel, **kwargs): pass SVM(kernel=gaussian_kernel, sigma=10) |
3
starsoi 2015-05-13 04:20:35 +08:00
class SVM:
def __init__(self,kernel=linear_kernel): self._kernel = kernel def exec_kernel(x, y, **kwargs): self._kernel(x, y, **kwargs) svm = SVM(kernel=gaussian_kernel) svm.exec_kernel(x, y, sigma=5) |
4
ryanking8215 2015-05-13 10:42:26 +08:00
@lcqtdwj +1 偏函数
|