机器学习:K-means聚类算法

机器学习:K-means聚类算法

K-means(K均值)是基于数据划分的无监督聚类算法,是图像分割和数据挖掘领域常用的算法。

(一) K-means算法的基本原理

聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相识度自动进行分类。聚类算法可以分为基于划分的方法、基于联通性的方法、基于密度的算法、基于概率分布模型的算法等,K-means属于基于划分的聚类方法。
基本K-Means算法的思想很简单,事先确定常数K,常数K意味着最终的聚类类别数,
(1)首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中;
(2)接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。
   由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

(二)K-means算法的缺陷与改进

2.1 局部最优

K-means算法除了可能受到离群点的影响之外,由于它采取的是随机初始化k个簇的质心的方式,因此聚类效果有可能陷入局部最优解的情况,局部最优解虽然效果不错,但不如全局最优解的聚类效果更好。

2.2 误差平方和(SSE)

一种用于度量聚类效果的指标是SSE,即误差平方和, 为所有簇中的全部数据点到簇中心的误差距离的平方累加和。SSE的值如果越小,表示数据点越接近于它们的簇中心,即质心,聚类效果也越好。因为,对误差取平方后,就会更加重视那些远离中心的数据点。

2.3 降低SSE

改善聚类效果的做法就是降低SSE,在保持簇数目不变的情况下提高簇的质量。

一种方法是:我们可以将具有最大SSE值得簇划分为两个簇(因为,SSE最大的簇一般情况下,意味着簇内的数据点距离簇中心较远),具体地,可以将最大簇包含的点过滤出来并在这些点上运行K-means算法,其中k设为2.

同时,当把最大的簇分为两个簇之后,为了保证簇的数目是不变的,我们可以再合并两个簇。

一方面我们可以合并两个最近的质心所对应的簇,即计算所有质心之间的距离,合并质心距离最近的两个质心所对应的簇。

另一方面,我们可以合并两个使得SSE增幅最小的簇,显然,合并两个簇之后SSE的值会有所上升,那么为了最好的聚类效果,应该尽可能使总的SSE值小,所以就选择合并两个簇后SSE涨幅最小的簇。具体地,就是计算合并任意两个簇之后的总得SSE,选取合并后最小的SSE对应的两个簇进行合并。这样,就可以满足簇的数目不变。

对已经聚类完成的结果进行改善的方法,在不改变k值的情况下,上述方法能够起到一定的作用,会使得聚类效果得到一定的改善。那么,下面要讲到的是一种克服算法收敛于局部最小值问题的K-means算法。即二分k-均值算法。

( 三) 二分K-means聚类

按照K-means聚类规则很容易陷入局部最小值,马尔科夫随机场中配置的代价函数不是好的目标函数,为了解决该问题,有人提出二分K-means聚类算法。首先把所有样本作为一个簇,接着选择其中一个簇继续进行二分。选择哪一个簇二分的原则就是能否使得误差平方和SSE尽可能小。该算法有了好的目标函数,SSE的计算其实就是距离和。

(四)基于K-means的图像分割实例

首先对原始图像进行颜色空间转换,从RGB通道转换到Lab颜色空间。
然后在二维的ab通道建立图像像素点构成的样本空间如下图所示。
接着对该样本集合利用K-means进行聚类,当设定类别个数k=5时,可以得到如图所示的分割结果,每一种颜色代表不同的聚类类别。
K-means有效的根据图像的颜色信息对图像的不同区域进行标记。

 基于matlab的代码如下:


function kmeans_demo1()
clear;close all;clc;
%% 读取测试图像
im = imread('city.jpg');
imshow(im), title('Imput image');
%% 转换图像的颜色空间得到样本
cform = makecform('srgb2lab');
lab = applycform(im,cform);
ab = double(lab(:,:,2:3));
nrows = size(lab,1); ncols = size(lab,2);
X = reshape(ab,nrows*ncols,2)';
figure, scatter(X(1,:)',X(2,:)',3,'filled');  box on; %显示颜色空间转换后的二维样本空间分布
%print -dpdf 2D1.pdf
%% 对样本空间进行Kmeans聚类
k = 5; % 聚类个数
max_iter = 100; %最大迭代次数

[centroids, labels] = run_kmeans(X, k, max_iter); 

%% 显示聚类分割结果
figure, scatter(X(1,:)',X(2,:)',3,labels,'filled'); %显示二维样本空间聚类效果
hold on; scatter(centroids(1,:),centroids(2,:),60,'r','filled')
hold on; scatter(centroids(1,:),centroids(2,:),30,'g','filled')
box on; hold off;
%print -dpdf 2D2.pdf

pixel_labels = reshape(labels,nrows,ncols);
rgb_labels = label2rgb(pixel_labels);
figure, imshow(rgb_labels), title('Segmented Image');
%print -dpdf Seg.pdf
end

function [centroids, labels] = run_kmeans(X, k, max_iter)
% 该函数实现Kmeans聚类
% 输入参数:
%                   X为输入样本集,dxN
%                   k为聚类中心个数
%                   max_iter为kemans聚类的最大迭代的次数
% 输出参数:
%                   centroids为聚类中心 dxk
%                   labels为样本的类别标记

%% 采用K-means++算法初始化聚类中心
  centroids = X(:,1+round(rand*(size(X,2)-1)));
  labels = ones(1,size(X,2));
  for i = 2:k
        D = X-centroids(:,labels);
        D = cumsum(sqrt(dot(D,D,1)));
        if D(end) == 0, centroids(:,i:k) = X(:,ones(1,k-i+1)); return; end
        centroids(:,i) = X(:,find(rand < D/D(end),1));
        [~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'));
  end
  
%% 标准Kmeans算法
  for iter = 1:max_iter
        for i = 1:k, l = labels==i; centroids(:,i) = sum(X(:,l),2)/sum(l); end
        [~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'),[],1);
  end
  
end

程序运行结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(五)K-means的特点

K-means聚类算法是最为经典的机器学习算法之一,其目的在于把输入的样本向量分为k个组,求每组的聚类中心,使非相似性(距离)指标的价值函数(目标函数)最小。

K-means算法简洁快速,假设均方误差是计算群组分散度的最佳函数,对于满足正态分布的数据聚类效果很好。可应用于机器学习、数据挖掘、模式识别、图像分析和生物信息学等。

K-means的性能依赖于聚类中心的初始位置,不能确保收敛于最优解,对孤立点敏感。可以采用一些前端方法,首先计算出初始聚类中心,或者每次用不同的初始聚类中心将该算法运行多次,然后择优确定。

虽然二分K-mean聚类算法改进了K-mean的不足,但是它们共同点缺点就是必须事先确定k的值,不合适的k可能返回较差的结果。对于海量数据,如何确定k的值就是学术界一直在研究的问题,常用方法是层次聚类,或者借鉴LDA聚类分析。

代码地址(可直接运行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值