function [sim] = simRe1(A, B, AintersectB, AnotB, BnotA, distrib, inputsDistrib) %function [sim] = simRe1(AintersectB, AnotB, BnotA) % One form of calculating residual entropy similarity. % Assume A and B have the same distribution (ie distrib) % Inputs: % 1. AintersectB: common features between A and B % 2. AnotB: A's exclusive features % 3. BnotA: B's exclusive features % 4. distrib: distribution of the set of objects O % 5. inputsDistrib: parameters that describe the distribution % Outputs: % 1. residual entropy similarity value. d = length(AintersectB); max = 2 .^ d; probR = trueProbability(distrib, inputsDistrib); %disp(probR); %probR = [0.4 0.7 0.2 0.4]; HIntersect = 0; HA = 0; HB = 0; identical = 1; for l = 1:d if(AintersectB(l) == -1) identical = 0; end end for i=1:max bin = dec2bin(i-1, d); % We are only interested in r if it satisfies % AintersectB is in r flagInt = 0; flagA = 0; flagB = 0; prod1 = 1; prod2 = 1; prod3 = 1; for k = 1:d %if(A==B) %disp('k'); %disp(k); %disp('i'); %disp(i-1); %disp('A'); % disp(A); % end if(AintersectB(k) == -1 && flagInt == 0) %AintersectB doesnt have kth feature %if(A==B) disp('AintersectB doesnt have this feature'); %end if(bin2dec(bin(k)) == 1) prod1 = prod1 * probR(k); elseif(bin2dec(bin(k)) == 0) prod1 = prod1 * (1-probR(k)); end elseif(AintersectB(k) == bin2dec(bin(k)) && flagInt == 0) % if(A==B) disp('AintersectB is same as ri'); % end prod1 = prod1 * 1; else if(A==B) disp('AintersectB is not same'); end prod1 = 0; flagInt = 1; end if(AnotB(k) == -1 && flagA == 0) if(A==B) %disp('AnotB(k) == -1'); end % AnotB doesnt have kth feature if(bin2dec(bin(k)) == 1) prod2 = prod2 * probR(k); elseif(bin2dec(bin(k)) == 0) prod2 = prod2 * (1-probR(k)); end elseif(AnotB(k) == bin2dec(bin(k)) && flagA == 0) prod2 = prod2 * 1; else prod2 = 0; flagA = 1; end if(BnotA(k) == -1 && flagB == 0) % BnotA doesnt have kth feature if(bin2dec(bin(k)) == 1) prod3 = prod3 * probR(k); elseif(bin2dec(bin(k)) == 0) prod3 = prod3 * (1-probR(k)); end elseif(BnotA(k) == bin2dec(bin(k)) && flagB == 0) prod3 = prod3*1; else prod3 = 0; flagB = 1; end end %if(A == 0 && B == 4) disp(prod1); disp(prod2); disp(prod3); %end ent1 = 0; ent2 = 0; ent3 = 0; if(prod1 ~= 0) ent1 = prod1 * log(prod1); end if(prod2 ~= 0) ent2 = prod2 * log(prod2); end if(prod3 ~= 0) ent3 = prod3 * log(prod3); end HIntersect = HIntersect - ent1; HA = HA - ent2; HB = HB - ent3; %disp(bin2dec(bin)); %disp(prod1); %disp(prod2); %disp(prod3); %disp('**'); end %if(identical) % disp(HIntersect); % disp(HA); % disp(HB); %end if(A ~= B) disp('not equal'); disp('A'); disp(A); disp('B'); disp(B); disp(HIntersect); disp(HA); disp(HB); end if(A == B) disp('equal'); disp(HIntersect); disp(HA); disp(HB); end sim = -HIntersect + HA./2 + HB ./2;