function distance=RankingDistance(ranking1,ranking2,distanceType,weight)
%ranking1为计算权值的基准
%kendall距离输出的是归一化后的距离
%footrule距离输出的是归一化后的距离
if nargin<4
weight=ones(size(ranking1));
end
Sweight=weightRerank(ranking1,weight);% - 按照排序顺序进行加权,靠前的序号和靠后的序号对结果影响程度不同
switch distanceType
case 1 %Spearman's footrule
distance=sum(abs(ranking1-ranking2).*Sweight,2)*2/(max(size(ranking1).^2));
case 2 %Spearman's footrule based 2-norm
distance=sum(((ranking1-ranking2).^2).*Sweight,2)*2/(max(size(ranking1).^2));
case 3 %Kendall Distance
%--------------------------------------------------------------------------
% %将全局排序位置转化为局部排序关系
% ranking1=RankingSort(ranking1);
% ranking2=RankingSort(ranking2);
%--------------------------------------------------------------------------
distance=KendallDistance(ranking1,ranking2);
end
end
function Sweight=weightRerank(ranking,weight)
[~,tmpRanking]=sort(ranking);
[~,intRanking]=sort(tmpRanking);
Sweight=ones(size(intRanking));
for i=1:size(intRanking,2)
Sweight(intRanking(i))=weight(i);
end
end
function distance=KendallDistance(ranking1,ranking2)
% if KendallErrDisp
% if max(size(unique(ranking1)))~=max(size(ranking1))||max(size(unique(ranking2)))~=max(size(ranking1))
% disp('排序有同序号项')
% end
% end
LengthOfRank=max(size(ranking1));
tmpDistance=0;
for i=1:LengthOfRank-1
for j=i+1:LengthOfRank
if (ranking1(i)>ranking1(j))&&(ranking2(i)>ranking2(j))
else if (ranking1(i)<ranking1(j))&&(ranking2(i)<ranking2(j))
else if (ranking1(i)==ranking1(j))&&(ranking2(i)==ranking2(j))
else
tmpDistance=tmpDistance+1;
end
end
end
% OrderJudge=(ranking1(i)-ranking1(j))*(ranking2(i)-ranking2(j));
% if OrderJudge<=0
% % if (ranking1(i)-ranking1(j))==0&&(ranking2(i)-ranking2(j))==0
% if (ranking1(i)-ranking1(j))==0||(ranking2(i)-ranking2(j))==0
% else
% tmpDistance=tmpDistance+1;
% end
% end
end
end
distance=tmpDistance*2/LengthOfRank/(LengthOfRank-1);
end