有序聚类(自用笔记)
Matlab代码如下
1. 当分割点为2个时(想分成3段)
%% 此程序用于若将一个一维序列按照有序聚类中离差最小的方式进行分割成3段,确定分段点的位置;
%
data = inputdata; % inputdata 是需要输入的数据
[aa,bb]=size(data); %
vt=zeros(bb,aa-2,aa-1);
vt_sum=inf*ones(aa-2,aa-1);
%突变
for m=1:bb
for xti=1:aa-2
for xtj=xti+1:aa-1
x1=data(1:xti,m);
x2=data(xti+1:xtj,m);
x3=data(xtj+1:aa,m);
vt1=var(x1)*length(x1);
vt2=var(x2)*length(x2);
vt3=var(x3)*length(x3);
vt(m,xti,xtj)=vt1+vt2+vt3;
end
end
end
for m=1:bb
for xti=1:aa-2
for xtj=xti+1:aa-1
vt_sum(xti,xtj)=sum(vt(:,xti,xtj));
end
end
end
[Vtmin_column,index_row]=min(vt_sum);
[Vtmin_row,index_column]=min(Vtmin_column);
Vtmin=Vtmin_row;
index=[index_row(index_column),index_column];
disp(['第一分节点为 ',num2str(index(1))])
disp(['第二分节点为 ',num2str(index(2))])
disp(['对应最小离差为 ',num2str(Vtmin)])
- 不妨简单试验一下
inputdata = [1 1 1 1 3 3 3 3 3 9 9 9 9]; % 理论上分割点为{1-4}, {5-9}, {10-13}
inputdata = inputdata’; % 输入的需要时列向量
计算结果为:
第一分节点为 4
第二分节点为 9
对应最小离差为 0
2. 当分割点只有1个时(想分成2段)
data = inputdata; % inputdata 是需要输入的数据
M=length(data);
Sn = inf*ones(M,1);
for s = 1 : M
x1 = data(1: s);
x2 = data(s+1:end);
v1 = var(x1)*length(x1);
v2 = var(x2)*length(x2);
Sn(s) = v1 + v2;
end
[m, n] = min(Sn)
disp(['最优分割点为', num2str(n)]);
disp(['最有分割时对应的离差为', num2str(m)]);
- 简单试验一下
inputdata = [1 1 1 1 1 9 9 9]; % 理论上分割点为{1-5}, {6-8}
inputdata = inputdata’; % 输入的需要时列向量
计算结果为:
最优分割点为5
最有分割时对应的离差为0
关欢迎指导交流学习