matlab disteclud,机器学习实战ByMatlab(四)二分K-means算法
前面我们在是实现K-means算法的时候,提到了它本身存在的缺陷:
1.可能收敛到局部最小值
2.在大规模数据集上收敛较慢
对于上一篇博文最后说的,当陷入局部最小值的时候,处理方法就是多运行几次K-means算法,然后选择畸变函数J较小的作为最佳聚类结果。这样的说法显然不能让我们接受,我们追求的应该是一次就能给出接近最优的聚类结果。
其实K-means的缺点的根本原因就是:对K个质心的初始选取比较敏感。质心选取得不好很有可能就会陷入局部最小值。
基于以上情况,有人提出了二分K-means算法来解决这种情况,也就是弱化初始质心的选取对最终聚类效果的影响。
二分K-means算法
在介绍二分K-means算法之前我们先说明一个定义:SSE(Sum of Squared Error),也就是误差平方和,它是用来度量聚类效果的一个指标。其实SSE也就是我们在K-means算法中所说的畸变函数:
SSE计算的就是一个cluster中的每个点到质心的平方差,它可以度量聚类的好坏。显然SSE越小,说明聚类效果越好。
二分K-means算法的主要思想:
首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。
二分k均值算法的伪代码如下:
将所有数据点看成一个簇
当簇数目小于k时
对每一个簇
计算总误差
在给定的簇上面进行k-均值聚类(k=2)
计算将该簇一分为二后的总误差
选择使得误差最小的那个簇进行划分操作
Matlab 实现
function bikMeans
%%
clc
clear
close all
%%
biK = 4;
biDataSet = load(‘testSet.txt‘);
[row,col] = size(biDataSet);
% 存储质心矩阵
biCentSet = zeros(biK,col);
% 初始化设定cluster数量为1
numCluster = 1;
%第一列存储每个点被分配的质心,第二列存储点到质心的距离
biClusterAssume = zeros(row,2);
%初始化质心
biCentSet(1,:) = mean(biDataSet)
for i = 1:row
biClusterAssume(i,1) = numCluster;
biClusterAssume(i,2) = distEclud(biDataSet(i,:),biCentSet(1,:));
end
while numCluster < biK
minSSE = 10000;
%寻找对哪个cluster进行划分最好,也就是寻找SSE最小的那个cluster
for j = 1:numCluster
curCluster = biDataSet(find(biClusterAssume(:,1) == j),:);
[spiltCentSet,spiltClusterAssume] = kMeans(curCluster,2);
spiltSSE = sum(spiltClusterAssume(:,2));
noSpiltSSE = sum(biClusterAssume(find(biClusterAssume(:,1)~=j),2));
curSSE = spiltSSE + noSpiltSSE;
fprintf(‘第%d个cluster被划分后的误差为:%f \n‘ , [j, curSSE])
if (curSSE < minSSE)
minSSE = curSSE;
bestClusterToSpilt = j;
bestClusterAssume = spiltClusterAssume;
bestCentSet = spiltCentSet;
end
end
bestClusterToSpilt
bestCentSet
%更新cluster的数目
numCluster = numCluster + 1;
bestClusterAssume(find(bestClusterAssume(:,1) == 1),1) = bestClusterToSpilt;
bestClusterAssume(find(bestClusterAssume(:,1) == 2),1) = numCluster;
% 更新和添加质心坐标
biCentSet(bestClusterToSpilt,:) = bestCentSet(1,:);
biCentSet(numCluster,:) = bestCentSet(2,:);
biCentSet
% 更新被划分的cluster的每个点的质心分配以及误差
biClusterAssume(find(biClusterAssume(:,1) == bestClusterToSpilt),:) = bestClusterAssume;
end
figure
%scatter(dataSet(:,1),dataSet(:,2),5)
for i = 1:biK
pointCluster = find(biClusterAssume(:,1) == i);
scatter(biDataSet(pointCluster,1),biDataSet(pointCluster,2),5)
hold on
end
%hold on
scatter(biCentSet(:,1),biCentSet(:,2),300,‘+‘)
hold off
end
% 计算欧式距离
function dist = distEclud(vecA,vecB)
dist = sum(power((vecA-vecB),2));
end
% K-means算法
function [centSet,clusterAssment] = kMeans(dataSet,K)
[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
end
算法迭代过程如下
biCentSet =
-0.1036 0.0543
0 0
0 0
0 0
第1个cluster被划分后的误差为:792.916857
bestClusterToSpilt =
1
bestCentSet =
-0.2897 -2.8394
0.0825 2.9480
biCentSet =
-0.2897 -2.8394
0.0825 2.9480
0 0
0 0
第1个cluster被划分后的误差为:409.871545
第2个cluster被划分后的误差为:532.999616
bestClusterToSpilt =
1
bestCentSet =
-3.3824 -2.9473
2.8029 -2.7315
biCentSet =
-3.3824 -2.9473
0.0825 2.9480
2.8029 -2.7315
0 0
第1个cluster被划分后的误差为:395.669052
第2个cluster被划分后的误差为:149.954305
第3个cluster被划分后的误差为:393.431098
bestClusterToSpilt =
2
bestCentSet =
2.6265 3.1087
-2.4615 2.7874
biCentSet =
-3.3824 -2.9473
2.6265 3.1087
2.8029 -2.7315
-2.4615 2.7874
最终效果图
运用二分K-means算法进行聚类的时候,不同的初始质心聚类结果还是会稍微有点不同,因为实际上这也只是弱化随机质心对聚类结果的影响而已,并不能消除其影响,不过最终还是能收敛到全局最小。
matlab disteclud,机器学习实战ByMatlab(四)二分K-means算法相关推荐
- matlab disteclud,机器学习实战ByMatlab(3)K-means算法
K-means算法属于无监督学习聚类算法,其计算步骤还是挺简单的,思想也挺容易理解,而且还可以在思想中体会到EM算法的思想. K-means 算法的优缺点: 1.优点:容易实现 2.缺点:可能收敛到局 ...
- matlab 职坐标,机器学习入门之机器学习实战ByMatlab(三)K-means算法
本文主要向大家介绍了机器学习入门之机器学习实战ByMatlab(三)K-means算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助.K-means算法属于无监督学习聚类算法,其计算步 ...
- 统计学方法机器学习实战(二) K近邻算法
目录 一.前言: 二.理论难点: 距离度量: 欧式距离: 三.数据可视化 四.数据归一化: 五.代码实践: 理论补充 实验一: 海伦约会 实验二 使用sklearn实现knn 六.总结 1.kNN算法 ...
- 《机器学习实战》——kNN(k近邻算法)
原作者写的太好了,包括排版都特别整齐(其中有一个错误之处就是在约会网站配对效果判定的时候,列表顺序不对,导致结果有误,这里我已做出修改) 原作者和出处:http://blog.csdn.net/c40 ...
- 类聚算法matlab,机器学习实战ByMatlab(一)KNN算法
KNN 算法其实简单的说就是"物以类聚",也就是将新的没有被分类的点分类为周围的点中大多数属于的类.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中 ...
- matlab 职坐标,机器学习入门之机器学习实战ByMatlab(四)二分K-means算法
本文主要向大家介绍了机器学习入门之机器学习实战ByMatlab(四)二分K-means算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助.前面我们在是实现K-means算法的时候,提到 ...
- k均值算法 二分k均值算法_如何获得K均值算法面试问题
k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...
- k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类
k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...
- 机器学习实战-65:主成因分析降维算法(Principal Component Analysis)
机器学习实战-65:主成因分析降维算法(PCA) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是 ...
最新文章
- java.lang AAPT_android R.java aapt
- 第四篇:mysql管理工具
- VC socket api使用引入
- docker下,一行命令搭建elasticsearch6.5.0集群(带head插件和ik分词器)
- SOA实现方式与模式
- WebService的相关概念1
- JavaScript学习随记——属性类型
- 王小云:“设谜”与“猜谜”,实现中国“密码梦”
- C#中List与IList的区别
- scala学习-12-scala读取java项目下Src目录下的properties文件
- 带滤镜拍照的app_这8款拍照修图APP,简直就是逼格神器
- html 文字竖着排引号,文字竖排演示
- 阿里巴巴Java面试题
- CAN:CAN矩阵、CAN网络、DBC、MDF关系
- 保持numlock处于开启状态
- 华中农业计算机硕士就业,华中农业大学好就业吗?附华中农业大学就业率最高的专业名单...
- MySQL 生成指定长度的随机字符串
- Android类似钉钉类的APP 实现禁止用户虚拟定位
- 逝去的2009(四)
- 清华大学胡事民是计算机视觉,ResNet也能用在3D模型上了,清华“计图”团队新研究已开源...
热门文章
- 英语采访问题之:你每天上班的动机是什么?
- 如何用SAP Cloud for Customer的手机App创建销售订单
- 12-factor应用和微服务架构应用的区别
- paraView做动画(终极教程)
- alpine linux安装ftp,如何在Alpine Linux上安装GLPK?
- python怎么显示汉字_mac在matplotlib中显示中文的操作方法
- html如何左侧固定div,详解左右宽度固定中间自适应html布局解决方案
- canvas 元素绑定事件_绘制SVG内容到Canvas的HTML5应用
- linux设置静态IP及克隆后修改IP和hostname
- 用户访问共享计算机没有权限,win7共享没有权限访问 共享文件访问权限的方法...