在MATLAB中实现均值变点法

这篇博客介绍了如何利用Matlab自行编写代码来运用均值变点法确定非线性函数的突变点,特别是在寻找地形坡度起伏度的最优分化单元格大小时。博主首先计算总体数据的方差,然后通过不断分割数据并计算两侧部分的方差和,找出方差和与总体方差差值最大的点作为拐点。提供的Matlab代码清晰易懂,适用于处理类似问题。
摘要由CSDN通过智能技术生成

第一次发CSDN,起因是做地形坡度起伏大小寻找最优分化单元格大小时,需要使用均值变点法对非线性拟合的函数求取其变化趋势的拐点。

但是在搜索网上后,并没有找到相应的代码,SPSS程序也没有相应的直接函数能够计算,故用Matlab自己编写了该代码,保证清晰易懂。以地势起伏度为例。

我们分为以下几步:

1.计算总体数据的方差

2.将一组数从第二个数开始,将其分为两部分,分别计算两部分的方差,并将两部分方差相加

3.分别计算总体数据的方差与(第二部得到的每次方差和)的差

4.寻找值最大的拐点,即为原非线性函数的突变点

-----------------------------------------注意----------------------------------------

例子中读取的表格和数据个数请根据自身情况酌情修改!!!

---------------------------------------------------------------------------------------

%读取单元起伏度,共18个数据
num = xlsread('D:\demDATA\统计结果.xlsx','D2:D19');%单元面积起伏度
cell = xlsread('D:\demDATA\统计结果.xlsx','A2:A19');%格网大小

%计算总体平均值、方差
S = 0,xall = 0;
xall= mean(num);
for i = 1:18
    S = S + (num(i)-xall)^2
end

%计算均值变点法差值

%为保证后面下标统一,创建数组长度为18
A = zeros(1,18),B = zeros(1,18);%A为分割左侧总方差,B为分割右侧总方差
x1 = zeros(1,18),x2 = zeros(1,18);%x1为分割左侧平均值,x2为分割右侧平均值
vari = zeros(1,18),diff = zeros(1,18);%vari为两侧方差和,diff为总方差与每组方差和的差值
for i = 2:18
    x1(i) = mean (num(1:i-1)),x2(i) = mean (num(i:18));
    for j = 1:i-1
        A(i) = A(i) + (num(j)-x1(i))^2
    end
    for k = i:18
        B(i) = B(i) + (num(k)-x2(i))^2
    end
    vari(i) = A(i) + B(i);
    diff(i) = S - vari(i);
end

scatter(cell,diff),hold on,plot(cell,diff);
xlabel('格网大小'),ylabel('S-Si'),axis([3 37 0 130]);

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值