1

我正在编写代码来检测使用高斯分布的异常。异常检测

这是我写来计算概率密度函数的代码:

function p = multivariateGaussian(X, mu, Sigma2) 
%MULTIVARIATEGAUSSIAN Computes the probability density function of the 
%multivariate gaussian distribution. 
% p = MULTIVARIATEGAUSSIAN(X, mu, Sigma2) Computes the probability 
% density function of the examples X under the multivariate gaussian 
% distribution with parameters mu and Sigma2. If Sigma2 is a matrix, it is 
% treated as the covariance matrix. If Sigma2 is a vector, it is treated 
% as the \sigma^2 values of the variances in each dimension (a diagonal 
% covariance matrix) 
% 

k = length(mu); 

if (size(Sigma2, 2) == 1) || (size(Sigma2, 1) == 1) 
    Sigma2 = diag(Sigma2); 
end 

X = bsxfun(@minus, X, mu(:)'); 
p = (2 * pi)^(- k/2) * det(Sigma2)^(-0.5) * ... 
    exp(-0.5 * sum(bsxfun(@times, X * pinv(Sigma2), X), 2)); 

end 

我的第一个问题:是否有一个fastter和巧妙的方法来计算呢?我有一个小的matlab集群setuped在这里2个,但在这种情况下,我不知道如何并行化这个。

我的第二个问题:在我用作训练集的一个矩阵[42712X19700]中,即使有24GB的内存,我的内存出错也是如此。是否有可能使用像随机森林这样的技术(对训练集进行切片,然后将结果合并?)?或者以任何其他方式来规避这个问题?

我很感激任何帮助。提前Tks!

+0

我没有看到任何明显的速度改进,但是当您在这种尺寸的矩阵上进行操作时,向量化解决方案会吹掉内存很常见。逐行处理会成为解决方案吗? (如果是这样,你也可以很容易地将它包装在一个'parfor'循环中并行化) –

+0

什么是'训练'操作?设置mu和sigma?如果是这样,他们的足够的统计数据可以累计计算 –

+0

我回顾了用于计算的公式,正如本文所说,这是一个累计和!因此,如丹尼斯说的那样,将训练集分成大块并按照parfor计算是没有问题的! Tks家伙,问题解决了! –

回答

0

将数据分成小块并应用parfor处理每个块。这只是我选择大规模加工而已。或者您可能使用基于进程的并行化并读取一个块,因为另一个进程正在另一块数据上进行计算。