findsinglethreshold.m

来自「基于boosting的人脸检测的matlab实现」· M 代码 · 共 55 行

M
55
字号
%Finds the best threshold using only one feature per each vector, using
%multiclas weights

function [a,b,th,error]=findSingleThreshold(Data,Weights,z,positiveClasses)

[nfeat Nsamples]=size(Data);
    [Data, indData] = sort(Data);
    
    Weights=Weights/sum(sum(Weights));
    
    z = z(indData); Weights = Weights(:,indData);
    if size(positiveClasses,2)==1
        i = positiveClasses(1);
        SzW = cumsum(z.*Weights(i,:));
        EzW = SzW(end);
        SW  = cumsum(Weights(i,:));

        b = SzW ./ SW;
        zz = SW == 1;
        SW(zz) = 0;
        a = (EzW - SzW) ./ (1-SW) - b;
        SW(zz) = 1;
        Error = sum(Weights(i,:).*z.^2) - 2*a.*(EzW-SzW) - 2*b*EzW + (a.^2 +2*a.*b) .* (1-SW) + b.^2;
    else
        for i=1:size(positiveClasses,2)
            SzW(i,:) = cumsum(z.*Weights(i,:));

            SW(i,:)  = cumsum(Weights(i,:));        
        end

        SzW = sum(SzW);
        SW = sum(SW);
        EzW = SzW(end);
        
        b = SzW ./ SW;
        zz = SW == 1;
        SW(zz) = 0;
        a = (EzW - SzW) ./ (1-SW) - b;
        SW(zz) = 1;
        Error = sum(Weights(i,:).*z.^2) - 2*a.*(EzW-SzW) - 2*b*EzW + (a.^2 +2*a.*b) .* (1-SW) + b.^2;
    end


    [error, k] = min(Error);

    if k == Nsamples
        th = Data(k);
    else
        th = (Data(k) + Data(k+1))/2;
    end
    
    a=a(k);
    b=b(k);

    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?