有序聚类的matlab实现

有序聚类(自用笔记)

原理

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

在这里插入图片描述

关欢迎指导交流学习在这里插入图片描述

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨海深

感谢您的支持和鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值