聚类的基本思想
俗话说"物以类聚,人以群分"
聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中。簇内的对象越相似,聚类的效果越好。
定义:给定一个有个对象的数据集,聚类将数据划分为个簇,而且这个划分满足两个条件:(1)每个簇至少包含一个对象;(2)每个对象属于且仅属于一个簇。
基本思想:对给定的,算法首先给出一个初始的划分方法,以后通过反复迭代的方法改变划分,使得每一次改进之后的划分方案都较前一次更好。
监督学习(supervised learning):是对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。【神经网络和决策树】
无监督学习(unsupervised learning):是对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。【聚类】
K-均值(K-means)聚类算法
聚类分析(cluster analysis)试图将相似对象归入同一簇,将不相似对象归到不同簇。
K-Means: K-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。该算法原理简单并便于处理大量数据。
K-中心点:K-均值算法对孤立点的敏感性,K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。
系统聚类:也称为层次聚类,分类的单位由高到低呈树形结构,且所处的位置越低,其所包含的对象就越少,但这些对象间的共同特征越多。该聚类方法只适合在小数据量的时候使用,数据量大的时候速度会非常慢。
K-Means算法
K-Means算法是最为经典的基于划分的聚簇方法,是十大经典数据挖掘算法之一。简单的说K-Means就是在没有任何监督信号的情况下将数据分为K份的一种方法。聚类算法就是无监督学习中最常见的一种,给定一组数据,需要聚类算法去挖掘数据中的隐含信息。聚类算法的应用很广:顾客行为聚类,google新闻聚类等。
K值是聚类结果中类别的数量。简单的说就是我们希望将数据划分的类别数
一、K-Means算法基本思想
在数据集中根据一定策略选择K个点作为每个簇的初始中心,然后观察剩余的数据,将数据划分到距离这K个点最近的簇中,也就是说将数据划分成K个簇完成一次划分,但形成的新簇并不一定是最好的划分,因此生成的新簇中,重新计算每个簇的中心点,然后在重新进行划分,直到每次划分的结果保持不变。在实际应用中往往经过很多次迭代仍然达不到每次划分结果保持不变,甚至因为数据的关系,根本就达不到这个终止条件,实际应用中往往采用变通的方法设置一个最大迭代次数,当达到最大迭代次数时,终止计算。
二、算法实现
具体的算法步骤如下:
- 随机选择K个中心点
- 把每个数据点分配到离它最近的中心点;
- 重新计算每类中的点到该类中心点距离的平均值
- 分配每个数据到它最近的中心点;
- 重复步骤3和4,直到所有的观测值不再被分配或是达到最大的迭代次数(R把10次作为默认迭代次数)。
K-means聚类能处理比层次聚类更大的数据集。另外,观测值不会永远被分到一类中,当我们提高整体解决方案时,聚类方案也会改动。不过不同于层次聚类的是,K-means会要求我们事先确定要提取的聚类个数
适用范围及缺陷
K-Menas算法试图找到使平方误差准则函数最小的簇。当潜在的簇形状是凸面的,簇与簇之间区别较明显,且簇大小相近时,其聚类结果较理想。对于处理大数据集合,该算法非常高效,且伸缩性较好。
但该算法除了要事先确定簇数K和对初始聚类中心敏感外,经常以局部最优结束,同时对“噪声”和孤立点敏感,并且该方法不适于发现非凸面形状的簇或大小差别很大的簇。
克服缺点的方法:使用尽量多的数据;使用中位数代替均值来克服outlier的问题。
三、K-Means R语言实战
一般情况下,没有必要自己实现K-Means算法,有很多成熟的软件包实现了K-Means算法,R语言提供了kmeans方法进行聚类分析。
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE)
# centers为提取的聚类数目
进行K-Means划分时,首先要确定划分簇数K,如果对数据有先验性认知可根据对数据的认知确定K,在对数据没有先验性认知的情况下,通常通过数据可视化方法确定K值。我们以机器学习中常用的iris数据集为例演示如何进行K-Means聚类分析。首先使用主成分分析(PCA)等降维方法将数据将降维投影到二维平面上,通过人工观察确定划分数。
library(ggplot2)
library(ggfortify) #使用ggfortify包进行聚类结果的可视化展示
newiris <- iris;
newiris$Species <- NULL;
autoplot(prcomp(newiris))
通过上面的图形可清晰的看到,数据被划分成两部分,所以K至少大于2,尽管左右两边的数据被清晰的分开,但每部分数据是否还可以进一步划分成小聚簇呢,从图上看不出来。回顾一下K-Means的思想,每个簇内间距尽可能小,我们尝试使用不同划分数K进行K-Means聚类,看看不同划分的簇内间距变化情况。
wss <- c(1:15)
for(i in 1:15) wss[i] <- sum(kmeans(newiris,i)$withinss) plot(wss)
从图中可见,划分数在4-15之间,簇内间距变化很小,基本上是水平直线,因此可以选择K=4(拐点附近位置)作为划分数。聚类计算完成后,我们使用mds方法观察一下聚类结果。
newiris <- iris;
newiris$Species <- NULL; dist.e <- dist(newiris,method='euclidean') #
计算各观测值之间的欧式距离
mds <- cmdscale(dist.e, k=2, eig=T) #cmdscale()
计算MDS,为可视化,取前两个主坐标
x <- mds$points[,1]
y <- mds$points[,2]
k <- kmeans(newiris, 4)
ggplot(data.frame(x,y), aes(x,y)) + geom_point(aes(colour = factor(k$cluster)))
从图中可以观察到,数据被清晰的划分为4个不同的区域。
r语言中使用dist(x, method = "euclidean",diag = FALSE, upper = FALSE, p = 2) 来计算距离。其中x是样本矩阵或者数据框。method表示计算哪种距离。method的取值有:
euclidean 欧几里德距离,就是平方再开方。
maximum 切比雪夫距离
manhattan 绝对值距离
canberra Lance 距离
minkowski 明科夫斯基距离,使用时要指定p值
binary 定性变量距离.
定性变量距离: 记m个项目里面的 0:0配对数为m0 ,1:1配对数为m1,不能配对数为m2,距离=m1/(m1+m2);
diag 为TRUE的时候给出对角线上的距离。upper为TURE的时候给出上三角矩阵上的值。
四、更进一步
从上面的内容中,我们知道K-Means通过数据间距远近来进行划分操作,对于数值型数据而言,很容易通过欧几里得距离计算数据间的距离,对于分类等类型的数据则无法通过欧几里得距离计算数据的距离。韩家炜教授所著的《数据挖掘 概念与技术》2.4 度量数据的相似性和相异性章节中给出了计算数据间距的具体方法,需要时可按照书中方法进行数据间距计算。
需要说明的是,R语言中的kmeans函数只能接受数值型数据,如果需要对分类等类型的数据进行聚类计算,只能自己实现K-Means算法了,先计算数据距离,然后在编写K-Means算法进行聚类计算。值得一提的是在R语言中使用edit(kmeans)可以查看kmeans方法的源代码,可以参照源代码实现定制的K-Means算法。
欧几里德距离矩阵
K-Means的细节问题
-
K值怎么定?我怎么知道应该几类?
答:这个真的没有确定的做法,分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的等。或者可以把各种K值算出的SSE做比较,取最小的SSE的K值。
-