CRE_RB_and_CCRE/CCREClass.m

88 lines
4.1 KiB
Mathematica
Raw Normal View History

2020-02-21 08:24:58 +01:00
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
2020-02-21 08:24:58 +01:00
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.
2020-02-21 08:24:58 +01:00
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
2020-02-21 08:24:58 +01:00
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
2020-02-21 08:24:58 +01:00
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
2020-02-21 08:24:58 +01:00
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