CRE_RB_and_CCRE/CCREClass.m
R.J. Renken 3998755f40 Allow for constant log(dFC) across bins. i.e. all bins will contain (approximately) and equal number of datum points.
In other words binsize for the refence is adapted such that the number of points per bin is equal.
2022-03-25 16:06:59 +01:00

88 lines
4.1 KiB
Matlab

classdef CCREClass<CREClass
%CCRECLASS calculate the Conditional Cummulative Residual Entropy
% This class uses the CREClass options
%
properties
%the data field inherited from the CREClass will contain the data
%to calculate the CCRE on.
%the nBin field inherited from the CREClass will contain the number
%of bins if UseHistProxy is set.
end
properties
DataRef %This parameter will contain the reference set.
nBinRef %number of "bins" to use for the reference distribution
CCRE %parameter containing the conditional Cumulative Residual Entropy
EquidistantBinFlag=true; % set to true to get equidistant bins, set to false to get equi-content bins,
% if set to false: each bin will contain (aproximately) an equal
% number of pixel values.
end
methods %constructor
function obj = CCREClass()
%CCRECLASS Construct an instance of this class
% Detailed explanation goes here
obj@CREClass;
end
end
methods %set and get functions
function set.DataRef(obj,val)
if isnumeric(val)
obj.DataRef=val;
else
error('please enter numeric array/matrix as reference');
end
end
function set.nBinRef(obj,val)
nBinFromCRE=obj.nBin; %park the current value of nBin
obj.nBin=val; %use the check system from CREClass
obj.nBinRef=obj.nBin;
obj.nBin=nBinFromCRE; %restore the current value of nBin
end
end
methods %user callable functions
%% CCRE A|B
%
% $$CCRE = \varepsilon (A) - E[\varepsilon(A|B)]$$
%
% $$\varepsilon(A) = -\sum_{\lambda}F_c^A(\lambda)logF_c(A^(\lambda)$$
% $$F_c^A(\lambda)=\int_{\lambda}^{\infty}p^A(l)dl$$
%
% $$E[\varepsilon(A|B)]= \sigma_{\kappa} p^B(\kappa)*\varepsilon(A|B)$$
%
% $$\varepsilon(A|B) = \sigma_{\lambda}F_c^{A|B}(\lambda)log
% F_c^{A|B}(\lambda)$$
%
% $$F_c^{A|B}(\lambda) = \int_{\lambda}^{\infty}p^{A,B}(l,k)/p^B(\kappa)dl$$
%
% see equation 7 in wan and Vemuri
function Calc(obj)
Calc@CREClass(obj); %calculate the CRE for the data.
if isempty(obj.DataRef);return;end %if no refdata given, return;
%calculate histogram for RefData
EVarEpsDataGivenRef=0; %clear previous calculations
if obj.EquidistantBinFlag
[pDataRef,E]=histcounts(obj.DataRef(:),obj.nBinRef,'Normalization','probability');
[JointHist,E1,E2]=histcounts2(obj.Data(:),obj.DataRef(:),[obj.nBin,obj.nBinRef],'Normalization','probability'); %obtain bin edges for Target
else
prc=linspace(0,100,obj.nBinRef+1); % define the edges of the bins as a precentile
Edges=prctile(obj.DataRef(:),prc);
[pDataRef,E]=histcounts(obj.DataRef(:),Edges,'Normalization','probability');
[JointHist,E1,E2]=histcounts2(obj.Data(:),obj.DataRef(:),[obj.nBin,obj.nBinRef],'Normalization','probability'); %obtain bin edges for Target
end
for k=1:numel(pDataRef) %loop over the bins in pDataRef NB: must be equal to the bins in JointHist for the Ref
if pDataRef(k)==0;continue;end% if no data at this line go to the next
ind=E(k)<=obj.DataRef(:)&obj.DataRef(:)<E(k+1); %get an index to all points in Ref data inside the current bin
CRE_DataGivenDataRef=CREClass;
CRE_DataGivenDataRef.Data=obj.Data(ind);
CRE_DataGivenDataRef.nBin=E1; %force the same bin definition for all itterations. This value is ignored if UseHistProxy is set to false
CRE_DataGivenDataRef.Calc;
EVarEpsDataGivenRef=EVarEpsDataGivenRef+pDataRef(k)*CRE_DataGivenDataRef.CRE; % I really have to check this line on merit.
end
obj.CCRE=obj.CRE-EVarEpsDataGivenRef;
end
end
end