数学建模强化宝典(14)Fisher 最优分割法

前言

       Fisher最优分割法是一种对有序样品进行聚类的方法,它在分类过程中不允许打破样品的顺序。这种方法的目标是找到一种分割方式,使得各段内样品之间的差异最小,而各段之间的差异最大。以下是关于Fisher最优分割法的详细介绍:

一、概念与原理

  • 定义:Fisher最优分割法通过对有序样品的离差平方和进行计算,确定最优的分类数,使得同类样本间的差异最小,各类别样本间的差异最大。
  • 核心指标:离差平方和(即组内样本的方差)是衡量同类样本之间差异程度的重要指标。
  • 优化目标:找到一种分割方法,使得损失函数(通常定义为各段离差平方和的总和)达到最小。

二、计算流程

Fisher最优分割法的计算流程大致如下:

  1. 数据准备:确保样品数据是有序的,并按顺序排列。
  2. 计算损失函数
    • 定义损失函数为各段离差平方和的总和。
    • 对于每个可能的分割点,计算将样品分割成若干段后的损失函数值。
  3. 寻找最优分割
    • 通过迭代计算,找到使损失函数达到最小的分割方法。
    • 通常采用动态规划的方法,从将全部样品视为一段开始,逐步增加分类数,直到找到最优解。
  4. 结果输出:输出最优分割的结果,包括分类数和各类的样品范围。

三、重要公式与递推关系

  • 离差平方和的计算:对于第k组样品{xi, xi+1, ..., xj},其离差平方和计算公式为:

    D(i,j)=sums=ij​[xs​−barx(i,j)]2

    其中,xˉ(i,j)是第k组样品的均值。
  • 损失函数的递推公式:用b(N,K)表示将N个有序样品分为K类的一种方法,定义损失函数为:

    L[b(N,K)]=k=1∑K​Dk​(i,j)

    则最优分割的损失函数可以写成递推形式:

    L[P(N,K)]=k≤j≤Nmin​{L[P(j−1,K−1)]+D(j,N)}

四、应用场景

       Fisher最优分割法在多个领域都有广泛的应用,特别是在需要对有序数据进行聚类的场景中。例如,在交通信控领域,可以使用Fisher最优分割法对交通流量数据进行时段划分,以便在不同时段采用不同的信号控制策略。此外,该方法还可以应用于金融数据分析、环境监测数据处理等领域。

五、优缺点

  • 优点
    • 能够保持样品的原始顺序,适合有序数据的聚类分析。
    • 通过最小化损失函数,能够得到较为合理的分类结果。
  • 缺点
    • 计算量较大,特别是对于大规模数据集。
    • 损失函数的定义和最优解的求解方法可能因具体问题而异,需要针对具体情况进行调整。

六、实现 

       以下是一个简化的MATLAB实现示例,用于演示Fisher最优分割法的基本思想。请注意,这个示例可能需要根据你的具体需求进行调整和优化。

function [cut_points, cost] = fisher_optimal_partitioning(data, K)  
    % 输入:  
    % data - 一维有序数据数组  
    % K - 分割成的段数  
    %  
    % 输出:  
    % cut_points - 分割点的索引(不包括最后一个点)  
    % cost - 最小损失函数值(段内方差之和)  
  
    n = length(data);  
    if K >= n  
        error('K must be less than the number of data points');  
    end  
  
    % 初始化  
    cost_matrix = inf(n-1, K); % 存储每个可能分割点的最小成本  
    cut_points_matrix = zeros(n-1, K); % 存储每个可能分割点的位置  
  
    % 计算所有可能的段内方差  
    segment_variances = zeros(n-1, 1);  
    for i = 1:n-1  
        mean_val = mean(data(1:i));  
        segment_variances(i) = sum((data(1:i) - mean_val).^2);  
    end  
  
    % 动态规划求解  
    for k = 1:K  
        for j = k:(n-1)  
            % 尝试所有可能的分割点  
            for i = (k-1):j-1  
                % 计算当前分割的成本  
                current_cost = cost_matrix(i, k-1) + segment_variances(j) - segment_variances(i);  
                  
                % 更新最小成本和分割点  
                if current_cost < cost_matrix(j, k)  
                    cost_matrix(j, k) = current_cost;  
                    cut_points_matrix(j, k) = i + 1; % 分割点索引(MATLAB索引从1开始)  
                end  
            end  
        end  
    end  
  
    % 提取最终分割点和总成本  
    [~, last_index] = min(cost_matrix(:, K));  
    cut_points = cut_points_matrix(last_index, 1:K-1);  
    cost = cost_matrix(last_index, K);  
  
    % 注意:cut_points给出的是段与段之间的分割点索引,不包括最后一个点  
end  
  
% 示例用法  
data = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89]; % 示例数据  
K = 3; % 分割成3段  
[cut_points, cost] = fisher_optimal_partitioning(data, K);  
disp(['分割点索引: ', num2str(cut_points)]);  
disp(['最小成本(方差之和): ', num2str(cost)]);

注意

  1. 这个示例中的“成本”是简单地使用段内方差之和来计算的,这在实际应用中可能不是最优的选择,具体取决于你的数据和需求。
  2. 这个实现假设数据已经是有序的。如果数据未排序,你需要在调用函数之前先对数据进行排序。
  3. 这个实现可能不是最高效的,特别是对于大数据集。在实际应用中,你可能需要考虑使用更高效的算法或数据结构来优化性能。
  4. segment_variances数组的计算方式在这个示例中是为了简化而设计的,它只计算了从数据开始到当前点的方差。在实际应用中,你可能需要更精确地计算每个段的方差。

总结 

       总的来说,Fisher最优分割法是一种有效的有序样品聚类方法,它通过最小化损失函数来找到最优的分割方式,为数据分析和决策提供了有力的支持。

 结语  

勇气不是没有恐惧

而是尽管害怕也依然前行

!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT 青年

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值