GMM-实现聚类的代码示例

Matlab 代码:

 1 % GMM code
 2
 3 function varargout = gmm(X, K_or_centroids)
 4
 5     % input X:N-by-D data matrix
 6     % input K_or_centroids: K-by-D centroids
 7
 8     % 阈值
 9     threshold = 1e-15;
10     % 读取数据维度
11     [N, D] = size(X);
12     % 判断输入质心是否为标量
13     if isscalar(K_or_centroids)
14         % 是标量,随机选取K个质心
15         K = K_or_centroids;
16         rnpm = randperm(N); % 打乱的N个序列
17         centroids = X(rnpm(1:K), :);
18     else   % 矩阵,给出每一类的初始化
19         K = size(K_or_centroids, 1);
20         centroids = K_or_centroids;
21     end
22
23     % 定义模型初值
24     [pMiu pPi pSigma] = init_params();
25
26     Lprev = -inf;
27     while true
28         % E-step,估算出概率值
29         % Px: N-by-K
30         Px = calc_prob();
31
32         % pGamma新的值,样本点所占的权重
33         % pPi:1-by-K     pGamma:N-by-K
34         pGamma = Px ./ repmat(pPi, N, 1);
35         % 对pGamma的每一行进行求和,sum(x,2):每一行求和
36         pGamma = pGamma ./ repmat(sum(pGamma, 2) ,1 , K);
37
38         % M-step
39         % 每一个组件给予新的值
40         Nk = sum(pGamma,1);
41         pMiu = diag(1./Nk)*pGamma‘*X;
42         pPi = Nk/N;
43         for kk = 1:K
44            Xshift = X - repmat(pMiu(kk, :) ,N, 1);
45            pSigma(:,:,kk) = (Xshift‘*(diag(pGamma(:,kk))*Xshift)) / Nk(kk);
46         end
47
48         % 观察收敛,convergence
49         L = sum(log(Px*pPi‘));
50         if L-Lprev < threshold
51             break;
52         end
53         Lprev = L;
54
55     end
56
57     % 输出参数判定
58     if nargout == 1
59         varargout = {Px};
60     else
61         model = [];
62         model.Miu = pMiu;
63         model.Sigma = pSigma;
64         model.Pi = pPi;
65         varargout = {Px, model};
66     end
67
68     function [pMiu pPi pSigma] = init_params()
69        pMiu = centroids; % 均值,K类的中心
70        pPi = zeros(1, K); % 概率
71        pSigma = zeros(D, D, K); % 协方差,每一个都是D-by-D
72
73        % (X - pMiu)^2 = X^2 + pMiu^2 - 2*X*pMiu
74        distmat = repmat(sum(X.*X, 2), 1, K) + repmat(sum(pMiu.*pMiu, 2)‘, N, 1) - 2*X*pMiu‘;
75        [dummy labels] = min(distmat, [], 2); % 找出每一行的最小值,并标出列的位置
76
77        for k=1:K   %初始化参数
78            Xk = X(labels == k, :);
79            pPi(k) = size(Xk, 1)/N;
80            pSigma(:, :, k) = cov(Xk);
81        end
82     end
83
84     % 计算概率值
85     function Px = calc_prob()
86         Px = zeros(N,K);
87         for k=1:K
88             Xshift = X - repmat(pMiu(k,:),N,1);
89             inv_pSigma = inv(pSigma(:,:,k)+diag(repmat(threshold, 1, size(pSigma(:,:,k),1))));
90             tmp = sum((Xshift*inv_pSigma).*Xshift, 2);
91             coef = (2*pi)^(-D/2)*sqrt(det(inv_pSigma));
92             Px(:,k) = coef * exp(-1/2*tmp);
93         end
94     end
95
96
97 end

测试主程序:

 1 % 测试代码
 2 clear all
 3 clc
 4
 5 data = load(‘testSet.txt‘);
 6 [PX, Model] = gmm(data, 4);
 7 [~,index] = max(PX‘); % 每一列的最大值
 8
 9 cent = Model.Miu;
10 figure
11 I = find(index == 1);
12 scatter(data(I,1), data(I,2))
13 hold on
14 scatter(cent(1,1), cent(1,2) ,150, ‘filled‘);
15 hold on
16 I = find(index == 2);
17 scatter(data(I,1),data(I,2))
18 hold on
19 scatter(cent(2,1),cent(2,2),150,‘filled‘)
20 hold on
21 I = find(index == 3);
22 scatter(data(I,1),data(I,2))
23 hold on
24 scatter(cent(3,1),cent(3,2),150,‘filled‘)
25 hold on
26 I = find(index == 4);
27 scatter(data(I,1),data(I,2))
28 hold on
29 scatter(cent(4,1),cent(4,2),150,‘filled‘)

示意图:

参考自:http://www.voidcn.com/blog/llp1992/article/p-2308490.html

时间: 2024-10-19 04:59:01

GMM-实现聚类的代码示例的相关文章

计算DXFReader中多边形的面积代码示例

在DXFReader中, 一般的多边形的面积计算绝对值 其中K表是顶点的数目,它们的坐标,用于在求和和, 所以用下面的代码就可以计算出一个封闭的多段线的区域: view source print? 01 Dim Vertex As Object 02 Dim Entity As Object 03 Dim k As Long 04 Dim i As Long 05 Dim Area As Single 06 07 With DXFReader1 08 09  For Each Entity In

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

jquery操作单选钮代码示例

jquery操作单选钮代码示例:radio单选按钮是最重要的表单元素之一,下面介绍一下常用的几个jquery对radio单选按钮操作.一.取消选中: $(".theclass").each(function(){ if($(this).attr('checked')) { $(this).attr('checked',false); } }); 以上代码可以将class属性值为theclass的被选中单选按钮取消选中.二.获取被选中的单选按钮的值: var val=$('.thecla

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

领域驱动开发推荐代码示例 — Microsoft NLayerApp

简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/. 架构图: 点击查看大图 代码下载:http://microsoftnlayerapp.codeplex.com/releases/view/56660 所用到的软件: - Microsoft Visual Studio 2010  - Microsoft Ex

Aspectj快速上手代码示例之Before,After,Around

本文不打算解释AOP的相关专业名词和概念,仅通过几个代码示例来展示Aspectj(对AOP实现的)的基本使用,并且使用的Aspectj是目前最新版本. 1.搭建环境 本文使用Maven来构建工程,通过aspectj-maven-plugin插件来编译*.aj文件至.class. Maven的具体配置: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin&

jxl创建Excel文件java代码示例

记得要下载 并 导入 jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import java.io.*; import jxl.*; import jxl.format.Colour; import jxl.write.*; public class JXLTest { private static WritableWorkbook book; private static Wr

java 翻盖hashCode()深入探讨 代码示例

package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要的因素 就是:无论何时,对同一个对象调用HashCode都应该产生同样的值, * 如果你的HashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化 时 * HashCode就会生成一个不同的散列码,相当于产生一个不同的健 * 此外 也不应该使HashCode依赖于具有唯一性的对象信息,尤其是使用this的值,这只能很糟糕, * 因为这

python 之初学者的代码示例(短小精悍)(一)

学习Python也有个把月了,最近整理自己初学的代码示例,一个是为了增加自己对细节的把握,一个是让像我一样的初学者能够熟练地使用基础,基础的重要性就不说了,我希望自己能够把这些精巧的小而短的示例分享给大家,共同进步 #help(execfile) Help on built-in function execfile in module __builtin__: execfile(...) execfile(filename[, globals[, locals]]) Read and execu