聚类
聚类
关键度量指标:距离
常用距离
- 绝对值距离
绝对值距离也称为“棋盘距离”或“城市街区距离”。 - 欧氏(Euclide)距离
- 闵可夫斯基(Minkowski)距离
不难看出绝对值距离和Euclide距离是Minkowski距离的特例
当各变量的单位不同或测量值的范围相差很大时,不应直接采用Minkowski距离,而应先对各变量的数据作标准化处理,然后再用标准化后的数据进行计算 - 切比雪夫(Chebyshev)距离
它是Minkowski距离中的情况 - 马氏(Mahalanobis)距离
其中为样本方差矩阵
用Mahalanobis距离的好处是考虑到各变量之间的相关性,并且与变量的单位无关,但Mahalanobis距离有一个很大的缺陷,就是Mahalanobis距离公式中的难以确定 - Lance和Williams距离
其中
disst()函数
> x1=c(1,2,3,4,5)
> x2=c(3,2,1,4,6)
> x3=c(5,3,5,6,2)
> x=data.frame(x1,x2,x3)
> dist(x,method="euclidean")
1 2 3 4
2 2.449490
3 2.828427 2.449490
4 3.316625 4.123106 3.316625
5 5.830952 5.099020 6.164414 4.582576
> dist(x,method="minkowski")
1 2 3 4
2 2.449490
3 2.828427 2.449490
4 3.316625 4.123106 3.316625
5 5.830952 5.099020 6.164414 4.582576
> dist(x,method="minkowski",p=5)
1 2 3 4
2 2.024397
3 2.297397 2.024397
4 3.004922 3.143603 3.004922
5 4.323101 4.174686 5.085057 4.025455
- “euclidean”——Euclide距离
- “maximum”——Chebyshev距离
- “manhattan”——绝对值距离
- “canberra”——Lance距离
- “minkowski”——Minkowski距离,其中p是Minkowski距离的阶数
- “binary”——定性变量距离
数据中心化与标准化变换
- 目的:使到各个变量平等地发挥作用
- scale()函数
- 极差化,sweep()函数
> x
x1 x2 x3
1 1 3 5
2 2 2 3
3 3 1 5
4 4 4 6
5 5 6 2
> scale(x,center=T,scale=T)
x1 x2 x3
[1,] -1.2649111 -0.1039750 0.4868645
[2,] -0.6324555 -0.6238503 -0.7302967
[3,] 0.0000000 -1.1437255 0.4868645
[4,] 0.6324555 0.4159002 1.0954451
[5,] 1.2649111 1.4556507 -1.3388774
attr(,"scaled:center")
x1 x2 x3
3.0 3.2 4.2
attr(,"scaled:scale")
x1 x2 x3
1.581139 1.923538 1.643168
(凝聚的)层次聚类法
- 思想
- 开始时,各个样本各自为一类
- 规定某种度量作为样本之间的距离及类与类之间的距离,并计算之
- 将距离最短的两个类合并为一个新类
- 重复2-3,即不断合并最近的两个类,每次减少一个类,直至所有样本被合并为一类
hclust()函数
- 例子
> x<-c(1,2,6,8,11);dim(x)<-c(5,1);
> x
[,1]
[1,] 1
[2,] 2
[3,] 6
[4,] 8
[5,] 11
> d<-dist(x)
> d
1 2 3 4
2 1
3 5 4
4 7 6 2
5 10 9 5 3
hc1<-hclust(d,"single");hc2<-hclust(d,"complete")
> hc3<-hclust(d,"median");hc4<-hclust(d,"mcquitty")
> opar<-par(mfrow=c(2,2))
> plot(hc1,hang=-1);plot(hc2,hang=-1)
> plot(hc3,hang=-1);plot(hc4,hang=-1)
> par(opar)
- “single”——最短距离法
- “complete”——最长距离法
- “median”——中间距离法
- “mcquitty”——Mcquitty相似法
- “averrage”——类平均法
- “centroid”——重心法
- “ward”——离差平方和法
类个数的确定
在聚类过程中类的个数如何确定才是适宜的呢?这是一个十分困难的问题,至今仍未找到令人满意的 方法,但这又是一个不可回避的问题。目前基本的方法有三种:
- 给定一个阈值,通过观察谱系图,给出一个你认为的阈值T,要求类与类之间的距离要大于T
- 观测样本的散点图,对于二维或三维变量的样本,可以通过观测数据的散点图来确定类的个数
- 使用统计量,通过一些统计量来确定类的个数
- 根据谱系图确定分类个数的推测
Bemirmen(1972)提出了一个根据研究目的来确定适当的分类方法,并提出一些根据谱系图来分析的准则:
准则A 各类重心的距离必须很大
准则B确定的类中,各类所包含的元素都不要太多
准则C类的个数必须符合实用目的
准则D 若采用几种不同的聚类方法处理,则在各自的聚类图中应发现相同的类
在R语言中,有个叫rect.hclust()的函数,可以用来确定类的个数。
rect.hclust(tree,kk=NULL,which=NULL,x=NULL,h=NULL,border=2,cluster=NULL)
> plot(hc1,hang=-1)
> rect.hclust(hc1,k=2)