Clojure / Incanter 中的快速矢量数学

2024-01-02

我目前正在研究 Clojure 和 Incanter 作为 R 的替代品。(并不是说我不喜欢 R,而是尝试新语言很有趣。)我喜欢 Incanter 并且发现语法很有吸引力,但相比之下,矢量化操作相当慢例如到 R 或 Python。

作为一个例子,我想获得向量的一阶差分 使用 Incanter 向量运算、Clojure 映射和 R 。以下是所有代码和时间 版本。正如您所看到的,R 显然更快。

Incanter 和 Clojure:

(use '(incanter core stats)) 
(def x (doall (sample-normal 1e7))) 
(time (def y (doall (minus (rest x) (butlast x))))) 
"Elapsed time: 16481.337 msecs" 
(time (def y (doall (map - (rest x) (butlast x))))) 
"Elapsed time: 16457.850 msecs"

R:

rdiff <- function(x){ 
   n = length(x) 
   x[2:n] - x[1:(n-1)]} 
x = rnorm(1e7) 
system.time(rdiff(x)) 
   user  system elapsed 
  1.504   0.900   2.561

所以我想知道有没有办法加速 Incanter/Clojure 中的矢量运算?此外,还欢迎涉及使用循环、Java 数组和/或 Clojure 库的解决方案。

我也已将这个问题发布到 Incanter Google 群组,但到目前为止尚未得到回复。

UPDATE:我已将 Jouni 的答案标记为已接受,请参阅下面我自己的答案,我已经清理了他的代码并添加了一些基准。


我的最终解决方案

经过所有测试后,我发现两种略有不同的方法可以以足够的速度进行计算。

首先我使用了该功能diff具有不同类型的返回值,下面是返回向量的代码,但我还计时了返回双数组的版本(用 y 替换 (vec y) )和 Incanter.matrix (用矩阵 y 替换 (vec y) ) 。该函数仅基于java数组。这是基于 Jouni 的代码,删除了一些额外的类型提示。

另一种方法是使用 Java 数组进行计算并将值存储在瞬态向量中。正如您从计时中看到的,如果您不希望函数返回并数组,则这比方法 1 稍快。这是在函数中实现的difft.

因此,选择实际上取决于您不想对数据做什么。我想一个好的选择是重载该函数,以便它返回与调用中使用的相同类型。实际上将 java 数组传递给 diff 而不是向量会使速度加快约 1 秒。

不同功能的计时:

返回向量的差异:

(time (def y (diff x)))
"Elapsed time: 4733.259 msecs"

返回 Incanter.matrix 的 diff:

(time (def y (diff x)))
"Elapsed time: 2599.728 msecs"

diff 返回双数组:

(time (def y (diff x)))
"Elapsed time: 1638.548 msecs"

difft:

(time (def y (difft x)))
"Elapsed time: 3683.237 msecs"

功能

(use 'incanter.stats)
(def x (vec (sample-normal 1e7)))

(defn diff [x]
  (let [y (double-array (dec (count x)))
        x (double-array x)] 
   (dotimes [i (dec (count x))]
     (aset y i
       (- (aget x (inc i))
                   (aget x i))))
   (vec y)))


(defn difft [x]
  (let [y (vector (range n))
        y (transient y)
        x (double-array x)]
   (dotimes [i (dec (count x))]
     (assoc! y i
       (- (aget x (inc i))
                   (aget x i))))
   (persistent! y))) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure / Incanter 中的快速矢量数学 的相关文章

  • 自定义链接功能适用于 GLM,但不适用于 mgcv GAM

    如果答案很明显 我深表歉意 但我花了相当长的时间尝试在 mgcv gam 中使用自定义链接函数 简而言之 我想使用包中修改后的概率链接psyphy https cran r project org web packages psyphy p
  • 如何强制 cv.glmnet 不删除一个特定变量?

    我正在运行包含 67 个观察值和 32 个变量的回归 我正在使用 glmnet 包中的 cv glmnet 函数进行变量选择 我想将一个变量强加到模型中 它在正常过程中被删除 我如何在 cv glmnet 中指定此条件 谢谢你 我的代码如下
  • r + dplyr 过滤时间序列

    我有一些数据观察了一群人以及他们随时间推移所吃的水果 我想使用 dplyr 来观察每个人 直到他们吃香蕉并总结他们吃的所有水果直到他们吃第一根香蕉 data data lt structure list user c 1234L 1234L
  • R:如何检查向量元素是否相同

    gt dput ranks structure c NA NA 2L 2L NA NA NA 2L 1L Names c LANG1 LANG2 LANG3 LANG4 LANG5 LANG6 LANG7 LANG8 LANG9 gt ra
  • 在 R 中管理元数据的最佳方法是什么? [复制]

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

    我的 data table 中有一个包含 8 000 000 行 100 列的数据集 其中每列都是一个计数 我需要找到每行的最大计数以及该最大值位于哪一列 我可以使用以下命令快速获取每行的哪一列具有最大值 dt lt dt maxCol w
  • 更改 ggplot 对象的数据集

    我正在绘制数据的子集ggplot2我想知道我是否会以某种方式使用已包含在ggplot原始数据子集中的对象 举个例子 这是第一个图 代码块 1 require ggplot2 p lt ggplot mtcars aes mpg wt col
  • Shiny:如何在数据表中显示条形图

    我想在数据表中显示条形图 这link http jsfiddle net annoyingmouse em27yod1 显示我想使用 javascript 做什么 我不了解 javascript 或 html 所以你能告诉我是否可以使用闪亮
  • 更改 geom_text 的默认“a”图例以标记字符串本身

    类似于这个问题 https stackoverflow com questions 18337653 remove a from legend when using aesthetics and geom text 我想更改图例中的默认 a
  • R 将向量重塑为多列

    假设我在 R 中有一个向量 如下所示 d lt seq 1 100 我想将这个向量重塑为 10x10 矩阵 这样我就可以得到以下数据 1 2 3 10 1 2 3 10 11 12 13 20 21 22 23 30 91 92 93 10
  • 为什么连接终止

    我正在尝试使用随机森林分类模型H2OR 内部的库 训练集有 7000 万行和 25 个数字特征 总文件大小为 5 6 GB 验证文件的大小为 1 GB 我的系统有 16 GB RAM 和 8 核 CPU 系统成功读取 H2O 对象中的两个文
  • 在 expr *之前*执行的任务处理程序

    是否有运行代码的回调before提示输入expr被评价 通过 SO CRAN 和一些谷歌搜索发现了我怀疑的答案 当前的 REPL 实现不可能 如果我错过了类似详细的重复讨论 我深表歉意 我对addTaskCallback 及其函数族 正在阅
  • 带有 rename_with 的 Purrr 地图

    我正在尝试清理数据集的名称 我用过janitor clean names 开始 但是 我仍然有缩写想用下划线分隔开 我有可以使用的代码rename with str replace x gh gh cols starts with gh 但
  • 如何在 purrr::map_df 之后使用映射向量添加列

    我使用 mtcars 数据集作为示例来说明我的问题 我对每种气缸类型进行了线性回归 并使用 map df 将所有模型结果放在一起 下面的代码和输出 我想要做的是添加另一列名为 圆柱体 4 4 6 6 8 8 我怎样才能在map df中做到这
  • 如何强制geom_point在R中显示比例大小?

    我的数据如下 抱歉有点大 test dput 我还有一个绘制这些数据的代码 这里的问题是它没有给我比例大小read counts value多变的 我怎样才能解决这个问题 谢谢 my code p ggplot test dput aes
  • Python 是否有相当于 R 的sample() 函数?

    我想知道Python是否有相当于sample R 中的函数 The sample https stat ethz ch R manual R devel library base html sample html函数使用带替换或不带替换的方
  • 按字符分隔字段中的变量

    我最近问了这个问题单独的字段内容 https stackoverflow com questions 53309849 separate contents of field并得到了一个非常快速且非常简单的答案 我在 Excel 中可以简单地
  • 如何在 bookdown 定理或示例环境中使用内联 R 代码

    我使用 bookdown 生成 html 和 PDF 文档 如何在定理和示例环境中使用内联 R 代码的结果 这是我尝试过的 title Test output bookdown pdf book toc false html documen
  • 合并行并用 group_by 和? 填充空位置

    对 R 编码非常陌生 我一直在尝试使用 dplyr 中的 group by 格式化 合并 df 中的行 然而 我还没有完全做到这一点 这是我的数据表的简化 前三个条目共享相同的 id 最后两个条目共享相同的 id ID Assay1 Ass
  • R 脚本 - 如何在错误时继续执行代码

    我编写了一个 R 脚本 其中包含一个检索外部 Web 数据的循环 数据的格式大多数时候是相同的 但有时格式会以不可预测的方式发生变化 并且我的循环崩溃 停止运行 有没有办法不管错误如何继续执行代码 我正在寻找类似于 VBA 中的 On er

随机推荐

  • spring boot 不显示自定义错误页面

    I added spring boot starter thymeleaf依赖于我的项目 使用春季启动2 3 1 RELEASE并放置error html里面的文件src main resources templates有名字error h
  • 使用 d3.js 绘制 topojson 文件(纽约市行政区和人口普查区)

    这是第一个topojson如此提问 我在渲染地图 纽约市行政区 时遇到问题 并且不明白为什么 下面的代码只是一个副本这个例子 http bl ocks org 4108203使用不同的 topojson 文件 我已上传文件here http
  • jqgrid 的通用搜索字段

    我是 jqgrid 的新手 我发现有四种方法可以在 jqgrid 中实现搜索 a toolbar searching a custom searching a single field searching a more complex ap
  • 如何在 bash 中使用 grep 测试进程是否正在运行?

    我有命令 ps ax grep my application 它输出一个大字符串 包括我的应用程序中涉及的进程的端口 如果 my application 未运行 则输出 3873 pts 0 S 0 00 grep my applicati
  • Laravel/blade 缓存 css 文件

    我正在 Nginx 服务器上工作 使用 PHP FPM 我安装了Laravel 4 1 and bootstrap v3 1 1 这就是问题所在 在过去的 30 分钟里 我一直在尝试更改我首先声明的检查 boostrap 的 CSS 规则
  • PageKeyedDataSource loadAfter 没有起火

    在我的片段中 我集成了 android jetpack 分页库和我使用的数据源页面键控数据源带有改造 API 回调 代码以异常方式运行并将数据加载到回收者视图但当我滚动到底部后 它应该通过触发加载更多数据加载后数据源类中的函数 但没有 我也
  • 如何在swift 3中绘制圆弧

    我有一些来自网络服务的百分比值 根据百分比值我想在a中画一些圆弧UIView通过以下方式 白色圆圈是一个UIView我尝试通过这种方式来实现这一目标 func colorProgress let circleColorPath UIBezi
  • byte[] 到无符号 BigInteger?

    动机 我想将哈希值 MD5 SHA1 等 转换为十进制整数 以便在 Code128C 中制作条形码 为简单起见 我希望所有结果 大 数字都是正数 我能够在 C 中将 byte 转换为 BigInteger 到目前为止我所拥有的样本 byte
  • 如何在 Visual Studio 2013 中启用 C# 6.0 功能?

    我正在了解 C 6 0 中引入的最新功能 并且只是遵循自动属性初始值设定项的示例 class NewSample public Guid Id get Guid NewGuid 但我的 IDE 无法识别该语法 我想知道如何在 Visual
  • Docker 容器构建失败:“exec:\”flask\”:在 $PATH 中找不到可执行文件”:未知

    我正在学习码头工人 我尝试在 docker com 上运行示例 dockerfile 但我有一个问题是 守护进程的错误响应 OCI 运行时创建失败 container linux go 345 启动容器进程导致 exec flask 在 P
  • 如果文件已重命名,如何查找文件扩展名?

    如果文件已重命名 如何查找文件扩展名 有没有可用的工具 示例 我有一个文件 1 doc 我希望大家知道这是一个我刚刚重命名为 1 txt 的Word文档 但该文件原本是Word文档 如何获得原始文件扩展名 您无法恢复以前的文件扩展名 您所能
  • 通过流下载 azure blob - 出口 137

    我正在尝试通过 Azure python sdk get blob to stream 下载大文件 但是 我的程序不断退出 返回代码为 137 这似乎与内存不足有关 我可以在顶部看到 python 正在消耗越来越多的内存 直到它被杀死 Co
  • 为 AWS APIGateway 创建 VPC 链接时出现“NLB ARN 格式错误”

    我按照教程创建了一个指向我的私有 elb 平衡器的 VPC 链接 https docs aws amazon com apigateway latest developerguide set up api with vpclink cli
  • 验证是否所有复选框均未选中的快速方法?

    如果取消选择所有复选框 是否有一种快速方法或功能可以告诉我真 假 不通过数组 使用 JS 和 HTML 我所有的复选框都有相同的名称
  • “respond_to do |格式|”抛出 UnknownFormat 错误

    我正在尝试使用 ajax 从控制器渲染 js 文件 这个确切的代码以前总是有效的 甚至在其他方法中也有效 但我突然开始收到此错误 ActionController UnknownFormat in MoviesController vote
  • jQuery 选择框 .val('') 行为从 1.9 到 1.10+ 不同,最短的方法是什么[重复]

    这个问题在这里已经有答案了 jQuery 1 9 和 1 10 之间的以下行为有所不同
  • 局部变量的 MAXRECURSION 值

    我正在 SQL Server 2005 中编写一个存储过程 它声明一个名为 CTE 公用表表达式 foo foo递归地调用自身 但当 SP 的参数之一 bar 一片空白 为了停止这个无限循环 我一直在尝试使用该选项MAXRECURSION
  • 使用 JavaScript 从 Dropbox 下载文件

    I have 我有一个网站正在尝试向客户提供一项服务 以便能够从 Dropbox 下载文件 为了简化开发 我使用Dropbox 选择器 https www dropbox com developers chooser 为此 我启用了我希望从
  • 如何添加元组

    我有这样的伪代码 if b lt a return 1 0 foo a b b 我想用Python写它 但是Python可以添加元组吗 编写类似代码的最佳方法是什么 我会去 gt gt gt map sum zip 1 2 3 4 4 6
  • Clojure / Incanter 中的快速矢量数学

    我目前正在研究 Clojure 和 Incanter 作为 R 的替代品 并不是说我不喜欢 R 而是尝试新语言很有趣 我喜欢 Incanter 并且发现语法很有吸引力 但相比之下 矢量化操作相当慢例如到 R 或 Python 作为一个例子