【问题标题】:Python : sklearn svm, providing a custom loss functionPython:sklearn svm,提供自定义损失函数
【发布时间】:2016-01-24 07:37:21
【问题描述】:

我现在使用 sklearn 的 svm 模块的方式是使用它的默认值。但是,它对我的​​数据集并不是特别好。是否可以提供自定义损失函数或自定义内核?如果是这样,编写这样一个函数的方法是什么,以便它与 sklearn 的 svm 所期望的相匹配,以及如何将这样的函数传递给训练器?

有这个例子说明如何操作:
SVM custom kernel

此处引用的代码:

def my_kernel(x, y):
"""
We create a custom kernel:

             (2  0)
k(x, y) = x  (    ) y.T
             (0  1)
"""
M = np.array([[2, 0], [0, 1.0]])
return np.dot(np.dot(x, M), y.T)

我想了解这个内核背后的逻辑。如何选择核矩阵? y.T 到底是什么?

【问题讨论】:

    标签: python scikit-learn svm


    【解决方案1】:

    要回答您的问题,除非您非常清楚为什么要定义自定义内核,否则我会坚持使用内置插件。它们非常快速、灵活且功能强大,非常适合大多数应用程序。

    话虽如此,让我们更详细一点:

    Kernel Function 是一种特殊的两点相似性度量。基本上,较大的相似度值意味着点更相似。 scikit-learn SVM 旨在能够使用任何内核函数。内置多个内核(例如线性、径向基函数、多项式、sigmoid),但您也可以定义自己的内核。

    您的自定义内核函数应如下所示:

    def my_kernel(x, y):
        """Compute My Kernel
    
        Parameters
        ----------
        x : array, shape=(N, D)
        y : array, shape=(M, D)
            input vectors for kernel similarity
    
        Returns
        -------
        K : array, shape=(N, M)
            matrix of similarities between x and y
        """
        # ... compute something here ...
        return similarity_matrix
    

    最基本的内核,线性内核,如下所示:

    def linear_kernel(x, y):
        return np.dot(x, y.T)
    

    等价地,你可以写

    def linear_kernel_2(x, y):
        M = np.array([[1, 0],
                      [0, 1]])
        return np.dot(x, np.dot(M, y.T))
    

    这里的矩阵M 定义了内核在其中起作用的所谓的inner product space。可以修改这个矩阵来定义一个新的内积空间;您链接到的示例中的自定义函数只是修改了M,以有效地将第一维在确定相似性方面的重要性加倍。

    更复杂的非线性修改也是可能的,但您必须小心:核函数必须满足certain requirements(它们必须满足内积空间的属性),否则 SVM 算法将无法正常工作。

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2020-12-19
      • 2017-04-04
      • 2017-12-18
      • 2020-03-27
      • 2020-11-16
      • 2019-05-27
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多