V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
billgreen1
V2EX  ›  Python

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

  •  
  •   billgreen1 · 2015-05-12 21:11:18 +08:00 · 2372 次点击
    这是一个创建于 3272 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    4 条回复    2015-05-13 10:42:26 +08:00
    lcqtdwj
        1
    lcqtdwj  
       2015-05-12 22:09:02 +08:00
    from functools import partial
    model = SVM(kernel=partial(gaussian_kernel,sigma=XXX))
    XXX是你想要的sigma值
    kaneg
        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)
    starsoi
        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)
    ryanking8215
        4
    ryanking8215  
       2015-05-13 10:42:26 +08:00
    @lcqtdwj +1 偏函数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2698 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:02 · PVG 19:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.