0001 function [abscissa,f] = kernel_density_estimate(data,number_of_grid_points,bandwidth,kernel_function)
0002
0003
0004
0005
0006
0007
0008
0009
0010 if size(data,2) > 1 & size(data,1) == 1
0011 data = transpose(data);
0012 elseif size(data,2)>1 & size(data,1)>1
0013 error('kernel_density_estimate :: data must be a one dimensional array.');
0014 end
0015 test = log(number_of_grid_points)/log(2);
0016 if (abs(test-round(test)) > 10^(-12))
0017 error('kernel_density_estimate :: The number of grid points must be a power of 2.');
0018 end
0019
0020 n = size(data,1);
0021
0022
0023 if strcmpi(kernel_function,'gaussian')
0024 k = inline('inv(sqrt(2*pi))*exp(-0.5*x.^2)');
0025 elseif strcmpi(kernel_function,'uniform')
0026 k = inline('0.5*(abs(x) <= 1)');
0027 elseif strcmpi(kernel_function,'triangle')
0028 k = inline('(1-abs(x)).*(abs(x) <= 1)');
0029 elseif strcmpi(kernel_function,'epanechnikov')
0030 k = inline('0.75*(1-x.^2).*(abs(x) <= 1)');
0031 elseif strcmpi(kernel_function,'quartic')
0032 k = inline('0.9375*((1-x.^2).^2).*(abs(x) <= 1)');
0033 elseif strcmpi(kernel_function,'triweight')
0034 k = inline('1.09375*((1-x.^2).^3).*(abs(x) <= 1)');
0035 elseif strcmpi(kernel_function,'cosinus')
0036 k = inline('(pi/4)*cos((pi/2)*x).*(abs(x) <= 1)');
0037 end
0038
0039
0040 a = min(data) - (max(data)-min(data))/3;
0041 b = max(data) + (max(data)-min(data))/3;
0042 abscissa = linspace(a,b,number_of_grid_points)';
0043 d = abscissa(2)-abscissa(1);
0044 xi = zeros(number_of_grid_points,1);
0045 xa = (data-a)/(b-a)*number_of_grid_points;
0046 for i = 1:n;
0047 indx = floor(xa(i));
0048 temp = xa(i)-indx;
0049 xi(indx+[1 2]) = xi(indx+[1 2]) + [1-temp,temp]';
0050 end;
0051 xk = [-number_of_grid_points:number_of_grid_points-1]'*d;
0052 kk = k(xk/bandwidth);
0053 kk = kk / (sum(kk)*d*n);
0054 f = ifft(fft(fftshift(kk)).*fft([xi ;zeros(size(xi))]));
0055 f = real(f(1:number_of_grid_points));