通过输入的协方差快速缩放高斯核

时间:2015-07-18 16:35:51

标签: matlab multidimensional-array kernel-density

我目前正在摆弄使用Matlab估算水文数据集的概率密度函数(PDF)的多元核密度估计。我最熟悉使用高斯核的核密度估计,如Sharma(2000和2014)中所述(其中使用高斯参考规则(GRR)设置核带宽)。 GRR编写如下(Sharma,2000):

lambda_ref = GRR bandwidth of kernel, n is the sample size, and d is the dimensions of the data set we are using for density estimation

其中lambda_ref =内核的GRR带宽,n是样本大小,d是我们用于密度估计的数据集的维度。为了估计我们的数据集X的多变量密度,我们使用以下公式(Sharma,2000):

where lamda is the same as lamda_ref above, S is the sample covariance of X and det() stands for determinant

其中lamda与上面的lamda_ref相同,S是X的样本协方差,det()代表行列式。

我的问题是:我知道有很多"快速"计算由项exp()表示的高斯核函数的方法,例如这里提出的方法(使用Matlab):http://mrmartin.net/?p=218。由于我将使用样本量非常大的数据集(1000-10,000),我正在寻找快速代码。是否有人知道如何编写考虑样本协方差矩阵(S ^ -1)的倒数的第二个方程的快速代码?

我非常感谢能在这个问题上提供任何帮助。谢谢!

注意:

据我所知,有一个用于计算第二个等式的Matlab代码,在http://www.mathworks.com/matlabcentral/fileexchange/29039-mutual-information-2-variablle/content/MutualInfo.m中作为子函数找到。但是,这段代码在计算内核矩阵方面存在瓶颈。

参考文献:

1 A. Sharma,季节性降雨概率预测改善供水管理:第3部分 - 非参数概率预报模型,水文期刊,第239卷,第1-4期,2000年12月20日,页数249-258,ISSN 0022-1694,http://dx.doi.org/10.1016/S0022-1694(00)00348-6

2 Sharma,A。和R. Mehrotra(2014),一种信息理论替代方案,仅使用观测信息建模自然系统,Water Resour。 Res。,50,650-660,doi:10.1002 / 2013WR013845。

1 个答案:

答案 0 :(得分:0)

我找到了一个我能够为我的目的修改的代码。原始代码列在以下链接中:http://www.kernel-methods.net/matlab/kernels/rbf.m

代码

function K = rbf(coord,sig)

%function K = rbf(coord,sig)
%
% Computes an rbf kernel matrix from the input coordinates
%
%INPUTS
% coord =  a matrix containing all samples as rows
% sig = sigma, the kernel width; squared distances are divided by
%       squared sig in the exponent
%
%OUTPUTS
% K = the rbf kernel matrix ( = exp(-1/(2*sigma^2)*(coord*coord')^2) )
%
%
% For more info, see www.kernel-methods.net

%
%Author: Tijl De Bie, february 2003. Adapted: october 2004 (for speedup).

n=size(coord,1);
K=coord*coord'/sig^2;
d=diag(K);
K=K-ones(n,1)*d'/2;
K=K-d*ones(1,n)/2;
K=exp(K);

包含样本协方差缩放的修改代码:

xcov = cov(x.'); % sample covariance of the data
invxc = pinv(xcov); % inversion of data sample covariance
coord = x.';
sig = sigma; % kernel bandwidth
n = size(coord,1);
K = coord*invxc*coord'/sig^2;
d = diag(K);
K = K-ones(n,1)*d'/2;
K = K-d*ones(1,n)/2;
K = exp(K); % kernel matrix

我希望这可以帮助其他人解决同样的问题。