我对Rcpp有一些奇怪的麻烦 - 它使用了不可预测的C++编译器.这个问题有点类似于这个问题.
我在OSX上,我有2个编译器 - 默认clang和openmp clang-omp支持.我也有以下~/.R/Makevars文件(我设置clang-omp为默认编译器):
CC = clang-omp
CXX = clang-omp ++
CFLAGS + = -O3 -Wall -pipe -pedantic -std = gnu99
CXXFLAGS + = -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp
问题是,我正在开发的软件包编译而clang++不是clang-omp++.我也尝试过(作为实验来解决问题)更改包src/Makevars和设置CXX=clang-omp++以及修改后的$R_HOME/etc/Makeconf CXX条目CXX = clang-omp++.没有运气 - 它仍然可以编译clang++.不知道为什么会这样.
这里也是小的可重现的(来自控制台R和来自Rstudio)的例子(不知道它是否与上面的问题有关).假设2个非常相似的cpp函数:
1.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
} …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的矩阵我试图在具有足够内存的服务器上运行glmnet.它甚至在非常大的数据集上工作到一定程度,之后我得到以下错误:
Error in elnet(x, ...) : long vectors (argument 5) are not supported in .C
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,这是由R的限制引起的,R不能有任何长度超过INT_MAX的向量.那是对的吗?有没有可用的解决方案,不需要完全重写glmnet?任何替代R解释器(Riposte等)是否解决了这个限制?
谢谢!
我正在使用 GloVe 词嵌入将文本数据的分类模型分为两类(即将每个评论分为两类)。我有两列,一列包含文本数据(评论),另一列是二进制目标变量(评论是否可操作)。我能够使用 text2vec 文档中的以下代码为文本数据生成 Glove 词嵌入。
glove_model <- GlobalVectors$new(word_vectors_size = 50,vocabulary =
glove_pruned_vocab,x_max = 20L)
#fit model and get word vectors
word_vectors_main <- glove_model$fit_transform(glove_tcm,n_iter = 20,convergence_tol=-1)
word_vectors_context <- glove_model$components
word_vectors <- word_vectors_main+t(word_vectors_context)
Run Code Online (Sandbox Code Playgroud)
如何构建模型并生成对测试数据的预测?
我正在R中构建一个语言模型,根据前面的单词预测句子中的下一个单词.目前我的模型是一个简单的ngram模型,带有Kneser-Ney平滑.它通过在训练集中找到具有最大概率(频率)的ngram来预测下一个字,其中平滑提供了一种内插低阶ngrams的方法,这在高阶ngram具有低频率并且可能不提供可靠预测的情况下是有利的. .虽然这种方法工作得相当好,但是在n-gram无法捕获上下文的情况下它会失败.例如,"外面温暖而阳光充足,让我们去......"和"外面寒冷和下雨,让我们去......"将提出相同的预测,因为没有捕捉到天气的背景在最后的n-gram中(假设n <5).
我正在寻找更高级的方法,我找到了text2vec包,它允许将单词映射到向量空间,其中具有相似含义的单词用相似(近似)向量表示.我有一种感觉,这种表示可能有助于下一个单词预测,但我无法弄清楚如何定义训练任务.我的问题是,如果text2vec是用于下一个单词预测的正确工具,如果是,那么可以用于此任务的合适预测算法是什么?
我有相当大的稀疏矩阵(dgCMatrix或dgTMatrix,但这在这里不是很重要)。我想将某些元素设置为零。
例如,我有一个3e4 * 3e4矩阵,该矩阵是上三角形,并且非常密集:〜23%的元素不是零。(实际上,我有更大的矩阵〜1e5 * 1e5,但是它们更稀疏了)因此,以三重态的dgTMatrix形式需要大约3.1gb的RAM。现在,我想将小于某个阈值(例如1)的所有元素设置为零。
非常幼稚的做法(这还讨论这里)将以下内容:
threshold <- 1
m[m < threshold] <- 0
Run Code Online (Sandbox Code Playgroud)
但是,该解决方案远非完美-130秒的运行时间(在具有足够内存的机器上,因此没有交换),更重要的是需要25-30gb的额外RAM。
我发现的第二个解决方案(并且大部分是满意的)更加有效-从头开始构建新矩阵:
threshold <- 1
ind <- which(m@x > threshold)
m <- sparseMatrix(i = m@i[ind], j = m@j[ind], x = m@x[ind],
dims = m@Dim, dimnames = m@Dimnames,
index1 = FALSE,
giveCsparse = FALSE,
check = FALSE)
Run Code Online (Sandbox Code Playgroud)
它需要仅〜6秒和需要5GB〜额外 RAM。
问题是-我们可以做得更好吗?尤其有趣的是,是否可以用更少的RAM使用率来做到这一点?如果能够就地执行此操作,那将是完美的。
text2vec包中的LDA主题建模非常棒.它确实比topicmodel快得多
但是,我不知道如何获得每个文档属于每个主题的概率,如下例所示:
V1 V2 V3 V4
1 0.001025237 7.89E-05 7.89E-05 7.89E-05
2 0.002906977 0.002906977 0.014534884 0.002906977
3 0.003164557 0.003164557 0.003164557 0.003164557
4 7.21E-05 7.21E-05 0.000360334 7.21E-05
5 0.000804433 8.94E-05 8.94E-05 8.94E-05
6 5.63E-05 5.63E-05 5.63E-05 5.63E-05
7 0.001984127 0.001984127 0.001984127 0.001984127
8 0.003515625 0.000390625 0.000390625 0.000390625
9 0.000748503 0.000748503 0.003742515 0.003742515
10 0.000141723 0.00297619 0.000141723 0.000708617
Run Code Online (Sandbox Code Playgroud)
这是text2vec lda的代码
ss2 <- as.character(stressor5$weibo)
seg2 <- mmseg4j(ss2)
# Create vocabulary. Terms will be unigrams (simple words).
it_test = itoken(seg2, progressbar = FALSE)
vocab2 …Run Code Online (Sandbox Code Playgroud)