Bootstrap

Fisher最优分割算法(附带MATLAB程序与java程序)

matlab程序如下:

function [LP,J]=lp(X)
%  LP对有序样品向量X进行最优分割
%  语法 LP=lp(X)
%  X─从小到大排列的有序数据向量
%  LP─分类损失函数值
%  J─最优分割点

n=length(X);
D=zeros(n,n);
LP=zeros(n,n-1);
J=zeros(n,n-1);
for i=1:n-1
    for j=2:n
        if(i<j)
            sx=0;
            d=0;
            for t=i:j
                sx=sx+X(t);
            end
            meanx=sx/(j-i+1);
            for k=i:j
                d=d+(X(k)-meanx).^2;
            end
            D(j,i)=d;
        end
    end
end
for k=2:n-1
    for p=3:n
        if(k<p)
            min=9999;
            minj=0;
            if(k==2)
                for j=2:p
                    temp=D(j-1,1)+D(p,j);
                    if(temp<min)
                        min=temp;
                        minj=j;
                    end
                end
            else
                for j=k:p
                    temp=LP(j-1,k-1)+D(p,j);
                    if(temp<min)
                        min=temp;
                        minj=j;
                    end
                end
            end
            LP(p,k)=min;
            J(p,k)=minj;
        end
    end
end
LP=LP(end,:);
J = unique([unique(J(:,2))',unique(J(end,:))]);

java程序如下:

 /**
     * fisher最优分割算法
     *
     * @param pair 样本对
     * @return 聚类结果
     */
    private static List<List<String>> fisher(Map<String, Double> pair) {
   
        //1、对样本序列排序
        List<Double> collect = pair.values().stream().sorted().collect(Collectors.toList());
        //2、fisher最优分割,获取最优分割点
        Set<Integer> fisher = fisher(collect);
        ArrayList<List<String>> category = new ArrayList<>();
        //3、拿到最优分割点,遍历拿到所有的聚类
        List<Integer> collect2 = new ArrayList<>(fisher);
        for (int i = 0; i < fisher.size() 
;