K-means算法、高斯混合模型

简介:

本节介绍STANFORD机器学习公开课中的第12、13集视频中的算法:K-means算法、高斯混合模型(GMM)。(9、10、11集不进行介绍,略过了哈)

一、K-means算法

属于无监督学习的聚类算法,给定一组未标定的数据(输入样本),对其进行分类,假设可分为k个类。由于算法比较直观,故直接给出步骤和MATLAB代码。(k-means算法在数学推导上是有意义的)

MATLAB代码:

[cpp] view plain copy print?
  1. %%
  2. %k均值聚类
  3. clear all;
  4. close all;
  5. %%
  6. n=2;
  7. m=200;
  8. v0=randn(m/2,2)-1;
  9. v1=randn(m/2,2)+1;
  10. figure;
  11. subplot(221);
  12. hold on;
  13. plot(v0(:,1),v0(:,2),'r.');
  14. plot(v1(:,1),v1(:,2),'b.');
  15. %axis([-5 5 -5 5]);
  16. title('已分类数据');
  17. hold off;
  18. data=[v0;v1];
  19. data=sortrows(data,1);
  20. subplot(222);
  21. plot(data(:,1),data(:,2),'g.');
  22. title('未分类数据');
  23. %axis([-5 5 -5 5]);
  24. %%
  25. [a b]=size(data);
  26. m1=data(20,:);%随机取重心点
  27. m2=data(120,:);%随机取重心点
  28. k1=zeros(1,2);
  29. k2=zeros(1,2);
  30. n1=0;
  31. n2=0;
  32. subplot(223);hold on;
  33. %axis([-5 5 -5 5]);
  34. for t=1:10
  35. for i=1:a
  36. d1=pdist2(m1,data(i,:));
  37. d2=pdist2(m2,data(i,:));
  38. if (d1<d2)
  39. k1=k1+data(i,:);
  40. n1=n1+1;
  41. plot(data(i,1),data(i,2),'r.');
  42. else
  43. k2=k2+data(i,:);
  44. n2=n2+1;
  45. plot(data(i,1),data(i,2),'b.');
  46. end
  47. end
  48. m1=k1/n1;
  49. m2=k2/n2;
  50. %     plot(m1(1,1),m1(1,2),'g.');
  51. %     plot(m2(1,1),m2(1,2),'g.');
  52. k1=zeros(1,2);
  53. k2=zeros(1,2);
  54. n1=0;
  55. n2=0;
  56. end
  57. plot(m1(1,1),m1(1,2),'k*');
  58. plot(m2(1,1),m2(1,2),'k*');
  59. title('k-means聚类');
  60. hold off;
%%
%k均值聚类
clear all;
close all;
%%
n=2;
m=200;
v0=randn(m/2,2)-1;
v1=randn(m/2,2)+1;
figure;
subplot(221);
hold on;
plot(v0(:,1),v0(:,2),'r.');
plot(v1(:,1),v1(:,2),'b.');
%axis([-5 5 -5 5]);
title('已分类数据');
hold off;data=[v0;v1];
data=sortrows(data,1);
subplot(222);
plot(data(:,1),data(:,2),'g.');
title('未分类数据');
%axis([-5 5 -5 5]);
%%
[a b]=size(data);
m1=data(20,:);%随机取重心点
m2=data(120,:);%随机取重心点
k1=zeros(1,2);
k2=zeros(1,2);
n1=0;
n2=0;
subplot(223);hold on;
%axis([-5 5 -5 5]);
for t=1:10for i=1:ad1=pdist2(m1,data(i,:));d2=pdist2(m2,data(i,:));if (d1<d2)k1=k1+data(i,:);n1=n1+1;plot(data(i,1),data(i,2),'r.');elsek2=k2+data(i,:);n2=n2+1;plot(data(i,1),data(i,2),'b.');endendm1=k1/n1;m2=k2/n2;
%     plot(m1(1,1),m1(1,2),'g.');
%     plot(m2(1,1),m2(1,2),'g.');k1=zeros(1,2);k2=zeros(1,2);n1=0;n2=0;
end
plot(m1(1,1),m1(1,2),'k*');
plot(m2(1,1),m2(1,2),'k*');
title('k-means聚类');
hold off;

输出结果(未分类数据是由已分类数据去掉标签,黑色※号表示聚类中心):

二、高斯混合模型(GMM)

回想之前之前的高斯判别分析法(GDA),是通过计算样本的后验概率来进行判别,而后验概率是通过假设多元高斯模型来计算得来的。高斯模型的参数:均值、协方差,是由已标定(分类)的样本得来,所以可以看做是一种监督学习方法。

在GMM模型(属于无监督学习),给定未分类的m个样本(n维特征),假设可分为k个类,要求用GMM算法对其进行分类。如果我们知道每个类的高斯参数,则可以向GDA算法那样计算出后验概率进行判别。但遗憾的是,杨输入的样本未被标定,也就是说我们得不到高斯参数:均值、协方差。这就引出EM(Expectation Maximization Algorithm:期望最大化)算法。

EM算法的思想有点类似于k-means,就是通过迭代来得出最好的参数,有了这些参数就可以像GDA那样做分类了。GMM及EM具体步骤如下:

MATLAB代码如下:

[cpp] view plain copy print?
  1. %%
  2. %GMM算法(高斯混合模型)soft assignment(软划分)
  3. clear all;
  4. close all;
  5. %%
  6. k=2;%聚类数
  7. n=2;%维数
  8. m=200;
  9. % v0=randn(m/2,2)-1;
  10. % v1=randn(m/2,2)+1;
  11. v0=mvnrnd([1 1],[1 0;0 1],m/2);%生成正样本1
  12. v1=mvnrnd([4 4],[1 0;0 1],m/2);%生成负样本0
  13. figure;subplot(221);
  14. hold on;
  15. plot(v0(:,1),v0(:,2),'r.');
  16. plot(v1(:,1),v1(:,2),'b.');
  17. title('已分类数据');
  18. hold off;
  19. %%
  20. data=[v0;v1];
  21. data=sortrows(data,1);
  22. subplot(222);
  23. plot(data(:,1),data(:,2),'g.');
  24. title('未分类数据');
  25. %%
  26. mu1=mean(data(1:50,:));
  27. mu2=mean(data(100:180,:));
  28. sigma1=cov(data(1:50,:));
  29. sigma2=cov(data(100:180,:));
  30. p=zeros(m,k);%概率
  31. thresh=0.05;%迭代终止条件
  32. iter=0;%记录迭代次数
  33. while(1)
  34. iter=iter+1;
  35. A1=1/(((2*pi)^(n/2))*((det(sigma1))^(1/2)));
  36. A2=1/(((2*pi)^(n/2))*((det(sigma2))^(1/2)));
  37. for i=1:m
  38. p(i,1)=A1*exp((-1/2)*(data(i,:)-mu1)*sigma1*(data(i,:)-mu1)');
  39. p(i,2)=A2*exp((-1/2)*(data(i,:)-mu2)*sigma2*(data(i,:)-mu2)');
  40. pp=sum(p(i,:));
  41. p(i,1)=p(i,1)/pp;%归一化,样本属于某类的概率的总和为1
  42. p(i,2)=p(i,2)/pp;
  43. end
  44. sum1=zeros(n,n);
  45. sum2=zeros(n,n);
  46. for i=1:m
  47. sum1=sum1+p(i,1)*(data(i,:)-mu1)'*(data(i,:)-mu1);
  48. sum2=sum2+p(i,2)*(data(i,:)-mu2)'*(data(i,:)-mu2);
  49. end
  50. sigma1=sum1/sum(p(:,1));
  51. sigma2=sum2/sum(p(:,2));
  52. mu1_pre=mu1;
  53. mu2_pre=mu2;
  54. mu1=(p(:,1)'*data)/sum(p(:,1));
  55. mu2=(p(:,2)'*data)/sum(p(:,2));
  56. if ((pdist2(mu1_pre,mu1)<=thresh) || (pdist2(mu2_pre,mu2)<=thresh))
  57. break;
  58. end
  59. end
  60. %%
  61. subplot(223);
  62. hold on;
  63. A1=1/(((2*pi)^(n/2))*((det(sigma1))^(1/2)));
  64. A2=1/(((2*pi)^(n/2))*((det(sigma2))^(1/2)));
  65. for i=1:m
  66. p(i,1)=A1*exp((-1/2)*(data(i,:)-mu1)*sigma1*(data(i,:)-mu1)');
  67. p(i,2)=A2*exp((-1/2)*(data(i,:)-mu2)*sigma2*(data(i,:)-mu2)');
  68. if p(i,1)>=p(i,2)
  69. plot(data(i,1),data(i,2),'r.');
  70. else
  71. plot(data(i,1),data(i,2),'b.');
  72. end
  73. end
  74. title('GMM分类');
  75. hold off;
  76. %完
%%
%GMM算法(高斯混合模型)soft assignment(软划分)
clear all;
close all;
%%
k=2;%聚类数
n=2;%维数
m=200;
% v0=randn(m/2,2)-1;
% v1=randn(m/2,2)+1;
v0=mvnrnd([1 1],[1 0;0 1],m/2);%生成正样本1
v1=mvnrnd([4 4],[1 0;0 1],m/2);%生成负样本0
figure;subplot(221);
hold on;
plot(v0(:,1),v0(:,2),'r.');
plot(v1(:,1),v1(:,2),'b.');
title('已分类数据');
hold off;
%%
data=[v0;v1];
data=sortrows(data,1);
subplot(222);
plot(data(:,1),data(:,2),'g.');
title('未分类数据');
%%
mu1=mean(data(1:50,:));
mu2=mean(data(100:180,:));
sigma1=cov(data(1:50,:));
sigma2=cov(data(100:180,:));
p=zeros(m,k);%概率
thresh=0.05;%迭代终止条件
iter=0;%记录迭代次数
while(1)iter=iter+1;A1=1/(((2*pi)^(n/2))*((det(sigma1))^(1/2)));A2=1/(((2*pi)^(n/2))*((det(sigma2))^(1/2)));for i=1:mp(i,1)=A1*exp((-1/2)*(data(i,:)-mu1)*sigma1*(data(i,:)-mu1)');p(i,2)=A2*exp((-1/2)*(data(i,:)-mu2)*sigma2*(data(i,:)-mu2)');pp=sum(p(i,:));p(i,1)=p(i,1)/pp;%归一化,样本属于某类的概率的总和为1p(i,2)=p(i,2)/pp;endsum1=zeros(n,n);sum2=zeros(n,n);for i=1:msum1=sum1+p(i,1)*(data(i,:)-mu1)'*(data(i,:)-mu1);sum2=sum2+p(i,2)*(data(i,:)-mu2)'*(data(i,:)-mu2);endsigma1=sum1/sum(p(:,1));sigma2=sum2/sum(p(:,2));mu1_pre=mu1;mu2_pre=mu2;mu1=(p(:,1)'*data)/sum(p(:,1));mu2=(p(:,2)'*data)/sum(p(:,2));if ((pdist2(mu1_pre,mu1)<=thresh) || (pdist2(mu2_pre,mu2)<=thresh))break;end
end
%%
subplot(223);
hold on;
A1=1/(((2*pi)^(n/2))*((det(sigma1))^(1/2)));
A2=1/(((2*pi)^(n/2))*((det(sigma2))^(1/2)));
for i=1:mp(i,1)=A1*exp((-1/2)*(data(i,:)-mu1)*sigma1*(data(i,:)-mu1)');p(i,2)=A2*exp((-1/2)*(data(i,:)-mu2)*sigma2*(data(i,:)-mu2)');if p(i,1)>=p(i,2)plot(data(i,1),data(i,2),'r.');elseplot(data(i,1),data(i,2),'b.');end
end
title('GMM分类');
hold off;
%完

输出结果:

K-means算法、高斯混合模型 matlab相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. 其他算法-高斯混合模型

    目录 高斯模型 单高斯模型 高斯混合模型GMM 参数估计 单高斯模型参数估计-极大似然 高斯混合模型参数估计-EM算法 GMM与k-means 高斯模型 单高斯模型 当样本数据 x∈Rx\in\mat ...

  3. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现

    1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...

  4. EM算法高斯混合模型原理详解及小例子

    EM算法与混合高斯模型 EM算法经常用在混合高斯模型下,那么首先我们先介绍一下什么是混合高斯模型 什么是混合高斯模型 首先我们对于单个高斯模型我们会有如下数据,并且不同的数据服从的高斯也不同,也就是它 ...

  5. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  6. 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结

    文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...

  7. EM算法在高斯混合模型学习中的应用

    本篇文章是之前期望极大算法(EM算法)文章的后续,有需要可以先看看那篇文章关于EM算法的推导. 高斯混合模型 高斯混合模型是研究算法的人避不开的一个东西,其在非深度学习的远古时代经常被用到,比如图像处 ...

  8. 高斯混合模型与EM算法求解

    高斯混合模型 文章目录 高斯混合模型 EM算法 高斯混合模型参数估计 1.样本分类已知情况下的GMM 2.样本分类未知的情况下的GMM 混合模型是一个用来表示在总体分布中含有K个子分布的概率模型,也就 ...

  9. 详解高斯混合模型与EM算法

    详解高斯混合模型与EM算法 详解高斯混合模型与EM算法 高斯混合模型 单高斯模型(Gaussian single model, GSM) 一维高斯分布 多维高斯分布 混合高斯模型(Gaussian m ...

最新文章

  1. Firefox显示 您的链接不安全 的解决办法
  2. spring各种邮件发送
  3. 记那一次-----环环相抱何是了?
  4. MySQL发展史重大事件
  5. python 12306 车次数据获取
  6. xgboost分类_XGBoost(Extreme Gradient Boosting)
  7. git-底层-高层指令
  8. powerpoint 发布_PowerPoint的死亡:这些谈话打破了常规
  9. Ext 中使用Ajax
  10. linux 下 php 安装 libevent
  11. 前后落差大用什么词语_【刺激】全国最长滑索!“白云飞索”全长1500米,落差200多米!...
  12. Angularjs中$http以post请求通过消息体传递参数
  13. Linux如何动态查看文件信息,怎么查看linux动态链接库文件的版本等其他信息
  14. matlab高斯滤波去噪,图像平滑去噪之高斯滤波器
  15. 零点定理和罗尔定理的完善?
  16. 加法的横式竖式教案c语言,竖式进位加法教案
  17. windows防火墙
  18. 牛客SQL 大厂面试真题 某宝店铺分析 5套代码及解析
  19. 本地项目与Git项目关联
  20. 什么是PHP高级工程师

热门文章

  1. nginx 正则匹配优化(一)
  2. web项目部署服务器后无响应,Spring4.1.0 - SpringMVC第一步,Tomcat服务器端正常,客户端无法响应JSP页面问题处理...
  3. 计算机应用基础形成性考核册答案,2019年最新(电大秋)计算机应用基础形成性考核册题目及答案.doc...
  4. 用了fastapi还需要nginx_专门为API接口开发出现,FastAPI零门槛学习
  5. golang mysql单元测试_golang test测试使用
  6. php虚拟主机和服务器吗,php虚拟主机和服务器吗
  7. java if 三目运算符_if-else和三元运算符的不同行为
  8. python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...
  9. Apple Music 会员免费领啦!
  10. 想直接在 IDEA 里面快乐的刷刷LeetCode算法题吗?