K-means算法、高斯混合模型 matlab
K-means算法、高斯混合模型
简介:
本节介绍STANFORD机器学习公开课中的第12、13集视频中的算法:K-means算法、高斯混合模型(GMM)。(9、10、11集不进行介绍,略过了哈)
一、K-means算法
属于无监督学习的聚类算法,给定一组未标定的数据(输入样本),对其进行分类,假设可分为k个类。由于算法比较直观,故直接给出步骤和MATLAB代码。(k-means算法在数学推导上是有意义的)
MATLAB代码:
- %%
- %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:10
- for i=1:a
- d1=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.');
- else
- k2=k2+data(i,:);
- n2=n2+1;
- plot(data(i,1),data(i,2),'b.');
- end
- end
- m1=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;
%%
%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代码如下:
- %%
- %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:m
- p(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;%归一化,样本属于某类的概率的总和为1
- p(i,2)=p(i,2)/pp;
- end
- sum1=zeros(n,n);
- sum2=zeros(n,n);
- for i=1:m
- sum1=sum1+p(i,1)*(data(i,:)-mu1)'*(data(i,:)-mu1);
- sum2=sum2+p(i,2)*(data(i,:)-mu2)'*(data(i,:)-mu2);
- end
- sigma1=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:m
- p(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.');
- else
- plot(data(i,1),data(i,2),'b.');
- end
- end
- title('GMM分类');
- hold off;
- %完
%%
%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相关推荐
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- 其他算法-高斯混合模型
目录 高斯模型 单高斯模型 高斯混合模型GMM 参数估计 单高斯模型参数估计-极大似然 高斯混合模型参数估计-EM算法 GMM与k-means 高斯模型 单高斯模型 当样本数据 x∈Rx\in\mat ...
- gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...
- EM算法高斯混合模型原理详解及小例子
EM算法与混合高斯模型 EM算法经常用在混合高斯模型下,那么首先我们先介绍一下什么是混合高斯模型 什么是混合高斯模型 首先我们对于单个高斯模型我们会有如下数据,并且不同的数据服从的高斯也不同,也就是它 ...
- k means算法C语言伪代码,K均值算法(K-Means)
1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...
- 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结
文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...
- EM算法在高斯混合模型学习中的应用
本篇文章是之前期望极大算法(EM算法)文章的后续,有需要可以先看看那篇文章关于EM算法的推导. 高斯混合模型 高斯混合模型是研究算法的人避不开的一个东西,其在非深度学习的远古时代经常被用到,比如图像处 ...
- 高斯混合模型与EM算法求解
高斯混合模型 文章目录 高斯混合模型 EM算法 高斯混合模型参数估计 1.样本分类已知情况下的GMM 2.样本分类未知的情况下的GMM 混合模型是一个用来表示在总体分布中含有K个子分布的概率模型,也就 ...
- 详解高斯混合模型与EM算法
详解高斯混合模型与EM算法 详解高斯混合模型与EM算法 高斯混合模型 单高斯模型(Gaussian single model, GSM) 一维高斯分布 多维高斯分布 混合高斯模型(Gaussian m ...
最新文章
- Firefox显示 您的链接不安全 的解决办法
- spring各种邮件发送
- 记那一次-----环环相抱何是了?
- MySQL发展史重大事件
- python 12306 车次数据获取
- xgboost分类_XGBoost(Extreme Gradient Boosting)
- git-底层-高层指令
- powerpoint 发布_PowerPoint的死亡:这些谈话打破了常规
- Ext 中使用Ajax
- linux 下 php 安装 libevent
- 前后落差大用什么词语_【刺激】全国最长滑索!“白云飞索”全长1500米,落差200多米!...
- Angularjs中$http以post请求通过消息体传递参数
- Linux如何动态查看文件信息,怎么查看linux动态链接库文件的版本等其他信息
- matlab高斯滤波去噪,图像平滑去噪之高斯滤波器
- 零点定理和罗尔定理的完善?
- 加法的横式竖式教案c语言,竖式进位加法教案
- windows防火墙
- 牛客SQL 大厂面试真题 某宝店铺分析 5套代码及解析
- 本地项目与Git项目关联
- 什么是PHP高级工程师
热门文章
- nginx 正则匹配优化(一)
- web项目部署服务器后无响应,Spring4.1.0 - SpringMVC第一步,Tomcat服务器端正常,客户端无法响应JSP页面问题处理...
- 计算机应用基础形成性考核册答案,2019年最新(电大秋)计算机应用基础形成性考核册题目及答案.doc...
- 用了fastapi还需要nginx_专门为API接口开发出现,FastAPI零门槛学习
- golang mysql单元测试_golang test测试使用
- php虚拟主机和服务器吗,php虚拟主机和服务器吗
- java if 三目运算符_if-else和三元运算符的不同行为
- python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...
- Apple Music 会员免费领啦!
- 想直接在 IDEA 里面快乐的刷刷LeetCode算法题吗?