- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用SVR,并使用此resource。一切都很清晰,具有ε密集损失功能(如图)。预测自带管,用于覆盖大多数训练样本并使用支持向量来概括范围。
然后我们有了这个解释。 This can be described by introducing (non-negative) slack variables , to measure the deviation of training samples outside -insensitive zone.
我在外部理解了这个错误,但是不知道如何在优化中使用它。有人可以解释一下吗?
在本地来源。我正在尝试实现没有库的非常简单的优化解决方案。这就是我的损失功能。
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/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_1
和x_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'
,并将其投影到矢量< cc>。这样做,我们得到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 + b
(来自归一化),并且epsilon
为0,因为这只是我们平面上的一个点,因此w^T * x' + b
。请注意,在我们找到d = epsilon / |w|
且具有x_n
的约束条件下,最大化此距离是困难的优化问题,我们可以做的就是将这个优化问题重构为最小化|w^T * x_n + b| = epsilon
,但要遵守所附图片中的前两个约束,即1/2 * w^T * w
。您可能会认为我已经忘记了松弛变量,而这是正确的,但是当只关注这个术语而忽略第二个术语时,我们现在暂时忽略松弛变量,稍后我将它们带回。这两个优化是等效的ent并不明显,但根本原因在于歧视的界限,您可以自由阅读更多关于歧视的界限(坦率地说,很多数学,我认为这个答案不需要更多)。然后,请注意,将|y_i - f(x_i, w)| <= epsilon
最小化与将1/2 * w^T * w
最小化相同,这是我们希望得到的期望结果。重型数学的终结
现在,请注意,我们要使边距变大,但不要太大,以至于不能像您提供的图片那样包含嘈杂的离群值。
因此,我们引入第二个术语。为了将裕量降低到合理的大小,引入了松弛变量(我将它们称为1/2 * |w|^2
和p
,因为我不想每次都键入“ psi”)。这些松弛变量将忽略边际中的所有内容,即,那些对目标无害的点和在回归状态方面“正确”的点。但是,边缘以外的点是异常值,它们不能很好地反映回归,因此我们仅对现有值进行惩罚。那里给出的松弛误差函数相对容易理解,它只是将p*
的每个点(p_i + p*_i
)的松弛误差相加,然后乘以一个调制常数i = 1,...,N
,该常数决定了cc的相对重要性。这两个词。 C
的低值表示我们可以接受离群值,因此裕量将变稀并且将产生更多离群值。 C
的高值表示我们非常在意是否有余量,因此将增加边距以容纳这些离群值,但会以不太好表示整体数据为代价。
关于C
和p
的一些注意事项。首先,请注意,它们始终都是p*
。图片中的约束说明了这一点,但从直觉上讲也是有意义的,因为应始终将松弛添加到错误中,因此它是肯定的。其次,请注意,如果>= 0
,则p > 0
,反之亦然,只能在页边的一侧。最后,边距内的所有点的p* = 0
和p
均为0,因为它们在当前位置处很好,因此不会造成损失。
请注意,通过引入松弛变量,如果您有任何异常值,则您将不需要第一个条件的条件,即p*
,因为|w^T * x_n + b| = epsilon
将是此异常值,并且您的整个模型将是搞砸了。然后,我们允许将约束更改为x_n
。转换为新优化的约束后,我们将从附带的图片(即|w^T * x_n + b| = epsilon + (p + p*)
)中获取全部约束。 (我在这里将两个方程式合并为一个方程式,但是您可以按照图片将其重写,那将是同一件事)。
希望在掩盖所有这些之后,对目标函数的动机和相应的松弛变量对您有意义。
如果我正确理解了这个问题,那么您还希望代码计算此目标/损失函数,我认为还不错。我尚未对此进行测试,但是我认为这应该是您想要的。
# Function for calculating the error/loss for a SVM. I assume that:
# - 'x' is 2d array representing the vectors of the data points
# - 'y' is an array representing the values each vector actually gives
# - 'weights' is an array of weights that we tune for the regression
# - 'epsilon' is a scalar representing the breadth of our margin.
def optimization_objective(x, y, weights, epsilon):
# Calculates first term of objective (note that norm^2 = dot product)
margin_term = np.dot(weight, weight) / 2
# Now calculate second term of objective. First get the sum of slacks.
slack_sum = 0
for i in range(len(x)): # For each observation
# First find the absolute distance between expected and observed.
diff = abs(hypothesis(x[i]) - y[i])
# Now subtract epsilon
diff -= epsilon
# If diff is still more than 0, then it is an 'outlier' and will have slack.
slack = max(0, diff)
# Add it to the slack sum
slack_sum += slack
# Now we have the slack_sum, so then multiply by C (I picked this as 1 aribtrarily)
C = 1
slack_term = C * slack_sum
# Now, simply return the sum of the two terms, and we are done.
return margin_term + slack_term
关于algorithm - 了解支持向量回归(SVR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52137097/
我想用一个向量执行以下操作。 a = np.array(np.arange(0, 4, 1)) 我想得到一个乘法,结果是一个矩阵 | 0 1 2 3 4 -| - - - - - - - 0
正如标题所述,我正在尝试使用 gsub,其中我使用向量作为“模式”和“替换”。目前,我的代码如下所示: names(x1) names(x1) [1] "2110023264A.Ms.Amp
所以当我需要做一些线性代数时,我更容易将向量视为列向量。因此,我更喜欢 (n,1) 这样的形状。 形状 (n,) 和 (n,1) 之间是否存在显着的内存使用差异? 什么是首选方式? 以及如何将 (n,
我不明白为什么 seq() 可以根据元素中是否存在小数点输出不同的类,而 c() 总是创建一个 num向量,无论是否存在小数。 例如: seqDec <- seq(1, 2, 0.5) # num v
机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需
寻找有关如何将 RegEnable 用作向量的示例/建议。此外,我想控制输入和使能信号成为 Vector 中寄存器索引的函数。 首先,我如何声明 RegEnable() 的 Vector,其次如何迭代
假设我有一个包含变量名称的向量 v1,我想为每个变量分配一个值(存储在单独的向量中)。我如何在没有迭代的情况下做到这一点? v1 <- c("a","b","c") v2 <- c(1,2,3) 我想
R 提供了三种类型来存储同质对象列表:向量、矩阵 和数组。 据我所知: 向量是一维数组的特殊情况 矩阵是二维数组的特例 数组还可以具有任意维度级别(包括 1 和 2)。 在向量上使用一维数组和在矩阵上
我正在绕着numpy/scipy中的所有选项转圈。点积、乘法、matmul、tensordot、einsum 等 我想将一维向量与二维矩阵(这将是稀疏csr)相乘并对结果求和,这样我就有了一个一维向量
我是一个 IDL 用户,正在慢慢切换到 numpy/scipy,并且有一个操作我在 IDL 中非常经常做,但无法用 numpy 重现: IDL> a = [2., 4] IDL> b = [3., 5
在python计算机图形工具包中,有一个vec3类型用于表示三分量向量,但是我如何进行以下乘法: 三分量向量乘以其转置结果得到 3*3 矩阵,如下例所示: a = vec3(1,1,1) matrix
我正在构建一款小型太空射击游戏。当涉及到空间物理学时,我曾经遇到过数学问题。 用文字描述如下:有一个最大速度。因此,如果您全速行驶,您的飞船将在屏幕上一遍又一遍地移动,就像在旧的小行星游戏中一样。如果
我正在尝试在 python 中实现 Vector3 类。如果我用 c++ 或 c# 编写 Vector3 类,我会将 X、Y 和 Z 成员存储为 float ,但在 python 中,我读到鸭式是要走
我是 Spark 和 Scala 的新手,我正在尝试阅读有关 MLlib 的文档。 http://spark.apache.org/docs/1.4.0/mllib-data-types.html上的
我有一个包含四个逻辑向量的数据框, v1 , v2 , v3 , v4 是对还是错。我需要根据 boolean 向量的组合对数据帧的每一行进行分类(例如, "None" , "v1 only" , "
我正在创建一个可视化来说明主成分分析的工作原理,方法是绘制一些实际数据的特征值(为了说明的目的,我将子集化为二维)。 我想要来自 this fantastic PCA tutorial 的这两个图的组
我有以下排序向量: > v [1] -1 0 1 2 4 5 2 3 4 5 7 8 5 6 7 8 10 11 如何在不遍历整个向量的情况下删除 -1、0 和 11
有什么方法可以让 R 对向量和其他序列数据结构使用基于零的索引,例如在 C 和 python 中。 我们有一些代码在 C 中进行一些数值处理,我们正在考虑将其移植到 R 中以利用其先进的统计功能,但是
我有一个函数可以查询我的数据库中最近的 X 个条目,它返回一个 map 向量,如下所示: [{:itemID "item1" :category "stuff" :price 5} {:itemI
我有 ([[AA ww me bl qw 100] [AA ee rr aa aa 100] [AA qq rr aa aa 90]] [[CC ww me bl qw 100] [CC ee rr
我是一名优秀的程序员,十分优秀!