数据的分类—聚类分析韩猛饮料数据(drink.txt)•16种饮料的热量、咖啡因、钠及价格四种变量•如何根据以上数据对16种饮料进行分类呢?•对数据进行分类就需要知道距离?你知道那些距离?如何度量距离远近?•如果想要对100个学生进行分类,而仅知道他们的数学成绩,则只好按照数学成绩分类;这些成绩在直线上形成100个点。这样就可以把接近的点放到一类。•如果还知道他们的物理成绩,这样数学和物理成绩就形成二维平面上的100个点,也可以按照距离远近来分类。•三维或者更高维的情况也是类似;只不过三维以上的图形无法直观地画出来而已。•在饮料数据中,每种饮料都有四个变量值。这就是四维空间点的问题了。两个距离概念•按照远近程度来聚类需要明确两个概念:一个是点和点之间的距离,一个是类和类之间的距离。•点间距离有很多定义方式。最简单的是歐氏距离。•当然还有一些和距离相反但起同样作用的概念,比如相似性等,两点越相似度越大,就相当于距离越短。两个距离概念•由一个点组成的类是最基本的类;如果每一类都由一个点组成,那么点间的距离就是类间距离。但是如果某一类包含不止一个点,那么就要确定类间距离,•类间距离是基于点间距离定义的:比如两类之间最近点之间的距离可以作为这两类之间的距离,也可以用两类中最远点之间的距离或各类的中心之间的距离来作为类间距离。•在计算时,各种点间距离和类间距离的选择是通过统计软件的选项实现的。不同的选择的结果会不同,但一般不会差太多。向量x=(x1,…,xp)与y=(y1,…,yp)之间的距离或相似系数:2()iiixy欧氏距离:Euclidean平方欧氏距离:SquaredEuclidean2()iiixy夹角余弦(相似系数1):cosine22(1)cosiiixyxyiiiixyCxyPearsoncorrelation(相似系数2):Chebychev:Maxi|xi-yi|Block(绝对距离):Si|xi-yi|Minkowski:1()qqiiixy当变量的测量值相差悬殊时,要先进行标准化.如R为极差,s为标准差,则标准化的数据为每个观测值减去均值后再除以R或s.当观测值大于0时,有人采用Lance和Williams的距离||1iiiiixypxy22()()(2)()()iiixyxyiiiixxyyCrxxyy类Gp与类Gq之间的距离Dpq(d(xi,xj)表示点xi∈Gp和xj∈Gq之间的距离)min(,)pqijDdxx最短距离法:最长距离法:重心法:离差平方和:(Wald)类平均法:(中间距离,可变平均法,可变法等可参考各书).在用欧氏距离时,有统一的递推公式12121212()'(),()'(),()'()ipjqkpqipipjqjqxGxGkipqxGGDxxxxDxxxxDxxxxDDDDmax(,)pqijDdxxmin(,)pqpqDdxx121(,)ipjqpqijxGxGDdxxnn最短距离(NearestNeighbor)x21•x12•x22•x11•13d最长距离(FurthestNeighbor)•••x11•x21••••12d••••••991dd组间平均连接(Between-groupLinkage)组内平均连接法(Within-groupLinkage)1234566ddddddx21•x12•x22•x11•重心法(Centroidclustering):均值点的距离••11,xy22,xy离差平方和法连接2,41,56,522(23)(43)222(65.5)(55.5)0.522(13)(53)8红绿(2,4,6,5)8.75离差平方和增加8.75-2.5=6.25黄绿(6,5,1,5)14.75离差平方和增加14.75-8.5=6.25黄红(2,4,1,5)10-10=0故按该方法的连接和黄红首先连接。•有了上面的点间距离和类间距离的概念,就可以介绍聚类的方法了。这里介绍两个简单的方法。系统聚类法•系统聚类法(hierarchicalclusteringmethod)是聚类分析中用的最多的一种。•基本思想:开始将n个样本各自作为一类,并规定样本之间的距离与类之间的距离,然后将距离最近的两类合并成一个新类,并计算新类与其他类之间的距离,重复进行两个最近类的合并,每次减少一类,直至所有的样本合并为一类。•当然我们可以选择以上距离的任意一种进行聚类。系统聚类的R实现•在R中计算距离的函数:•dist(x,method=euclidean,diag=FALSE,upper=FALSE,p=2)•“euclidean”—Euclide距离•“maximum”—距离•“manhattan”—绝对值距离•“canberra”—Lance距离•“minkowski”—Minkowski距离•“binary”—定性变量距离•R中数据的标准函数为:•scale(x,center=TRUE,scale=TRUE)•在R中hclust()函数提供了系统聚类的函数,plot()可以画出树状图。•hclust(d,method=complete,members=NULL)•“single”—最短距离法•“complete”----最长距离法•“median”—中间距离法•“mcquitty”—Mcquitty相似法•“average”—类平均法•“centroid”—重心法•“ward”—离差平方法•plot()画出树状图的格式为•plot(x,labels=NULL,hang=0.1,axes=TRUE,frame.plot=FALSE,ann=TRUE,main=ClusterDendrogram,sub=NULL,xlab=NULL,ylab=Height,...)•例1续•读入数据•d-read.table(C:\\Users\\nf\\Desktop\\drink.txt,h=T)•dist()的作用是将原始数据转化为距离结构的矩阵•hc=hclust(dist(d),ave)•Plot(hc)•R中有一个确定类个数的函数,rect.hclust()。•rect.hclust(tree,k=NULL,which=NULL,x=NULL,h=NULL,border=2,cluster=NULL)•Tree是hclust()生成的数据结构。•plclust(hc,hang=-1);re-rect.hclust(hc,k=3)•plclust()类似于plot()•plclust(tree,hang=0.1,unit=FALSE,level=FALSE,hmin=0,square=TRUE,labels=NULL,plot.=TRUE,axes=TRUE,frame.plot=FALSE,ann=TRUE,main=,sub=NULL,xlab=NULL,ylab=Height)动态聚类法(K均值聚类)•前面说过,聚类可以走着瞧,不一定事先确定有多少类;但是这里的k-均值聚类(k-meanscluster,也叫快速聚类,quickcluster)却要求你先说好要分多少类。看起来有些主观,是吧!•假定你说分3类,这个方法还进一步要求你事先确定3个点为“聚类种子”(SPSS软件自动为你选种子);也就是说,把这3个点作为三类中每一类的基石。•然后,根据和这三个点的距离远近,把所有点分成三类。再把这三类的中心(均值)作为新的基石或种子(原来“种子”就没用了),再重新按照距离分类。•如此叠代下去,直到达到停止叠代的要求(比如,各类最后变化不大了,或者叠代次数太多了)。显然,前面的聚类种子的选择并不必太认真,它们很可能最后还会分到同一类中呢。下面用饮料例的数据来做k-均值聚类。•例1续•动态聚类的函数为kmeans()•Kmeans(x,centers,iter.max=10,nstart=1,algorithm=c(“Hartigan-Wong”,”Lloyd”,”Forgy”,MacQueen”))•Iter.max为最大迭代次数,centers为聚类个数•Algorithm为动态聚类的算法,默认为第一个。•km=kmeans(dist(d),5,20)•sort(km$cluster)SPSS实现(聚类分析)•K-均值聚类•以数据drink.sav为例,在SPSS中选择Analyze-Classify-K-MenasCluster,•然后把calorie(热量)、caffeine(咖啡因)、sodium(钠)、price(价格)选入Variables,•在NumberofClusters处选择3(想要分的类数),•如果想要知道哪种饮料分到哪类,则选Save,再选ClusterMembership等。•注意k-均值聚类只能做Q型聚类,如要做R型聚类,需要把数据阵进行转置。SPSS实现(聚类分析)•分层聚类•对drink.sav数据在SPSS中选择Analyze-Classify-HierarchicalCluster,•然后把calorie(热量)、caffeine(咖啡因)、sodium(钠)、price(价格)选入Variables,•在Cluster选Cases(这是Q型聚类:对观测值聚类),如果要对变量聚类(R型聚类)则选Variables,•为了画出树状图,选Plots,再点Dendrogram等。VerticalIcicleXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNumberofclusters12345678910111213141571615596314121181342101Case“冰柱图”(icicle)聚类要注意的问题•聚类结果主要受所选择的变量影响。如果去掉一些变量,或者增加一些变量,结果会很不同。•相比之下,聚类方法的选择则不那么重要了。因此,聚类之前一定要目标明确。聚类要注意的问题•另外就分成多少类来说,也要有道理。只要你高兴,从分层聚类的计算机结果可以得到任何可能数量的类。•但是,聚类的目的是要使各类之间的距离尽可能地远,而类中点的距离尽可能的近,并且分类结果还要有令人信服的解释。这一点就不是数学可以解决的了。