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

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

 结语  

勇气不是没有恐惧

而是尽管害怕也依然前行

!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鲁棒优化 形象讲解 和库存管理鲁棒优化、生产线调度鲁棒优化、电力市场鲁棒优化、 物流优化鲁棒优化
  • 每日一题,力扣leetcode Hot100之238.除自身以外数组的乘积
  • 小散想在a股量化交易,怎么解决下单api问题
  • golang panic
  • 828华为云征文|部署RedisStack+可视化操作
  • springboot websocket 服务端
  • 计算机毕业设计Spark+PyTorch知识图谱房源推荐系统 房价预测系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习
  • 借助ChatGPT高效撰写优质论文的7大要素
  • 使用SQL语句查询MySQL数据表
  • ArcGIS出图格网小数位数设置
  • 仕考网:事业编考试考什么?
  • git or vscode-电脑电源断或者蓝屏-重启运行项目git报错-git : bad signnature 300000
  • Go语言开发用户登录功能基础设计
  • keepalived和lvs高可用集群
  • 【秋招笔试】9.07米哈游秋招改编题-三语言题解
  • @jsonView过滤属性
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Android Studio:GIT提交项目到远程仓库
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript实现分页效果
  • k8s如何管理Pod
  • KMP算法及优化
  • Nacos系列:Nacos的Java SDK使用
  • PermissionScope Swift4 兼容问题
  • Promise面试题2实现异步串行执行
  • Swift 中的尾递归和蹦床
  • vuex 学习笔记 01
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我建了一个叫Hello World的项目
  • 异步
  • 译有关态射的一切
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • linux 淘宝开源监控工具tsar
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 从如何停掉 Promise 链说起
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (6)添加vue-cookie
  • (C语言)球球大作战
  • (八)Spring源码解析:Spring MVC
  • (编译到47%失败)to be deleted
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十)c52学习之旅-定时器实验
  • (学习日记)2024.01.09
  • (一)kafka实战——kafka源码编译启动
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)VC++中ondraw在什么时候调用的
  • ../depcomp: line 571: exec: g++: not found
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 成都线下面基会拉开序幕