请教当函数的参数有自己的参数时,该怎么定义和使用?

2015-05-12 21:11:18 +08:00
 billgreen1

最近在学习支持向量机,打算自己写个 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,但是它出现了。我觉得这样很不好。所以在这里请教如何实现比较好。

2408 次点击
所在节点    Python
4 条回复
lcqtdwj
2015-05-12 22:09:02 +08:00
from functools import partial
model = SVM(kernel=partial(gaussian_kernel,sigma=XXX))
XXX是你想要的sigma值
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)
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)
ryanking8215
2015-05-13 10:42:26 +08:00
@lcqtdwj +1 偏函数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/190566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX