|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- function [candidatesAffinity] = CalcMissPHsAffinityByAttributes(candidates, averageTop, data, attData, last_known_node, addMissingAtt, threshold)
- % sigal 29.10.13
- % based on CalcAttributesAffinity_S5
-
- n = size(data,1);
- numAtt = size(attData,2);
- firstPH = last_known_node+1;
- numPHs = size(data,1) - firstPH +1;
-
- if firstPH > n
- LogMsg(sprintf('*** ERROR: CalcPHsAffinityByAttributes firstPH %d >size %d.',firstPH, n));
- return
- end
-
-
- if addMissingAtt > 0 && last_known_node < n
- attData = AddMissingNodesAttrFromNeighborsNeighbors(data, attData, last_known_node, addMissingAtt);
- end
-
- candidatesInd = find(candidates>0);
- totalInd = [candidatesInd,firstPH:size(data,1)];
- attData = attData(totalInd,:);
- totalNum = size(attData,1);
-
- count = sum(attData,2);
- nnz_n = nnz(count);
- nnz_p = 100*nnz_n/totalNum;
- LogMsg(sprintf('PHsAttAffinity count (%d, %.3f) - nnz=%d, %7.5f%%',numAtt,threshold,nnz_n, nnz_p));
-
- % full calculation
- common = attData*attData';
- affinity = zeros(totalNum,totalNum);
- for i=1:totalNum
- for j=1:totalNum
- val = common(i,j);
- total = count(i)+count(j)-val;
- if total > 0 && val/total > threshold
- affinity(i,j) = val/total;
- end
- end
- end
-
- nnz_n = nnz(affinity);
- nnz_p = 100*nnz_n/(totalNum*totalNum);
- LogMsg(sprintf('PHsAttAffinity totalC (%d, %.3f) - nnz=%d, %7.5f%%',numAtt,threshold,nnz_n,nnz_p));
-
- clear('common');
- clear('count');
-
- candidatesNum = nnz(candidatesInd);
- candidatesAffinity = zeros(1, size(candidates,2));
-
- for i=1:candidatesNum
- sortedA = sort(affinity(i,:),'descend');
- val = sum(sortedA(1:averageTop),2)/averageTop;
- candidatesAffinity(1,candidatesInd(1,i)) = val;
- end
-
- clear('affinity');
- end %function
|