欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 数学建模强化宝典(14)Fisher 最优分割法

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

2024/10/25 8:14:57 来源:https://blog.csdn.net/m0_73399576/article/details/141907641  浏览:    关键词:数学建模强化宝典(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最优分割法是一种有效的有序样品聚类方法,它通过最小化损失函数来找到最优的分割方式,为数据分析和决策提供了有力的支持。

 结语  

勇气不是没有恐惧

而是尽管害怕也依然前行

!!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com