(在 R 中)为什么使用用户定义的线性内核的 ksvm 的结果与使用“vanilladot”的 ksvm 的结果不同?

2023-11-24

我想在 R 中为 Ksvm 使用用户定义的内核函数。 所以,我尝试制作一个 vanilladot 内核,并与“kernlab”中内置的“vanilladot”进行比较作为实践。

我按如下方式编写内核。

#
###vanilla kernel with class "kernel"
#
kfunction.k <- function(){
   k <- function (x,y){crossprod(x,y)}
   class(k) <- "kernel"
   k}
l<-0.1 ; C<-1/(2*l)

###use kfunction.k
tmp<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel=kfunction.k(), C = C)
alpha(tmp)[[1]]
ind<-alphaindex(tmp)[[1]]
x.s<-x[ind,] ; y.s<-y[ind]
w.class.k<-t(alpha(tmp)[[1]]*y.s)%*%x.s
w.class.k

我认为此操作的结果与以下操作的结果相同。 然而事实并非如此。

#
###use "vanilladot"
#
l<-0.1 ; C<-1/(2*l)
tmp1<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel="vanilladot", C = C)
alpha(tmp1)[[1]]
ind1<-alphaindex(tmp1)[[1]]
x.s<-x[ind1,] ; y.s<-y[ind1]
w.tmp1<-t(alpha(tmp1)[[1]]*y.s)%*%x.s
w.tmp1

我认为这个问题可能与内核类有关。 当class设置为“kernel”时,就会出现这个问题。 但是,当 class 设置为“vanillakernel”时,使用用户定义内核的 ksvm 的结果与使用 Kernlab 中构建的“vanilladot”的 ksvm 的结果相同。

#
###vanilla kernel with class "vanillakernel"
#
kfunction.v.k <- function(){
   k <- function (x,y){crossprod(x,y)}
   class(k) <- "vanillakernel"  
   k}
# The only difference between kfunction.k and kfunction.v.k is "class(k)".
l<-0.1 ; C<-1/(2*l)

###use kfunction.v.k
tmp<-ksvm(x,factor(y),scaled=FALSE, type = "C-svc", kernel=kfunction.v.k(), C = C)
alpha(tmp)[[1]]
ind<-alphaindex(tmp)[[1]]
x.s<-x[ind,] ; y.s<-y[ind]
w.class.v.k<-t(alpha(tmp)[[1]]*y.s)%*%x.s
w.class.v.k

我不明白为什么将类设置为“kernel”时结果与“vanilladot”不同。

难道我的操作有错误?


首先,这似乎是一个非常好的问题!

现在进入正题。在来源中ksvm我们可以发现使用用户定义的内核和内置内核之间的界限是什么时候:

 if (type(ret) == "spoc-svc") {
            if (!is.null(class.weights)) 
                weightedC <- class.weights[weightlabels] * rep(C, 
                  nclass(ret))
            else weightedC <- rep(C, nclass(ret))
            yd <- sort(y, method = "quick", index.return = TRUE)
            xd <- matrix(x[yd$ix, ], nrow = dim(x)[1])
            count <- 0
            if (ktype == 4) 
                K <- kernelMatrix(kernel, x)
            resv <- .Call("tron_optim", as.double(t(xd)), as.integer(nrow(xd)), 
                as.integer(ncol(xd)), as.double(rep(yd$x - 1, 
                  2)), as.double(K), as.integer(if (sparse) xd@ia else 0), 
                as.integer(if (sparse) xd@ja else 0), as.integer(sparse), 
                as.integer(nclass(ret)), as.integer(count), as.integer(ktype), 
                as.integer(7), as.double(C), as.double(epsilon), 
                as.double(sigma), as.integer(degree), as.double(offset), 
                as.double(C), as.double(2), as.integer(0), as.double(0), 
                as.integer(0), as.double(weightedC), as.double(cache), 
                as.double(tol), as.integer(10), as.integer(shrinking), 
                PACKAGE = "kernlab")
            reind <- sort(yd$ix, method = "quick", index.return = TRUE)$ix
            alpha(ret) <- t(matrix(resv[-(nclass(ret) * nrow(xd) + 
                1)], nclass(ret)))[reind, , drop = FALSE]
            coef(ret) <- lapply(1:nclass(ret), function(x) alpha(ret)[, 
                x][alpha(ret)[, x] != 0])
            names(coef(ret)) <- lev(ret)
            alphaindex(ret) <- lapply(sort(unique(y)), function(x)
which(alpha(ret)[, 
                x] != 0))
            xmatrix(ret) <- x
            obj(ret) <- resv[(nclass(ret) * nrow(xd) + 1)]
            names(alphaindex(ret)) <- lev(ret)
            svindex <- which(rowSums(alpha(ret) != 0) != 0)
            b(ret) <- 0
            param(ret)$C <- C
        }

重要的部分有两件事,首先,如果我们提供ksvm用我们自己的内核,然后ktype=4(同时对于vanillakernel, ktype=0)所以它做了两个改变:

  • 如果是用户定义的内核,则计算内核矩阵而不是实际使用内核
  • tron_optim例程使用有关内核的信息运行

现在,在svm.cpp我们可以找到tron惯例,并在tron_run(从调用tron_optim), that LINEAR内核有一个单独的优化例程

if (param->kernel_type == LINEAR)
    {
     /* lots of code here */
     while (Cpj < Cp)
       {
       totaliter += s.Solve(l, prob->x, minus_ones, y, alpha, w, 
                            Cpj, Cnj, param->eps, sii, param->shrinking, 
                            param->qpsize);
     /* lots of code here */
       }
     totaliter += s.Solve(l, prob->x, minus_ones, y, alpha, w, Cp, Cn,
                          param->eps, sii, param->shrinking, param->qpsize);
     delete[] w;
    }
else
{    
    Solver_B s;
    s.Solve(l, BSVC_Q(*prob,*param,y), minus_ones, y, alpha, Cp, Cn, 
    param->eps, sii, param->shrinking, param->qpsize);
}

正如您所看到的,线性情况以更复杂、更详细的方式处理。有一个内部优化循环多次调用求解器。这需要对此处执行的实际优化进行真正深入的分析,但在这一步中,可以通过以下方式回答您的问题:

  • no error在你的操作中
  • kernlab的svm有一个单独的例程用于使用线性核训练 SVM,即根据类型传递给代码的内核,将“kernel”更改为“vanillakernel”使得ksvm 认为它实际上与 vanillakernel 一起工作,因此执行了这个单独的优化例程
  • It 看起来不是一个错误事实上,线性 SVM 在高效优化技术方面与核化版本有很大不同。需要处理的启发式问题和数值问题的数量确实很大。因此,需要一些近似值,并且可能会导致不同的结果。虽然对于丰富的特征空间(如 RBF 内核引起的特征空间)来说,这并不重要,但对于简单的线性内核来说,这种简化可能会导致显着的输出变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(在 R 中)为什么使用用户定义的线性内核的 ksvm 的结果与使用“vanilladot”的 ksvm 的结果不同? 的相关文章

  • sklearn:如何在 sknn 中重置回归器或分类器对象

    我定义了一个回归器 如下所示 nn1 Regressor layers Layer Rectifier units 150 Layer Rectifier units 100 Layer Linear regularize L2 dropo
  • 组合上标和包含 < 符号的变量标签时使用 ggplot geom_text

    我在将 R2 注释添加到多面图中时遇到问题 其中我的 R2 值有时 例如 使用 iris 数据集 我首先使用之前计算的 R2 值设置一个新的数据框 x 和 y 位置也已设置 因为每个方面的 x 和 y 位置都不同 对于 iris 数据集来说
  • 有没有比“[”更快的方法来对稀疏矩阵进行子集化?

    我是 seqMeta 包的维护者 正在寻找如何加速将大矩阵多次分割成小块的瓶颈的想法 背景 seqMeta 包用于分析遗传数据 所以你有一组受试者 n subject 和一些遗传标记 n snps 这导致 n subject x n snp
  • 如何在 R 中使用 Torocks5 getURL

    我想使用 TorgetURLR Tor 中的功能正在工作 在 Firefox 中检查 socks5 at port 9050 但是当我在 R 中设置它时 出现以下错误 html lt getURL http www google com f
  • R 在设置宽度和高度的 PDF 中缩放绘图元素

    尽管发送到 PDF 的 R 图可以在插图或页面布局软件中随意重新缩放 但科学期刊通常坚持提供的图具有特定的尺寸 是否可以直接在 R 中在给定 PDF 大小内缩放所有绘图元素的大小 require ggplot2 p lt qplot dat
  • 如何将 sklearn.naive_bayes 与(多个)分类特征一起使用? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想学习朴素贝叶斯模型来解决类为布尔值的问题 有些特征是布尔型的 但其他特征是分类型的 并且可以采用少量值 5 如果我所有的功能都是布尔值
  • 在 R 中管理元数据的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 在分析数据时 有关变量的元数据极其重要 您如何在 R 中管理这些信息 例如 有没有办法指定将打印的标签而不是变量名称 R中有哪些工具可以实现这一点 我想到的快速建议是 将数据与对象一起存储的属性 正如 Frank
  • 地图应用的聚类算法

    我正在研究地图上的聚类点 纬度 经度 对于快速且可扩展的合适算法有什么建议吗 更具体地说 我有一系列纬度 经度坐标和一个地图视口 我正在尝试将靠近的点聚集在一起以消除混乱 我已经有了解决问题的方法 see here http bouldr
  • 测试 PCA 图上簇的显着性

    是否可以在 PCA 图上测试 2 个已知组之间聚类的显着性 测试它们的接近程度或分布量 方差 以及簇之间的重叠量等 这是一种定性方法 使用ggplot 在簇周围绘制 95 置信椭圆 注意stat ellipse 使用二元 t 分布 libr
  • 基本 R 图:帮助减少多个图之间的空间

    我试图减少一个窗口中多个绘图之间的空间量 但无法实现我想要的 情节和代码如下 我想将图例保留在原处 但减少 B 和 C 之间的空间 如何将图 C 向左 移动到靠近图 B 的位置以模仿 A 和 B 之间的间距 同时保持图例就位 我希望传奇是独
  • 如何在 R 中建立具有某些条件的排列[重复]

    这个问题在这里已经有答案了 我是 R 新手 有点困惑 假设我有一个向量 c 1 2 3 4 5 6 我想生成具有四个元素的排列 每个排列应涉及 1 和 5 谢谢 您可以使用permutations https www rdocumentat
  • 根据“df1”的一个变量(“df1$var1”)在“df1”中创建一个变量,并根据“df1$var1”创建一个可更改的“df2”变量

    我有数据框df1总结了一段时间内鱼的深度 df1 Site告诉你鱼所在的地点 df1 Ind告诉你个人和df1 Depth告诉您鱼在特定位置的深度df1 Datetime 另一方面 我有df2总结了一段时间内 每三小时 从表面到 39 米深
  • 包含 NA 的数据的聚类标准误差

    我无法使用 R 和基于此的指导对标准错误进行聚类post http thetarzan wordpress com 2011 06 11 clustered standard errors in r cl 函数返回错误 Error in t
  • R文本文件和文本挖掘...如何加载数据

    我正在使用 R 包tm我想做一些文本挖掘 这是一个文档 被视为一个词袋 我不明白有关如何加载文本文件并创建必要的对象以开始使用诸如 之类的功能的文档 stemDocument x language map IETF Language x 所
  • 使用函数保存 ggplot

    我想创建一个函数来保存绘图 来自ggplot 这是一个数据框 creating data frame music lt c Blues Hip hop Jazz Metal Rock number lt c 8 7 4 6 11 df mu
  • 如何在R中对多个时间序列应用dtw算法?

    Problem 我有不同车辆速度的时间序列 我的最终目标是根据不同车辆在时间上的速度相似性对它们进行聚类 因此 我基本上需要生成一个距离矩阵 其中每个单元格包含一对车辆速度时间序列之间的距离 我想使用动态时间扭曲 dtw 作为距离度量 所以
  • 如何制作 POSIXct 的空向量

    我想制作一个空向量POSIXct这样我就可以放一个POSIXct in it vec lt vector POSIXct 10 vec vec 1 lt 2014 10 27 18 11 36 PDT vec 那是行不通的 有任何想法吗 由
  • R - 按列比较两行并将结果写入表中

    我是 R 新手 可能我的问题的解决方案非常简单 但目前我无法实现 我想按列比较数据框中的行 每列中的数据是一个字母 核苷酸碱基 seq1 A C T G T seq2 A C G G G seq3 A G G C A 我想按列比较数据集中的
  • R 复平面上的多重根

    我一直在尝试找到一个返回方程的所有复数解的函数 例如 16 1 4 2 i0 2 i0 0 i2 0 i2 就目前情况而言 如果我输入16 1 4 进入控制台 它只返回 2 我可以为此编写一个函数 但我想知道在 R 中是否有一种简单的方法可
  • 是否有任何 R 函数可以将链接的值可视化为节点内的文本?

    我正在使用 R 包networkD3绘制以下桑基图 这些值设置链接的大小 我需要一个在节点内添加与文本相同的值的函数 Library library networkD3 library dplyr Make a connection dat

随机推荐

  • Numpy->Cython 转换:编译错误:无法将 'npy_intp *' 转换为 Python 对象

    我有以下代码要正确转换为 cython from numpy import returns winning players or if undecided def score board scores checked zeros board
  • 如何在Python中读取一行csv数据?

    有很多使用 python 读取 csv 数据的例子 比如这个 import csv with open some csv newline as f reader csv reader f for row in reader print ro
  • Apache Spark:如何从 DataFrame 创建矩阵?

    我在 Apache Spark 中有一个带有整数数组的 DataFrame 源是一组图像 我最终想对其进行 PCA 但我在从数组创建矩阵时遇到了麻烦 如何从 RDD 创建矩阵 gt imagerdd traindf map lambda r
  • 将命令行上的变量传递给 Cucumber 测试

    我试图将黄瓜项目的用户名和密码保留在版本控制之外 有没有办法手动将命令行上的变量 例如用户名和密码 传递给黄瓜脚本 我的备份计划是将它们放入 YML 文件中 并将该文件添加到 gitignore 这样它们就不会被置于版本控制中 所以 我看到
  • 正则表达式查找所有可能出现的以 ~ 开头和结尾的文本

    我想找到两个之间所有可能出现的文本 s 例如 对于文本 abc xyz 123 我想要以下表达式作为匹配模式 abc xyz 123 请注意 它可以是字母或数字 我尝试使用正则表达式 w 但它没有给我 xyz 我想 有待重新考虑 但我不想只
  • 元标记不在前 1024 字节中

    警告 在有人去并将其标记为重复之前this 请理解事实并非如此 接受的答案正是我正在做的 但我面临以下问题 客户端文件夹中的 HTML 文件如下所示 我在 Firebug 控制台中收到的消息是 The character encoding
  • MVC5:控制器之间的属性路由优先级

    我在控制器中使用 MVC5 的属性路由 问题 有没有办法控制控制器之间的属性路由优先级 考虑以下 Route home action index username public class HomeController Controller
  • 将 IQueryable 转换为 DbSet

    我不确定这是否可行 但我正在尝试对使用 DbSet 的存储库进行单元测试 我认为最简单的解决方案就是创建一个 Enumerable 并用它替换 DbSet 这是我的尝试 我正在使用 C EntityFramework XUnit 和 Moq
  • Cassandra 允许的最大列数是多少

    卡桑德拉发布了技术限制但没有提及允许的最大列数 有最大列数吗 我需要存储 400 多个字段 这在卡桑德拉中可能吗 每行 或一组行 即称为 分区 在 Cassandra 的 CQL 中 是 20 亿 但分区也必须适合物理节点 请参阅docs
  • Vue.js 转换在元素进入视口时出现/发生

    首先请没有 jQuery 我可以用 jQuery 等来做到这一点 问题的重点是在没有不必要的依赖的情况下做到这一点 这里的场景是我正在创建一个单页网站 其中有几个部分可供滚动浏览 我想用Vue js 转换一旦浏览器滚动到该部分 就可以淡入
  • 如何增加 bison 中的堆栈大小(并解决“内存耗尽”)

    我的基于野牛的解析器开始对我最近生成的一些中等大小的文件感到窒息 它抛出一个关于 内存耗尽 的异常 bison 手册页说这可能是由于使用了右手递归 在不尝试重写语法的情况下 我的截止日期很紧 我想简单地增加堆栈以使解析器解析该文件 我尝试遵
  • 如何构造Immutable.Record的子类?

    class Event extends Immutable Record constructor text super text text timestamp Date now Calling new Event 似乎返回一个构造函数 ne
  • 运行 webpack 后'global'未定义

    我有一个非常简单的包装模块 围绕由脚本运行环境设置的全局对象 包装器模块简单地执行以下操作 module exports global foobar 以前当我使用 browserify 时效果很好 当在浏览器中时 global与window
  • 如何使用 Typescript 扩展 Material UI 中的调色板

    我是反应和打字稿的新手 我正在尝试扩展全球主题的调色板 在我的主题Container tsx 中 import ThemeOptions from material ui core styles createMuiTheme declare
  • 构建一个简单的 RSS 阅读器,检索内容

    我正在尝试使用以下命令制作一个简单的 RSS 阅读器SyndicationFeed class 有一些标准标签 例如
  • 重定向到页面并发送自定义 HTTP 标头

    我使用以下代码重定向到 PHP 中的页面 我需要设置自定义 HTTP 标头以与重定向一起传递 header Location http 我怎样才能存档这个 恐怕所有的答案都是错误的和误导性的 无论您使用什么语言或框架 都无法重定向到设置了自
  • PDO无法连接远程mysql服务器

    服务器A 192 168 1 3 mysql服务器 5 6 12 端口6603 socket var run mysql mysql sock php 5 5 0 php ini pdo mysql default socket var r
  • Java - for循环声明之外的逗号运算符

    我知道我可以像这样使用逗号运算符 for int i 1 j 15 j gt 10 i j do something neat 但有些文章似乎建议逗号运算符可以在 for 循环声明之外使用 例如 int j 2 k 4 int x Assi
  • 在 Java 中将 BigInteger 转换为较短的字符串

    我正在寻找一种将 BigInteger 转换为非常短的字符串 尽可能短 的方法 转换必须是可逆的 在这种情况下 转换的安全性并不是什么大问题 有人会提供如何解决这个问题的建议或示例吗 您可以使用 Base64 编码 请注意 此示例使用 Ap
  • (在 R 中)为什么使用用户定义的线性内核的 ksvm 的结果与使用“vanilladot”的 ksvm 的结果不同?

    我想在 R 中为 Ksvm 使用用户定义的内核函数 所以 我尝试制作一个 vanilladot 内核 并与 kernlab 中内置的 vanilladot 进行比较作为实践 我按如下方式编写内核 vanilla kernel with cl