matlab disteclud,机器学习实战ByMatlab(3)K-means算法

K-means算法属于无监督学习聚类算法,其计算步骤还是挺简单的,思想也挺容易理解,而且还可以在思想中体会到EM算法的思想。

K-means 算法的优缺点:

1.优点:容易实现

2.缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢

使用数据类型:数值型数据

以往的回归算法、朴素贝叶斯、SVM等都是有类别标签y的,因此属于有监督学习,而K-means聚类算法只有x,没有y

在聚类问题中,我们的训练样本是

124511718.png

其中每个Xi都是n维实数。

样本数据中没有了y,K-means算法是将样本聚类成k个簇,具体算法如下:

1、随机选取K个聚类质心点,记为

124511719.png

2、重复以下过程直到收敛

{

对每个样例 i ,计算其应该属于的类:

124511720.png

对每个类 j ,重新计算质心:

124511721.png

}

其中K是我们事先给定的聚类数目,Ci 表示样本 i 与K个聚类中最近的那个类,Ci的值是1到K中的一个,质心uj代表我们对属于同一个类的样本中心的猜测。解释起来就是,

第一步:天空上的我们随机抽取K个星星作为星团的质心,然后对于每一个星星 i,我们计算它到每一个质心uj的距离,选取其中距离最短的星团作为Ci,这样第一步每个星星都有了自己所属于的星团;

第二步:对每个星团Ci,我们重新计算它的质心uj(计算方法为对属于该星团的所有点的坐标求平均)不断重复第一步和第二步直到质心变化很小或者是不变。

然后问题来了,怎么样才算质心变化很小或者是不变?或者说怎么判定?答案就是畸变函数(distortion function),定义如下:

124511722.png

J函数表示每个样本点到其质心的距离平方和,K-means的收敛就是要将 J 调整到最小,假设当前 J 值没有达到最小值,那么可以先固定每个类的质心 uj ,调整每个样例的类别 Ci 来时 J 函数减少。同样,固定 Ci ,调整每个类的质心 uj也可以是 J 减少。这两个过程就是内循环中使 J 单调变小的过程。当 J 减小到最小的时候, u 和 c 也同时收敛。(该过程跟EM算法其实还是挺像的)理论上可能出现多组 u 和 c 使 J 取得最小值,但这种情况实际上很少见。

由于畸变函数 J 是非凸函数,所以我们不能保证取得的最小值一定是全局最小值,这说明k-means算法质心的初始位置的选取会影响到最后最小值的获取。不过一般情况下,k-means算法达到的局部最优已经满足要求。如果不幸代码陷入局部最优,我们可以选取不同的初始值跑多几遍 k-means 算法,然后选取其中最小的 J 对应的 u 和 c 输出。

另一种收敛判断:

实际我们编写代码的时候,还可以通过判断“每个点被分配的质心是否改变”这个条件来判断聚类是否已经收敛

而上面所说的畸变函数则可以用来评估收敛的效果,具体将会在下面的实例中体现。

Matlab 实现

function kMeans

clc

clear

K = 4;

dataSet = load('testSet.txt');

[row,col] = size(dataSet);

% 存储质心矩阵

centSet = zeros(K,col);

% 随机初始化质心

for i= 1:col

minV = min(dataSet(:,i));

rangV = max(dataSet(:,i)) - minV;

centSet(:,i) = repmat(minV,[K,1]) + rangV*rand(K,1);

end

% 用于存储每个点被分配的cluster以及到质心的距离

clusterAssment = zeros(row,2);

clusterChange = true;

while clusterChange

clusterChange = false;

% 计算每个点应该被分配的cluster

for i = 1:row

% 这部分可能可以优化

minDist = 10000;

minIndex = 0;

for j = 1:K

distCal = distEclud(dataSet(i,:) , centSet(j,:));

if (distCal < minDist)

minDist = distCal;

minIndex = j;

end

end

if minIndex ~= clusterAssment(i,1)

clusterChange = true;

end

clusterAssment(i,1) = minIndex;

clusterAssment(i,2) = minDist;

end

% 更新每个cluster 的质心

for j = 1:K

simpleCluster = find(clusterAssment(:,1) == j);

centSet(j,:) = mean(dataSet(simpleCluster',:));

end

end

figure

%scatter(dataSet(:,1),dataSet(:,2),5)

for i = 1:K

pointCluster = find(clusterAssment(:,1) == i);

scatter(dataSet(pointCluster,1),dataSet(pointCluster,2),5)

hold on

end

%hold on

scatter(centSet(:,1),centSet(:,2),300,'+')

hold off

end

% 计算欧式距离

function dist = distEclud(vecA,vecB)

dist = sqrt(sum(power((vecA-vecB),2)));

end

效果如下:

这是正常分类的情况,很明显被分为了4个类,不同颜色代表不同的类,cluster的质心为 “ + ”

124511723.png

当然,这只是其中一种情况,很有可能我们会出现下面这种情况:

124511724.png

这就是上面所说的,K-means的缺点之一,随机初始点的选择可能会让算法陷入局部最优解,这时候我们只需重新运行一次程序即可。

至于每一个看似都可以正常聚类的情况呢,我们则利用上面所说的“畸变函数”来衡量聚类的效果,当然是J越小聚类效果越好。

实际使用的时候,我们只需多次运行程序,选取J最小的聚类效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能安全实验室-Defendio杀马2.4.0.420-实时防护-内存防护、新浏览器导航界面...

智能安全实验室&#xff0d;杀马(Defendio) 2.4.0.420 &#xff1a;实时防护&#xff0d;内存防护、新浏览器导航界面等 详细信息请访问&#xff1a;http://unruledboy.cnblogs.com/archive/2006/02/02/Defendio.html怎样获取最新版本&#xff1f;□智能更新&#xff1a;打开现…

【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况...

模板下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw 提取码&#xff1a;6aox 1、MDK使用MDK5.26及其以上版本。 2、IAR使用IAR8.30及其以上版本。 3、教程直可以先看之前发布的&#xff0c;除了新增的一些功能&#xff0c;其它功能基本…

自动图片轮播php源码,js实现自动图片轮播代码

本文实例为大家分享了轮播的具体代码&#xff0c;自动轮播&#xff0c;居中显示&#xff0c;供大家参考&#xff0c;具体内容如下#div1{width: 192px;height: 120px;border: 1px solid gray;margin: 0 auto;position: relative;overflow: hidden;}#div1 img{position: absolute…

【Open vSwitch】Open vSwitch使用案例扩展实验

实验参考&#xff1a; Open vSwitch使用案例扩展实验 实验步骤&#xff1a; 1. 实验任务一。 1.创建新文件ovsSingleBr.py并编辑以下内容&#xff1a; 1 #!/usr/bin/python2 3 from mininet.net import Mininet4 from mininet.node import Node5 from mininet.link import Lin…

【Open vSwitch】Open vSwitch的GRE隧道实验网络

实验参考&#xff1a; Open vSwitch的GRE隧道实验网络 实验步骤&#xff1a; 1. 配置VM: 1. 本次要实现的拓扑如下&#xff1a; 先验证虚拟机VM1的OvS服务是否被启动好&#xff1a; 2. 在VM1中创建两个bridge&#xff1a; 1 # ovs-vsctl add-br br0 2 # ovs-vsctl add-br br1 3…

php web音视频通话,实现音视频通话(Web)

实现音视频通话(Web)网易云信音视频通话产品的基本功能包括高质量的实时音视频通话。当您成功初始化 SDK 之后&#xff0c;您可以简单体验本产品的基本业务流程。本文档为您展示音视频通话提供的基本业务流程。前提条件请确认您已完成以下操作&#xff1a;快速跑通Sample Code注…

【Open vSwitch】Open vSwitch的VxLAN隧道网络实验

验参考&#xff1a; Open vSwitch的VxLAN隧道网络实验 实验步骤&#xff1a; 1. 预先配置: 1. 验证两虚拟机的OvS服务是否被启动好&#xff1a; # ps –ef|grep ovs 2. 登陆两台安装Mininet的虚拟机&#xff0c;分别查看IP地址&#xff1a; VM1&#xff08;192.168.0.102&#…

centos oracle创建库,CentOS Oracle安装必要的软件创建数据库

CentOS Oracle安装系统的特性&#xff0c;既可作为高校计算机专业CentOS Oracle安装学习&#xff0c;也可以作为CentOS系统开源爱好者、CentOS系统用户CentOS Oracle安装系统的特性&#xff0c;&#xff0c;既可作为高校计算机专业CentOS Oracle安装学习&#xff0c;也可以作为…

【Open vSwitch】Open vSwitch流表应用实战

实验参考&#xff1a; Open vSwitch流表应用实战 如何在ubuntu系统下搭建一个opendaylight Beryllium版本环境 实验步骤&#xff1a; 1. 前期准备。 1.创建2个虚拟机&#xff0c;一个是选择OpenDaylight镜像的虚拟机作为控制器&#xff08;注&#xff1a;内存大于2G&#xff09…

oracle sql loop merge,Oracle之存储过程和MERGE INTO语句

一、MERGE INTO语句1、merge into语句的功能&#xff1a;我们操作数据库的时候&#xff0c;有时候会遇到insert或者Update这种需求。我们操纵代码时至少需要写一个插入语句和更新语句并且还得单独写方法效验数据是否存在&#xff0c;这种操作完全可以用merge into语句代替&…

七月暴雨

狼是弱者 是生命无从着落的弱者 是黯然神伤的异族 它们此刻在星光月夜里 悲情地凝望厮守缠绵过的故园 在逡巡的感伤里作别 为了生命 为了延续 选择死亡或者选择离去 就像时间无意从指间滑过一样 悄悄的溜走 没有…

【OpenFlow】OpenFlow1.3协议基于Mininet部署与验证

实验参考&#xff1a; OpenFlow1.3协议基于Mininet部署与验证 实验步骤&#xff1a; 1. 安装mininet&#xff0c;具体步骤请看实验参考。 2. Mininet创建拓扑后连接支持OpenFlow1.3的控制器&#xff1a; 在连接前&#xff0c;可以通过命令确认控制器的端口号&#xff1a; 3. 进…

【OpenDaylight】OpenDaylight的C/S模式实验

实验参考&#xff1a; OpenDaylight的C/S模式实验 实验步骤&#xff1a; 1. 启动OpenDaylight&#xff1a; 查看是否开启&#xff1a; 或&#xff1a; 2. 查看OpenDaylight的IP地址&#xff1a; 3. 用Miniet创建简易拓扑并连接ODL&#xff1a; 4. 在OpenDaylight虚拟机上查看监…

linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法

vnc的默认端口是自己配置的&#xff0c;并不是这有一个端口号。通过打开/etc/sysconfig/vncservers。 这里就配置了2个桌面&#xff0c;一个桌面号是1&#xff0c; 一个是2.这里的配置的参数VNCSERVERS"2:root"VNCSERVERARGS[2]"-geometry 1280x800"就可以…

linux怎么查看本地磁盘空间,linux怎么查看磁盘空间

如果你在使用Linux过程中遇到无法读写磁盘&#xff0c;应用程序无法执行&#xff0c;请求响应不了等问题&#xff0c;那多半是Linux系统磁盘空间满了&#xff0c;那么怎么查看Linux磁盘空间呢?下面跟着学习啦小编一起来了解一下吧。linux怎么查看磁盘空间首先如果需要查看整个…

[hdu5629]Clarke and tree

首先由一个神奇的序列叫做Purfer序列&#xff0c;他可以表示一棵树&#xff0c;且每个节点出现此时为度数-1(因此总长为n-2)。 然后dp&#xff0c;用f[i][j][k]表示用前i个点中的j个点构成了一个长度为k的Purfer序列&#xff08;当然要符合条件&#xff09;&#xff0c;那么有$…

linux指令与数据库,Linux指令每日背诵(第一天)

了解&#xff1a;Linux 命令的分类&#xff1a;内部指令、外部指令。Shell 在用户和内核之间充当了“翻译官”的角色。掌握&#xff1a;四种指令方式&#xff1a;1、命令字&#xff1b;2、命令字选项&#xff1b;3、命令之参数&#xff1b;4、命令字选项参数&#xff1b;命令字…

Scott Mitchell 的ASP.NET 2.0数据教程之五:: 声明参数

导言 在上一章的教程中&#xff0c;我们看了GridView、DetailsView和FormView绑定到OjbectDataSource控件显示数据&#xff0c;ObjectDataSource调用了类ProductsBLL的GetProducts()方法。方法GetProducts()返回一个有Northwind数据库的Products表的所有记录组成的强类型数据表…

IArea

用于获取一个几何对象的面积 IArea接口的第一个属性Area&#xff08;只读&#xff0c;返回一个double类型的数值&#xff0c;为此Area的面积&#xff09;IArea接口的第二个属性Centroid&#xff08;只读&#xff0c;返回一个IPoint类型的变量&#xff0c;为此Area的重心&#x…

linux coreutils升级,Coreutils

Coreutils提供了配置工具&#xff0c;定义颜色代码更加方便&#xff1b;Coreutils包含的不仅仅是ls&#xff0c;同时作为Linux用户&#xff0c;我更习惯于使用GNU的各种shell工具。其实就是安装了Coreutils&#xff0c;就可以使用Linux下的程序&#xff0c;【ls/mkdir/mv】等等…