网站转html5,seo最新快速排名,二维码网页制作软件,小游戏秒玩入口K-means算法属于无监督学习聚类算法#xff0c;其计算步骤还是挺简单的#xff0c;思想也挺容易理解#xff0c;而且还可以在思想中体会到EM算法的思想。K-means 算法的优缺点#xff1a;1.优点#xff1a;容易实现2.缺点#xff1a;可能收敛到局部最小值#xff0c;在大…K-means算法属于无监督学习聚类算法其计算步骤还是挺简单的思想也挺容易理解而且还可以在思想中体会到EM算法的思想。K-means 算法的优缺点1.优点容易实现2.缺点可能收敛到局部最小值在大规模数据集上收敛较慢使用数据类型数值型数据以往的回归算法、朴素贝叶斯、SVM等都是有类别标签y的因此属于有监督学习而K-means聚类算法只有x没有y在聚类问题中我们的训练样本是其中每个Xi都是n维实数。样本数据中没有了yK-means算法是将样本聚类成k个簇具体算法如下1、随机选取K个聚类质心点记为2、重复以下过程直到收敛{对每个样例 i 计算其应该属于的类对每个类 j 重新计算质心}其中K是我们事先给定的聚类数目Ci 表示样本 i 与K个聚类中最近的那个类Ci的值是1到K中的一个质心uj代表我们对属于同一个类的样本中心的猜测。解释起来就是第一步天空上的我们随机抽取K个星星作为星团的质心然后对于每一个星星 i我们计算它到每一个质心uj的距离选取其中距离最短的星团作为Ci这样第一步每个星星都有了自己所属于的星团第二步对每个星团Ci我们重新计算它的质心uj(计算方法为对属于该星团的所有点的坐标求平均)不断重复第一步和第二步直到质心变化很小或者是不变。然后问题来了怎么样才算质心变化很小或者是不变或者说怎么判定答案就是畸变函数(distortion function)定义如下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 kMeansclcclearK 4;dataSet load(testSet.txt);[row,col] size(dataSet);% 存储质心矩阵centSet zeros(K,col);% 随机初始化质心for i 1:colminV 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 clusterChangeclusterChange false;% 计算每个点应该被分配的clusterfor i 1:row% 这部分可能可以优化minDist 10000;minIndex 0;for j 1:KdistCal distEclud(dataSet(i,:) , centSet(j,:));if (distCal minDist)minDist distCal;minIndex j;endendif minIndex ~ clusterAssment(i,1)clusterChange true;endclusterAssment(i,1) minIndex;clusterAssment(i,2) minDist;end% 更新每个cluster 的质心for j 1:KsimpleCluster find(clusterAssment(:,1) j);centSet(j,:) mean(dataSet(simpleCluster,:));endendfigure%scatter(dataSet(:,1),dataSet(:,2),5)for i 1:KpointCluster find(clusterAssment(:,1) i);scatter(dataSet(pointCluster,1),dataSet(pointCluster,2),5)hold onend%hold onscatter(centSet(:,1),centSet(:,2),300,)hold offend% 计算欧式距离function dist distEclud(vecA,vecB)dist sqrt(sum(power((vecA-vecB),2)));end效果如下这是正常分类的情况很明显被分为了4个类不同颜色代表不同的类cluster的质心为 “ ”当然这只是其中一种情况很有可能我们会出现下面这种情况这就是上面所说的K-means的缺点之一随机初始点的选择可能会让算法陷入局部最优解这时候我们只需重新运行一次程序即可。至于每一个看似都可以正常聚类的情况呢我们则利用上面所说的“畸变函数”来衡量聚类的效果当然是J越小聚类效果越好。实际使用的时候我们只需多次运行程序选取J最小的聚类效果。