了解支持向量回归(SVR)

时间:2018-09-02 12:37:00

标签: algorithm machine-learning svm

我正在使用SVR,并且正在使用此resource。一切都很清晰,具有ε密集损失功能(如图)。预测自带管,用于覆盖大多数训练样本并使用支持向量来概括范围。

enter image description here

enter image description here

然后我们有了这个解释。 This can be described by introducing (non-negative) slack variables , to measure the deviation of training samples outside -insensitive zone.我在外部理解了此错误,但不知道如何在优化中使用此错误。 有人可以解释吗?

enter image description here

enter image description here


在本地来源中。我正在尝试实现没有库的非常简单的优化解决方案。这就是我的损失功能。

import numpy as np

# Kernel func, linear by default
def hypothesis(x, weight, k=None):
    k = k if k else lambda z : z
    k_x = np.vectorize(k)(x)
    return np.dot(k_x, np.transpose(weight))

.......

import math

def boundary_loss(x, y, weight, epsilon):
    prediction = hypothesis(x, weight)

    scatter = np.absolute(
        np.transpose(y) - prediction)
    bound = lambda z: z \
        if z >= epsilon else 0

    return np.sum(np.vectorize(bound)(scatter))

1 个答案:

答案 0 :(得分:1)

首先,让我们看一下目标函数。第一项,1/2 * w^2(希望此站点具有LaTeX支持,但这足够了)与SVM的余量相关。在我看来,您链接的文章并不能很好地解释这一点,并称其为描述“模型的复杂性”的术语,但这也许不是解释它的最佳方法。最小化此术语最大化边距(同时仍能很好地表示数据),这是使用SVM进行回归的主要目标。

警告,数学运算繁重的解释:之所以如此,是因为在最大化边距时,您想在边距上找到“最远的”非离群点并最小化其距离。让这个最远的点为x_n。我们想要找到它与平面d的欧几里德距离f(w, x) = 0,我将其重写为w^T * x + b = 0(其中w^T只是权重矩阵的转置,因此我们可以乘以两个)。为了找到距离,让我们首先对平面进行归一化,以使|w^T * x_n + b| = epsilon可以进行WLOG的w仍然能够形成w^T * x + b= 0形式的所有可能的平面。然后,请注意w垂直于平面。如果您对平面进行了很多处理(特别是在矢量演算中),这很明显,但是可以通过在平面x_1x_2上选择两个点,然后注意w^T * x_1 + b = 0来证明这一点,和w^T * x_2 + b = 0。将两个方程式相减得到w^T(x_1 - x_2) = 0。由于x_1 - x_2只是严格在平面上的任何矢量,并且其与w的点积为0,因此我们知道w垂直于平面。最后,为了实际计算x_n与平面之间的距离,我们采用由x_n'和平面x'上的某个点形成的矢量(矢量将为x_n - x' ,然后将其投影到向量w上,我们得到d = |w * (x_n - x') / |w||,可以将其重写为d = (1 / |w|) * | w^T * x_n - w^T x'|,然后在内部加上和减去b以获得d = (1 / |w|) * | w^T * x_n + b - w^T * x' - b|。请注意,w^T * x_n + bepsilon(根据上面的归一化),w^T * x' + b是0,因为这只是我们平面上的一个点。因此,{{ 1}}。请注意,在我们找到d = epsilon / |w|并拥有x_n的约束条件下最大化此距离是一个困难的优化问题,我们可以做的是将此优化问题重构为最小化|w^T * x_n + b| = epsilon受您所附图片的前两个约束,即1/2 * w^T * w的影响,您可能认为我已经忘记了松弛变量,这是正确的,但是当只关注此术语而忽略第二个术语时,我们暂时忽略松弛变量,稍后再将它们带回。这两个优化的原因等同的含义并不明显,但是根本原因在于歧视的界限,您可以自由阅读更多关于歧视的界限(坦率地说,更多的数学知识我不需要这个答案)。然后,注意最小化|y_i - f(x_i, w)| <= epsilon与最小化1/2 * w^T * w相同,这是我们希望得到的期望结果。 重型数学结束

现在,请注意,我们希望将页边距设置得较大,但不要太大,以至于不能像您提供的图片那样包含嘈杂的异常值。

因此,我们引入第二个术语。为了将裕量降低到合理的大小,引入了松弛变量(我将它们称为1/2 * |w|^2p,因为我不想每次都键入“ psi”)。这些松弛变量将忽略边际中的所有内容,即,那些对目标无害的点和在回归状态方面“正确”的点。但是,边距之外的点是异常值,它们不能很好地反映回归,因此我们仅对现有点进行惩罚。那里给出的松弛误差函数相对容易理解,它只是将p*的每个点(p_i + p*_i)的松弛误差相加,然后乘以调制常数i = 1,...,N这决定了这两个术语的相对重要性。较低的C表示我们可以接受离群值,因此裕量将变稀并且将产生更多离群值。较高的C表示我们非常在意是否有余量,因此将增加余量以容纳这些离群值,但会降低整体数据表示的准确性。

关于Cp的几点注意事项。首先,请注意,它们始终都是p*。图片中的约束说明了这一点,但从直觉上讲也是有意义的,因为应始终将松弛添加到错误中,因此它是肯定的。其次,请注意,如果为>= 0,则p > 0(反之亦然)只能在页边的一侧。最后,页边空白内的所有点的p* = 0p均为0,因为它们在当前位置处很好,因此不会造成损失。

请注意,通过引入slack变量,如果您有任何异常值,则您将不需要第一个条件(即p*)的条件,因为|w^T * x_n + b| = epsilon就是这个异常值,整个模型就会搞砸了。然后,我们允许将约束更改为x_n。当转换为新的优化约束时,我们将从您附带的图片|w^T * x_n + b| = epsilon + (p + p*)中获得全部约束。 (我在这里将两个方程式合并为一个方程式,但是您可以按照图片的形式重写它们,这是同一回事。)

希望在掩盖了所有这些之后,目标函数的动机和相应的松弛变量对您来说很有意义。


如果我正确理解了这个问题,那么您还希望代码计算此目标/损失函数,我认为这还不错。我尚未对此进行测试,但我认为这应该是您想要的。

|y_i - f(x_i, w)| <= epsilon + p + p*

我在计算机上使用少量数据时就使用了此功能,例如,如果阵列的结构不同,但是您可能需要对它进行一些改动以使用数据。另外,我并不是最精通python的人,因此这可能不是最有效的实现,但是我的目的是使其易于理解。

现在,请注意,这只是计算错误/损失(无论您要调用什么)。要使其实际最小化,需要进行拉格朗日式和严格的二次编程,这是一项艰巨的任务。有可用的库来执行此操作,但是如果您想像这样做一样免费使用此库,则祝您好运,因为这样做不是在公园散步。

最后,我想指出的是,这些信息大部分是我从去年我的ML课程中获得的笔记中获得的,而教授(Abu-Mostafa博士)对我学习该材料非常有帮助。该课程的讲课是在线的(由同一教授参加),并且与此主题相关的主题是herehere(尽管在我看来,您应该收看所有的演讲,但它们都是很大的帮助)。如果您需要清除任何内容,或者您​​认为我在某个地方犯了错误,请发表评论/问题。如果您仍然不明白,我可以尝试编辑我的答案以使其更有意义。希望这会有所帮助!