机器学习实战ByMatlab(三)K-means算法

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

K-means 算法的优缺点:

1.优点:容易实现

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

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

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

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

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

样本数据中没有了y,K-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 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的质心为 “ + ”

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

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

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

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

时间: 2024-10-12 21:33:34

机器学习实战ByMatlab(三)K-means算法的相关文章

python机器学习实战(三)

python机器学习实战(三) 版权声明:本文为博主原创文章,转载请指明转载地址 www.cnblogs.com/fydeblog/p/7277205.html  前言 这篇博客是关于机器学习中基于概率论的分类方法--朴素贝叶斯,内容包括朴素贝叶斯分类器,垃圾邮件的分类,解析RSS源数据以及用朴素贝叶斯来分析不同地区的态度. 操作系统:ubuntu14.04 运行环境:anaconda-python2.7-jupyter notebook 参考书籍:机器学习实战和源码,机器学习(周志华) not

《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包括对当中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的全部算法源码和算法所用到的源文件,有须要的留言 ====================================================

机器学习实战ByMatlab(四)二分K-means算法

前面我们在是实现K-means算法的时候,提到了它本身存在的缺陷: 1.可能收敛到局部最小值 2.在大规模数据集上收敛较慢 对于上一篇博文最后说的,当陷入局部最小值的时候,处理方法就是多运行几次K-means算法,然后选择畸变函数J较小的作为最佳聚类结果.这样的说法显然不能让我们接受,我们追求的应该是一次就能给出接近最优的聚类结果. 其实K-means的缺点的根本原因就是:对K个质心的初始选取比较敏感.质心选取得不好很有可能就会陷入局部最小值. 基于以上情况,有人提出了二分K-means算法来解

机器学习实战笔记2(k-近邻算法)

1:算法简单描述 给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签.简称kNN.通常k是不大于20的整数,这里的距离一般是欧式距离. 2:python代码实现 创建一个kNN.py文件,将核心代码放在里面了. (1)   创建数据 #创造数据集 def createDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labe

机器学习实战ByMatlab(二)PCA算法

PCA 算法也叫主成分分析(principal components analysis),主要是用于数据降维的. 为什么要进行数据降维?因为实际情况中我们的训练数据会存在特征过多或者是特征累赘的问题,比如: 一个关于汽车的样本数据,一个特征是"km/h的最大速度特征",另一个是"英里每小时"的最大速度特征,很显然这两个特征具有很强的相关性 拿到一个样本,特征非常多,样本缺很少,这样的数据用回归去你和将非常困难,很容易导致过度拟合 PCA算法就是用来解决这种问题的,其

机器学习实战ByMatlab(一)KNN算法

KNN 算法其实简单的说就是"物以类聚",也就是将新的没有被分类的点分类为周围的点中大多数属于的类.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中最为临近(欧式距离进行判断)的K个点大都属于某一个类,那么该样本就属于这个类.这就是物以类聚的思想. 当然,实际中,不同的K取值会影响到分类效果,并且在K个临近点的选择中,都不加意外的认为这K个点都是已经分类好的了,否则该算法也就失去了物以类聚的意义了. KNN算法的不足点: 1.当样本不平衡时,比如一个类的

机器学习实战笔记-利用K均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好 簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么.聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样.因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification ). 聚类分析试图将相似对象归人同一簇,将不相似对象归到不

机器学习实战ByMatlab(五)Logistic Regression

什么叫做回归呢?举个例子,我们现在有一些数据点,然后我们打算用一条直线来对这些点进行拟合(该曲线称为最佳拟合曲线),这个拟合过程就被称为回归. 利用Logistic回归进行分类的主要思想是: 根据现有数据对分类边界线建立回归公式,以此进行分类. 这里的"回归"一词源于最佳拟合,表示要找到最佳拟合参数集.训练分类器时的嘴阀就是寻找最佳拟合曲线,使用的是最优化算法. 基于Logistic回归和Sigmoid函数的分类 优点:计算代价不高,易于理解和实现 缺点:容易欠拟合,分类精度可能不高

机器学习实战笔记-利用AdaBoost元算法提高分类性能

做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法(meta-algorithm ) 背后的思路.元算法是对其他算法进行组合的一种方式 7.1 基于数据集多重抽样的分类器 ??我们自然可以将不同的分类器组合起来,而这种组合结果则被称为集成方法(ensemblemethod)或者元算法(meta-algorithm).使用集成方法时会有多种形式:可以是不同算法的集成,也可以是同一算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类