- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在发布 here 和 here 的多元正态分布的 rcpp
实现的基础上,在 R 中实现多元正态分布的一阶导数。
这是一个快速的 R 实现
mvnormDeriv = function(..., mu=rep(0,length(list(...))), sigma=diag(length(list(...)))) {
if(sd(laply(list(...),length))!=0)
stop("The vectors not same length.")
fn = function(x) -1 * c((1/sqrt(det(2*pi*sigma))) * exp(-0.5*t(x-mu)%*%solve(sigma)%*%(x-mu))) * solve(sigma,(x-mu))
out = t(apply(cbind(...),1,fn))
colnames(out) = c('x', 'y')
return(out[,1])
}
和一些带有benchmark的测试数据:
set.seed(123456789)
sigma = rWishart(1, 2, diag(2))
means = rnorm(2)
X = rmvnorm(10000, means, sigma[,,1])
x1 = X[,1]
x2 = X[,2]
benchmark(mvnormDeriv(x1,x2,mu=means,sigma=sigma),
order="relative", replications=5)[,1:4]
公式可以在matrix cookbook (2012)中找到,公式346。
我未能从 here 修改多元法线的 rcpp
实现。这是一些我曾经尝试过的代码
// [[Rcpp::export]]
arma::vec dmvnormDeriv_arma(arma::mat x, SEXP mu_sexp, arma::mat sigma, bool log = false) {
// create Rcpp vector and matrix from SEXP arguments
Rcpp::NumericVector mu_rcpp(mu_sexp);
// create views for arma objects(reuses memory and avoids extra copy)
arma::vec mu_vec(mu_rcpp.begin(), mu_rcpp.size(), false);
arma::rowvec mu(mu_rcpp.begin(), mu_rcpp.size(), false);
// return(mu_vec);
arma::vec distval = Mahalanobis(x, mu, sigma);
double logdet = sum(arma::log(arma::eig_sym(sigma)));
double log2pi = std::log(2.0 * M_PI);
arma::vec val = exp(-( (x.n_cols * log2pi + logdet + distval)/2));
// x.each_row() -= mu;
// arma::vec val2 = solve(sigma, x.row(1));
// arma::vec retval = -1 * val(1) * solve(sigma, x.row(1)-mu_vec);
return(val);
}
当然,这还不完整。关于如何在 rcpp
或 Armadillo
中实现 * solve(sigma,(x-mu))
部分的任何想法?我在处理不同变量类型和为 x 的每一行运行求解时遇到问题。
最佳答案
这是一个基于RcppArmadillo
的解决方案。它比 R 实现快 100 多倍。首先是c++实现,它依赖于this rcpp gallery example。
// [[Rcpp::export]]
arma::mat dmvnormderiv_arma(arma::mat x, arma::rowvec mean, arma::mat sigma, bool log = false) {
// get result for mv normal
arma::vec distval = Mahalanobis(x, mean, sigma);
double logdet = sum(arma::log(arma::eig_sym(sigma)));
double log2pi = std::log(2.0 * M_PI);
arma::vec mvnorm = exp(-( (x.n_cols * log2pi + logdet + distval)/2));
// create output matrix with one column for each derivative
int n = x.n_rows;
arma::mat deriv;
deriv.copy_size(x);
for (int i=0; i < n; i++) {
deriv.row(i) = -1 * mvnorm(i) * trans(solve(sigma, trans(x.row(i) - mean)));
}
return(deriv);
}
还有两个 R 实现。一种是纯 R 语言,另一种是基于 mvtnorm
包中的 dmvnorm
。
library('RcppArmadillo')
library('mvtnorm')
library('rbenchmark')
sourceCpp('mvnorm.cpp')
mvnormDeriv = function(X, mu=rep(0,ncol(X)), sigma=diag(ncol(X))) {
fn = function(x) -1 * c((1/sqrt(det(2*pi*sigma))) * exp(-0.5*t(x-mu)%*%solve(sigma)%*%(x-mu))) * solve(sigma,(x-mu))
out = t(apply(X,1,fn))
return(out)
}
dmvnormDeriv = function(X, mean, sigma) {
if (is.vector(X)) X <- matrix(X, ncol = length(X))
if (missing(mean)) mean <- rep(0, length = ncol(X))
if (missing(sigma)) sigma <- diag(ncol(X))
n = nrow(X)
mvnorm = dmvnorm(X, mean = mean, sigma = sigma)
deriv = array(NA,c(n,ncol(X)))
for (i in 1:n)
deriv[i,] = -mvnorm[i] * solve(sigma,(X[i,]-mean))
return(deriv)
}
最后是一些基准测试:
set.seed(123456789)
sigma = rWishart(1, 2, diag(2))[,,1]
means = rnorm(2)
X = rmvnorm(10000, means, sigma)
benchmark(dmvnormderiv_arma(X,means,sigma),
mvnormDeriv(X,mu=means,sigma=sigma),
dmvnormDeriv(X,mean=means,sigma=sigma),
order="relative", replications=5)[,1:4]
test replications elapsed
1 dmvnormderiv_arma(X, means, sigma) 5 0.016
3 dmvnormDeriv(X, mean = means, sigma = sigma) 5 2.118
2 mvnormDeriv(X, mu = means, sigma = sigma) 5 5.939
relative
1 1.000
3 132.375
2 371.187
关于r - 具有 rcpp 和 RcppArmadillo 的多元正态/高斯的一阶导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18675848/
我有一个随时间变化的数据流。如何使用 C# 确定变化率? 自从上微积分课已经很长时间了,但现在是我第一次真正需要它(15 年来)。现在,当我搜索“衍生品”这个词时,我会得到金融方面的东西,以及我认为并
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
我曾经使用这个公式来计算每秒记录的信号的导数,然后对其应用滚动平均值。 df.rolling(rollingWindow, center=True).mean().diff(rollingWindow
通过这里的一些帮助,我想出了一个函数,它似乎将索贝尔导数应用于 X 方向的图像 F(x,y) = F(x+1,y) - F( x,y)我无法使用任何 OpenCV 函数,并且我需要 2D 输出数组比
对于神经网络库,我实现了一些激活函数和损失函数及其衍生物。它们可以任意组合,输出层的导数只是损失导数和激活导数的乘积。 但是,我未能独立于任何损失函数实现 Softmax 激活函数的导数。由于归一化,
我要在使用 ReLU 的神经网络上进行反向传播。 在我之前的一个项目中,我在一个使用 Sigmoid 激活函数的网络上做了,但现在我有点困惑,因为 ReLU 没有导数。 这是一个 image关于 we
我的任务是制作自己的 Sobel 方法,而不是使用 OpenCV 中的 cv::Sobel。我尝试实现我在 Programming techniques 找到的一个 但是,当我运行该程序时,cv::M
我愿意计算一个不完全明确的函数的 Frechet/Gateaux 导数,我的问题是:最有效的方法是什么?您会推荐我使用哪种语言? 准确地说,我的问题是我有一个函数,比如 F,它是多维函数对(即从 R^
我想使用 Flux.jl 绘制函数及其梯度和 Plots.jl using Flux.Tracker using Plots f(x::Float64) = 3x^2 + 2x + 1 df(x::F
我已将 ReLu 导数实现为: def relu_derivative(x): return (x>0)*np.ones(x.shape) 我也尝试过: def relu_derivativ
我几乎没有关于 Scharr 导数及其 OpenCV 实现的问题。 我对具有 (3X3) 内核的二阶图像导数感兴趣。我从 Sobel 二阶导数开始,它未能在图像中找到一些细线。看完this page底
import numpy as np def relu(z): return np.maximum(0,z) def d_relu(z): z[z>0]=1 z[z 0).as
你好,我用 C++ 创建了一个小的运动模拟。我想向学生展示 Euler、Runge-Kutta 和 MidPoint 方法之间的差异,有些 Material 点在撞击球体时会移动和反弹。 但是当我切换
或者,目标:如何以声明方式从 Nix 不稳定中获取单个包? 我是 NixOS 的新手,目前正在尝试安装比默认版本更新的 Consul 0.5.2我的 NixOS 版本(最新稳定版)。我正在尝试通过覆盖
我已经为此苦苦挣扎了很长一段时间。我想要的只是一个 torch.diff() 函数。然而,许多矩阵运算似乎并不容易与张量运算兼容。 我已经尝试了大量不同的 pytorch 操作组合,但它们都不起作用。
我试图了解如何在 Swift 中创建 Vector,因为当我执行 CGVectorMake() 时,它告诉我将 dx 和 dy(导数)作为 CGFloat 传递。如何创建仅包含该信息的向量(线)? 谁
我希望你能帮助我。 我正在使用 QT 并尝试对图像的边缘进行简单检测。但是当我启动时我的程序崩溃了 cv::GaussianBlur( src, src, cv::Size(3,3), 0, 0, c
我正在计算信号的一阶和二阶导数,然后进行绘图。我选择了在 SciPy(信号模块)中实现的 Savitzky-Golay 滤波器。我想知道是否需要缩放输出 - 在同一过滤器的 Matlab 实现中,指定
我是一名优秀的程序员,十分优秀!