当前位置: 首页 > article >正文

数学建模强化宝典(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最优分割法是一种有效的有序样品聚类方法,它通过最小化损失函数来找到最优的分割方式,为数据分析和决策提供了有力的支持。

 结语  

勇气不是没有恐惧

而是尽管害怕也依然前行

!!!


http://www.kler.cn/a/293178.html

相关文章:

  • 标准C++ 字符串
  • 【插件】多断言 插件pytest-assume
  • MoneyPrinterTurbo – 开源的AI短视频生成工具
  • 时间管理的三个痛点
  • 使用Python实现定期从API获取数据并存储到数据库的完整指南
  • Scala入门基础(17.1)Set集习题
  • 电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法
  • JS生成二维码QRCode代码
  • EI会议推荐-第二届大数据与数据挖掘国际会议(BDDM 2024)
  • 地平线SuperDrive首秀:千人研发投入,出场即「比肩第一梯队」
  • C++ STL-List容器概念及应用方法详解
  • 如何优化Oracle数据库的SQL性能?
  • MySQL5.7.36之高可用架构部署-MHA-VIP漂移
  • 【无标题】一起学习LeetCode热题100道(67/100)
  • Pikachu靶场之RCE漏洞详解
  • 通义灵码助力高校开学第一课,“包”你满意,新学期加油!
  • 后端开发面经系列--快手音视频C++开发
  • 集成电路学习:什么是RAM随机存取存储器
  • 【时时三省】(C语言基础)指针进阶 例题3
  • C++身份证实名认证-实名制-身份证三要素认证-身份认证-身份验真-接口
  • Proxifier代理配置
  • 【奔驰中国-注册安全分析报告】
  • 机器学习-33-机理模型和非机理模型
  • 【Focal Loss 本质】
  • 【开源免费】基于SpringBoot+Vue.JS在线竞拍系统(JAVA毕业设计)
  • 加载SQLite扩展的db.loadExtension方法