Fisher最优分割法(附python实现)

1 最优分割法简介

最有分割法是对有序样品的一种聚类方法。当样品是按顺序排列,在分类中不允许打破样品的顺序。即 ,对 个有序样品进行分割,就可能有 种划分方法,这每一种分法称为一种分割。在所有的这些分割中,找到一种分割法,这种分割法使得各段内样品之间的差异最小,而各段之间的差异最大。这种对 个样品分段并使组内离差平方和最小的分割方法,称为最优分割法。段内数值变化可用变差或者极差来表示,比如样品段 变差:

 

表示样品段内样本间的差异情况,越小表示段内各样品之间差异性越小;因此,把 称为段直径。

2 Fisher最优分割法简介

Fisher最优分割法是用离差平方和来表示同类样本之间的差异程度,通过简便的计算步骤和作图,确定最优分类数,使同类样本间的差异最小,各类别样本间的差异最大,并用F检验法检验最优分类数的合理性。

设某一类 包含的样品有 ,记为 ,该类的均值向量   , , 表示这一类的直径,常用的直径有 ,当是单变量时,也可定义直径为­ 是中位数。

3 Fisher最优分割递推公式

表示将n 个有序样品分为 类的一种分法,定义损失函数为 ,当 固定时,越小表示各类的离差平方和越小,因此要寻找一种分法 ,使分类损失函数 达到最小,记为

递推公式:

             

公式含义:如果要找到n 个样品分为 个类的最优分割,应建立在将 个样品分为k-1 类的最优分割的基础上。

4 Fisher最优分割计算流程

若分类数 已知,求分类法 使它在损失函数意义下达最小,其求法如下:首先找分点 使递推公式达极小,即 。于是得第k 。然后找 ,使它满足 得到第 类。类似的方法一次可以得到所有类 ,这就是所求的最优解,即:

总之,为了求最优解,主要是计算 }

5 Fisher最优分割-Python完整代码

import numpy as np

def G(X, i, j):

    #tex:

    #$$ \overline{x_G}=\frac{1}{j-i+1}\sum^{j}_{t=i}X_t $$

    xg = 0

    for t in range(i-1, j):

        xg += X[t]

    xg /= (j - i + 1)

    return xg

def D(X, i, j):

    #tex:

    #$$ D(i,j)=\sum^{j}_{t=i}(X_t-\overline{x_G})'(X_t-\overline{x_G}) $$

    d = 0

    xg = G(X, i, j)

    for t in range(i-1, j):

        d += (X[t] - xg) ** 2

    return d

def Lq(X, N, K):

    #tex:

    #$$ L(b(n,k))=\sum^k_{i=1}D(i_t,i_{t+1}-1) $$

    #$$ \begin{equation} \left\{ \begin{array}{lr} L(p(n,2))=1 \\ L(p(n,k))=\underset{k \le j \le n}{min} D(1,j-1)+D(n,j) \end{array} \right. \end{equation} $$

    l = np.zeros((N+1, K+1))

    for n in range(1, N+1):

        l[n, 1] = D(X, 1, n)

    for k in range(2, K+1):

        for n in range(k, N+1):

            l[n, k] = min([l[j-1, k-1] + D(X, j, n) for j in range(k, n+1)])

    return l

def B(Lp):

    N = Lp.shape[0] - 1

    K = Lp.shape[1] - 1

    Bl = np.zeros(K+1)

    for k in range(1, K):

        Bl[k] = Lp[N, k] / Lp[N, k+1]

    return Bl

def split_class(X, K, l=None):

    if l is None:

        l = Lq(X, len(X), K * 2 + 1)

        Bl = B(l)

        for i in range(1, K):

            if Bl[i]-1 <= 0.05:

                K = i+1

                l = Lq(X, len(X), K * 2 + 1)

                break

    N = len(X)

    if K == 1:

        return []

    else:

        dist = np.array([abs(l[t-1, K-1] + D(X, t, N) - l[N, K]) for t in range(K, N+1)])

        t = list(range(K, N+1))[int(np.argmin(dist))]

        r = split_class(X[:t-1], K-1, l)

        r.append(t - 1)

        return r

直接调用split_class函数即可

6 Fisher最优分割-确定分类数K

分类个数的确定如果能从实际问题中首先确定当然最好,如果不能则可以从 随k的变化趋势图中找到拐点处,作为确定k的依据。当曲线拐点很平缓时,可选择的k较多,这时需要用其他方法来确定,如均方比法和特征根法。

稳定分类数可以这样定义: 当分类数小于此值时,  较大, 类内样本间的差别仍然显著, 需要继续再细分, 否则分类选取时, 代表性和信息量不能保证; 当分类数大于此值时, 类内样本间的差别已经不显著, 再细分的意义不大。稳定分类数代表了 值由较大值向较小值变化的转折点。按分类选取的原则在每一类中选取一个代表点, 则在优化布点时, 分类数应不小于稳定分类数, 才能保证优选点的代表性。

  • 12
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Fisher最优分割(Matlab)是一种模式识别应用中常用的算。它是对线性可分问题的非迭代解,通过将高维特征空间中的样本投影到一条直线上,实现从高维到一维的数据压缩。该算的核心思想是通过最大化类间距和最小化类内距的方式来确定最佳的投影方向。在投影后的直线上,如果训练样本具有很好的分布,则可以通过简单的操作实现对输入样本的分类。 为了获取最佳投影方向,Fisher最优分割引入了准则函数。其中,类间离散度和类内离散度是两个关键概念。类间离散度是指不同类别样本均值的差别应尽可能大,而类内离散度是指相同类别样本均值的方差应尽可能小。 在投影后的情况下,两个类别的类间离散度可以表示为投影后的均值差的平方,即∣m_yi−m_yj∣2=WTSbW。其中Sb是投影前两个类别的类间离散度矩阵。 因此,Fisher最优分割(Matlab)可以通过求解准则函数的最大值来确定最佳的投影方向。在实际应用中,可以使用Matlab代码来实现该算并进行分类任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Fisher最优求解算Matlab代码](https://download.csdn.net/download/a429051366/5907141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Fisher及其MATLAB实现](https://blog.csdn.net/weixin_41978683/article/details/106311802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Trisyp

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

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

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

打赏作者

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

抵扣说明:

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

余额充值