【R语言】| 聚类分析(二)
聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类,使得同一个类中的数据对象的相似性尽可能大,同时使不同类中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类的数据尽量分离。
3. 系统(层次)聚类法
系统(层次)聚类法的基本思想是:开始将n个样品各自作为一类,并规定样品之间的距离【1】,然后将距离最近的两类合并成一个新类,计算新类与其他类的距离【2】,重复进行两个最近类的合并,每次减少一类直至所有的样品合并为一类。
【1】
r语言中使用dist(x, method = "euclidean",diag = FALSE, upper = FALSE, p = 2) 来计算距离。其中x是样本矩阵或者数据框。method表示计算哪种距离,method的取值有:
euclidean |
欧几里德距离,简称欧氏距离 |
maximum |
切比雪夫距离 |
manhattan |
绝对值距离 |
canberra |
兰氏距离 |
minkowski |
明考夫斯基距离,使用时要指定p值 |
binary |
定性变量距离(注) |
注:定性变量距离
样品 |
性别 |
外语 |
职业 |
||||
男 |
女 |
英语 |
日语 |
法语 |
教师 |
学生 |
|
X1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
X2 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
★M0: 0:0的配对数,M1: 1:1的配对数, M2:不配对数
★上例中,M0=2,M1=1,M2=4,样本X1与X2之间的距离为D=M2/M1+M2=4/1+4=4/5=0.8
★diag是逻辑变量,当diag = TRUE时,给出对角线上的距离。
★upper是逻辑变量,当upper = TRUE时,给出上三角矩阵的值(缺省值仅给出下三角矩阵的值)。
★p:为minkowski距离的幂次
【2】
r语言中使用hclust(d, method = "complete", members=NULL) 来进行层次聚类。其中d为距离矩阵。
method表示类的合并方法,有:
single |
最短距离法 |
complete |
最长距离法 |
median |
中间距离法 |
mcquitty |
相似法 |
average |
类平均法 |
centroid |
重心法 |
ward |
离差平方和法 |
图中两圆表示两类,包含样本点1,2,3的记为类A,包含样本点4,5的记为类B。
可以计算出六个距离(采用欧氏距离or马氏距离or ......):d14 , d15, d24, d25, d34, d35
采用最短距离法表示类A与类B距离:d24
采用最长距离法表示类A与类B距离:d15
其他方法(重心法、离差平方和法......)计算规则点击阅读原文
★代码实现:
#single linkage(单链接法=最短距离法)
#complete linkage(完全链接法=最长距离法)
#average linkage(平均链接法)
#Ward's method(离差平方和)
fit_hc=hclust(dist(new_iris),method="complete")
print(fit_hc)
plot(fit_hc,hang=-1,cex=0.5)#hang=-1可以使x轴的标记在y=-1的位置显示
#cex调整标记大小
rect.hclust(fit_hc,k=3,border="red")
图1 系统聚类法
wode
4. 密度聚类法
#DBSCAN从样本中找出高密度和低密度区完成聚类,需要设定半径和阈值(minpoints)
#核心点(core points):周围点的个数大于阈值;
#边缘点(border points):不是核心点,但落在某个核心点的邻域(eps)内
#噪声点(noise point):组成了低密度区,并包围着高密度区域
★代码实现:
library(ggplot2)
set.seed(665544)
x1<-seq(0,pi,length.out=100)
y1<-sin(x1)+0.1*rnorm(100)
x2<-1.5+seq(0,pi,length.out=100)
y2<-cos(x2)+0.1*rnorm(100)
data<-data.frame(c(x1,x2),c(y1,y2))
names(data)<-c('x','y')
qplot(data$x,data$y)
#画出正余弦散点图
图2 正余弦散点图
★代码实现:
#密度聚类
p<-ggplot(data,aes(x,y))
install.packages("fpc")
library(fpc)
model<-dbscan(data,eps=0.6,MinPts=4)
p+geom_point(size=2.5,aes(colour=factor(model$cluster)))+theme(legend.position='bottom')
#K均值聚类
model2<-kmeans(data,centers=2,nstart=10)
p+geom_point(size=2.5,aes(colour=factor(model2$cluster)))+theme(legend.position='bottom')
图3 密度聚类图
图4 k-means聚类图
链接:https://pan.baidu.com/s/1r_IRN0AsgpGrczN4c-_gfg
提取码:0wvp