精华内容
下载资源
问答
  • 2021-06-17 08:24:24

     

    点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)

    目录

    高斯混合函数

    协方差矩阵

    什么是高斯混合模型(GMM)

    GMM原理

    高斯混合聚类模型伪代码

    MATLAB实现二维高斯混合模型分类的代码,并生成gif图描述收敛过程

    资源传送门

    「❤️ 感谢大家」


    高斯混合函数

    二维高斯混合函数,如(2)式所示。

    img (2)

    可以看出二维高斯混合模型,其中的d为数据的维度,在这里等于2;∑ 代表协方差矩阵,两行两列;这里的x以及μ都是二维的数据,用矩阵表示就是一行两列。

    协方差矩阵

    理解协方差矩阵的关键在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间。拿到一个样本矩阵,我们最先明确的是一行是一个样本还是一个维度(重要)。

    方差表示的是每个样本值与全体样本值的平均数之差的平方值的平均数,反映了一组数据的离散程度。

    img

    既然有了方差还要协方差干啥?显然,方差只能衡量一维数据的离散程度,对于二维数据,就用到了协方差,如下式所示。其中X,Y代表一组数据的两个维度。COV(X,Y)的值大于零,表示两个维度的数据成正相关,小于零则表示成负相关,等于零表示两个维度的数据相互独立。显然当X=Y时,COV(X,X)计算的就是方差。由协方差的定义可以得到COV(X,Y)=COV(Y,X)。

    img

    二维数据的协方差矩阵表示为 img,显然协方差矩阵为对角矩阵。

    三维数据的协方差矩阵表示为img,同理知道N维数据的协方差矩阵。

    什么是高斯混合模型(GMM)

     高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,通常用于解决同一集合下的数据包含多个不同的分布的情况,如解决分类情况

     如下图,明显分成两个聚类。这两个聚类中的点分别通过两个不同的正态分布随机生成而来。如果只用一个的二维高斯分布来描述图中的数据。这显然不太合理,毕竟肉眼一看就应该分成两类

    img

     

     但使用两个二维高斯分布来描述图中的数据,将两个二维高斯分布N(\mu_1,\sum_1),N(\mu_2,\sum_2)做线性组合,用线性组合后的分布来描述整个集合中的数据。这就是高斯混合模型(GMM)

    img

    GMM原理

     设有随机变量XX,则混合高斯模型可以这样表示:p(x) = \sum_{k=1}^{K}\pi_kN(x|\mu_k,\sum_k),其中N(x|\mu_k,\sum_k)称为混合模型中的第k个分量(component)。如前面图中的例子,有两个聚类,可以用两个二维高斯分布来表示,那么分量数K=2,\pi_k是混合系数(mixture coefficient),且满足:\sum_{k=1}^{K}\pi_k,0\leq\pi_k\leq 1,其中πk相当于每个高斯分布的权重

     

    GMM用于聚类时,假设数据服从混合高斯分布(Mixture Gaussian Distribution),例如上图的例子,很明显有两个聚类,可以定义K=2,那么对应的GMM形式如下:

    p(x) = \pi_1N(x|\mu_1,\sum_1) + \pi_2N(x|\mu_2,\sum_2)

     上式中未知参数有六个:(\pi_1,\mu_1,\sum_1, \pi_2,\mu_2,\sum_2),GMM聚类时分为两步,第一步是随机地在这K个分量中选一个,每个分量被选中的概率即为混合系数πk,可以设定π1=π2=0.5,表示每个分量被选中的概率是0.5,即从中抽出一个点,这个点属于第一类的概率和第二类的概率各占一半。但实际应用中事先指定πkπk的值是很笨的做法:当从图中的集合随机选取一个点,怎么知道这个点是来自N(x|\mu_1,\sum_1)还是N(x|\mu_2,\sum_2)呢?

     换言之怎么根据数据自动确定π1,π2的值?这就是GMM参数估计的问题。要解决这个问题,可以使用EM算法。通过EM算法,我们可以迭代计算出GMM中的参数:\pi_k,\mu_k,\sum_k

     

     我们目的是找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于:\prod_{i=1}^{N}p(x_i),我们把这个乘积称作似然函数 (Likelihood Function)。我们通常会对其取对数,把乘积变成加和:\sum_{i=1}^{N}logp(x_i),得到 log-likelihood function 。接下来将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),我们就认为这是最合适的参数,这样就完成了参数估计的过程。下面让我们来看一看 GMM 的 log-likelihood function :

    \sum_{i=1}^{N}log\{\sum_{i=1}^{K}\pi_kN(x_i|\mu_k,\sum_k)\}

     由于上式太复杂,没法直接用求导求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步

      1. 估计每个数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据xixi来说,它由第kk个 Component 生成的概率为:

    img

       由于式子里的\mu_k,\sum_k也是需要我们估计的值,我们采用迭代法,在计算\gamma(i,k)的时候我们假定\mu_k,\sum_k均已知,我们将取上一次迭代所得的值(或者初始值)

     

      2. 估计每个Component 的参数:现在我们假设上一步中得到的γ(i,k)就是正确的"数据xi由Component kk生成的概率",亦可以当做该Component 在生成这个数据上所做的贡献,或者说,我们可以看作xi这个数据其中有γ(i,k)xi这部分是由Component k所生成的,集中考虑所有的数据点,现在实际上可以看作Component 生成了\gamma(1,k)x_1,...,\gamma(N,k)x_N这些点,由于每个 Component 都是一个标准的 Gaussian 分布,可以很容易求出最大似然所对应的参数值:

    img

       其中N_k = \sum_{i=1}^{N}\gamma(i,k)并且πk也顺理成章地可以估计N_k/N

     

      3. 重复迭代前面两步,直到似然函数的值收敛为止

     

    高斯混合聚类模型伪代码

    输入:样本集D ={x1,x2,....xm}

        高斯混合成分个数k

    过程

        初始化高斯混合分布的模型参数{(ai,ui,∑i)} 三个参数含义:分别为混合系数,均值向量,协方差矩阵

        迭代:

        for j = 1,2,......,m do

            根据img计算xj的各混合成分生成的后验概率

            img pm等于上面那个式子

       end for

       for i =1,2,....k do

           计算新均值向量 img

           计算新协方差矩阵 img

           计算新混合系数 img

       end for

       将模型参数{(ai,ui,∑i)|1<=i<=k}更新为{(ai’,ui’,∑i’)|1<=i<=k}

    until 满足停止条件

    Ci = Ø (1<=i<=k)

    for j =1,2,...m do

        根据img(i=1,2,....k) 确定xj的簇标记λj (确定属于哪个i)

        将xj划分相应的簇:

    end for

    输出:簇划分c = {c1,c2.....ck}

    MATLAB实现二维高斯混合模型分类的代码,并生成gif图描述收敛过程

    % 高斯混合模型EM 算法参数估计示例
    % 输入 -----------------------------------------------------------------
    % data: N x D , N 个 dim 维的数据矩阵
    % Alpha: 1 x M  类的先验概率
    % Mu: M x D , M 个 Gauss分布的均值向量
    % Sigma: D x D x M , M 个Gauss分布的协方差矩阵
    % 输出 ----------------------------------------------------------------
    clc;
    clear;
    close all;
    %% 生成随机数据
    N=1000;
    alpha0 = [0.3 0.3 0.4];
    mu = [ -3 4; 0 0; 3 4];
    Sigma(:,:,1) = [ 2 0; 0 1];
    Sigma(:,:,2) = [ 2 0; 0 1];
    Sigma(:,:,3) = [ 2 0; 0 3];
    M = length(alpha0);
    R = mnrnd(N, alpha0);
    % Z 类别
    Z = [];
    for j = 1:M
        Z = [Z; ones([R(j) 1])*j];
    end
    data = zeros([N 2]);
    for j = 1:M
        data(Z == j,:) = mvnrnd(mu(j,:), Sigma(:,:,j), R(j));
    end
    %% EM算法
    prev_mu = [ -5 -1; -1 -1; 4 -1];
    %prev_mu = [ -3 0; 0 7; 6 0];
    %prev_mu=3*randn(3,2);
    prev_Sigma(:,:,1) = [ 1 0; 0 1];
    prev_Sigma(:,:,2) = [ 1 0; 0 1];
    prev_Sigma(:,:,3) = [ 1 0; 0 1];
    prev_alpha = ones([M 1])/M;
    MaxIter = 50;
    pxi = zeros([N M]);
    next_mu = zeros(size(prev_mu));
    next_Sigma = zeros(size(prev_Sigma));
    d = size(data,2);
    for t = 1:MaxIter
        if t > 1
            % Compute the porier probality
            for l = 1:M
                pxi(:,l) = mvnpdf(data,prev_mu(l,:), prev_Sigma(:,:,l));
            end
            pxi_sum = sum(pxi,2);
            pxi = pxi ./ repmat(pxi_sum,[1 3]);
            % update alpha^(i+1)
            next_alpha = sum(pxi)'/N;
            % update mu^(i+1)
            for l = 1:M
                next_mu(l,:) = sum(data .* repmat(pxi(:,l),[1 d])) / sum(pxi(:,l));
            end
            % update Sigma
            for l = 1:M
                zero_mean_data = data - repmat(next_mu(l,:),[N 1]);
                covariances = zeros([d d N]);
                for i = 1:N
                    covariances(:,:,i) = zero_mean_data(i,:)' * zero_mean_data(i,:) * pxi(i,l);
                end
                next_Sigma(:,:,l) = sum(covariances,3)/sum(pxi(:,l));
            end
            prev_mu     = next_mu;
            prev_Sigma  = next_Sigma;
            prev_alpha  = next_alpha;
        else
            next_mu     = prev_mu;
            next_Sigma  = prev_Sigma;
            next_alpha  = prev_alpha;
        end
        plot(data(Z==1,1), data(Z==1,2), 'o');
        hold on;
        plot(data(Z==2,1), data(Z==2,2), 'o');
        plot(data(Z==3,1), data(Z==3,2), 'o');
        axis([min(data(:,1)) max(data(:,1)) min(data(:,2)) max(data(:,2))]);
        % 生成高斯对象
        gmm_pdf = gmdistribution(next_mu,next_Sigma,next_alpha);
        % 高斯混合分布的函数
        ezcontour(@(u,v)pdf(gmm_pdf,[u v]));
        axis([min(data(:,1)) max(data(:,1)) min(data(:,2)) max(data(:,2))]);
        hold off;
        % gif 动图
        [em, map]= rgb2ind(frame2im(getframe), 256);
        if t == 1
            imwrite(em, map, 'em.gif', 'gif', 'Loopcount',inf, 'DelayTime',2)
        else
            imwrite(em, map, 'em.gif', 'gif', 'writeMode','append','DelayTime',0.2)
        end
        % waitforbuttonpress;
    end

    运行结果:

    高斯混合模型:EM 算法参数估计示例

    资源传送门

    • 关注【做一个柔情的程序猿】公众号
    • 在【做一个柔情的程序猿】公众号后台回复 【python资料】【2020秋招】 即可获取相应的惊喜哦!

    「❤️ 感谢大家」

     

    • 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
    • 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程
    更多相关内容
  • 二维云模型MATLAB

    2020-12-16 17:26:08
    使用MATLAB实现二维云模型标尺示意图,给出二维云模型6个参数EX,Ey,Enx,Eny,Hex,Hey,直接打开MATLAB软件加载运行
  • 该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。
  • 该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。该程序采用有限差分方法(隐式和显式)仿真了一维和二维域扩散方程。
  • 伊辛模型matlab代码2D-Ising-Model-Matlab 描述 在 Matlab 中使用 Monte Carlo 方法模拟 2D Ising 模型。 - 成都的账单 教程 该程序主要用于以Matlab 为主要应用程序来模拟二维Ising 模型。 我选择 Single-spin-flip...
  • 二维伊辛模型Matlab代码,可以给学习蒙特卡洛算法的同学们练手
  • 使用Fortran 90语言编写,使用蒙特卡洛模拟方法,对线度N=5,10,20,50,100的二维Ising自旋动力学模型进行模拟。该过程使用了周期性边界条件、Metropolis 准则和马尔科夫链进行二维矩阵的演变,并计算了系统演变至...
  • 基础科研
  • LBM模拟二维平板发展流的matlab代码,采用D2Q9模型,适合初学者
  • 这是使用有限体积法 (FVM) 求解二维扩散方程的 MATLAB 代码。 使用的插值方案是迎风方案。 在完成使用轮廓功能后处理。
  • 云模型MATLAB实现

    2015-12-06 11:16:36
    云模型MATLAB实现,用不同颜色的线条作图
  • 二维React扩散方程matlab代码the Study of R R语言学习笔记 自学编程语言的时候,会遇到很多问题和特殊代码语句,记得本子里还不如归类在Github中,所以就开始行动。 (记录在这里主要是为了自己以后的查阅,更多...
  • 高斯扩散模型matlab代码uFab-形式元素扩散 背景技术请阅读James D. Plummer等人的《硅VLSI技术:基础知识,实践和建模》第7章。 请特别注意第7.5.1节。 Nicholas J. Giordano和Hisao Nakanishi在《计算物理学》第...
  • 2、二维DOA(俯仰角、方位角)估计。(有最终结果图) 【算法涵盖】:传播算子(2D-PM)二维谱峰搜索。 【代码特点】:参数化编程(参数可方便修改)、思路步骤清晰、注释明细。 【适合对象】:信号处理、雷达专业...
  • Matlab混凝土二维模型代码主成分分析与聚类 1. K-均值聚类 1.1。 实施K均值 K-means算法是一种将相似数据示例自动聚类在一起的方法。 具体来说,您将获得一个训练集,并希望将数据分组为几个有凝聚力的“集群”。 K-...
  • Matlab文件夹中可以找到用于获取不同图形的代码。 可以在EPS图像文件夹中找到各个图像。 使用的matlab版本是Matlab R2015B 。 在Balram Dubey博士的指导下,该项目是BITS学术课程中特别项目的一部分。
  • 二维React扩散方程式基于Lengyel-Epstein模型的模式机器学习(20200115〜20200730) 在科学计算实验室中,这是我的第一个机器学习项目。 我们的目的是针对使用机器学习和特征工程技术从图灵模型生成的图案图像进行...
  • 导弹模型matlab代码学习指南:基于深度元学习和模型预测路径积分控制的制导律 关于 这项工作的目的是利用本文所述的导弹制导问题,利用模型预测路径积分控制器实施基于模型的深度强化学习,该IEEE Access论文位于...
  • 它是matlab中的二维随机游走过程程序。
  • 二维React扩散方程式React扩散方程的光谱算法 一组代码(在MATLAB和Fortran 77中)和示例,用于求解一维和二维空间中的React扩散方程。 在数学界的区域中,积分因子与频谱方法一起用于消除与React扩散模型中的扩散项...
  • 1.编写一段代码,绘制一个球体,然后平移(利用hold on把变换前后的球体放在同一个figure中) 2. 编写一段代码,绘制一个柱体,然后绕x轴旋转60° 3. 用sphere生成多面体,然后对其进行错切变换 4.程序先绘制一个...
  • 二维对流模型 Matlab 和c++写的
  • Matlab混凝土二维模型代码评论答案 我们感谢您的宝贵意见。 我们将根据这些评论修改提交的论文。 在本文档中,我们总结了评论的答案,并试图阐明每位审稿人提出的要点。 评论者1: 总体得分7接受 [问题]: 为了获得...
  • 二维搜索最大matlab代码3D 轨迹的实时振动触觉反馈 通过将实时值分别与目标路径和目标速度曲线进行比较,独立地为两个运动分量(位置和速度)提供振动触觉反馈。 复合路径是通过沿轨迹引入通路点来创建的,目标路径...
  • 分形数计算matlab代码recursive_integration 这是在论文中使用的递归积分方法:用矩场方程量化气水湍流,以及用矩场方程量化气水湍流的数值考虑。 我们强烈建议您在使用此代码之前阅读这两篇论文。 主程序是...
  • 二维下料matlab代码斯坦车间 这是使用RStan的简短介绍。 两个文件特别受关注:Intro_to_rstan.html文件是一些示例的简短演练,而rstan_presentation.R包括用于运行html文件中提到的所有模型的代码。 Stan文件也包括...
  • 海浪模型matlab代码深度集成二维数值模型 开发商:刘晓峰 用户和电子邮件:张明亮(); 张鸿星() 联系地址:大连海洋大学海洋科学与环境学院,辽宁大连116023 发行年份:2008 电话号码:00186-0411-84763189 程...
  • 二维遗传算法matlab代码振荡 戴维·德马里斯 该软件包包含两种类型的离散动态仿真类,可以使它们相互影响,并充当合作和竞争性空间动力学系统的模型,并且只需要科学的python分布即可。 “精简”指示符表示可以在...
  • 基于孔隙结构的二维微观网络模型,杨建,陈家军,本文根据未固结砂颗粒多孔介质薄片分析所得到的孔隙结构,构建二维微观网络模型,为开展孔隙尺度下流体运动的网络模型实验研究提
  • Matlab混凝土二维模型代码如何讨论生成的分类方法 2020年12月23日 我感谢您的评论。 给我发电子邮件! 雇用我! :smiling_face_with_smiling_eyes: 因此,今天我们将介绍一种简单而强大的方法来构建分类器。 这称为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,552
精华内容 5,820
关键字:

二维云模型matlab代码

matlab 订阅