前面和大家分享的分类算法属于有监督学习的分类算法,今天继续和小伙伴们分享无监督学习分类算法---聚类算法。聚类算法也因此更具有大数据挖掘的味道
聚类算法本质上是基于几何距离远近为标准的算法,最适合数据是球形的问题,首先罗列下常用的距离:
绝对值距离(又称棋盘距离或城市街区距离)
Euclide距离(欧几里德距离,通用距离)
Minkowski 距离(闵可夫斯基距离),欧几里德距离 (q=2)、绝对值距离(q=1)和切比雪夫距离(q=无穷大),这些都是闵可夫斯基的特殊情况。
Chebyshew(切比雪夫)距离
Mahalanobis距离(咱们前面介绍的马氏距离,这里复习一下)
Lance 和Wiliams距离
定性变量距离(二进制距离):
其中m1为所有项目中1-1配对的总数,m2是不配对的总数
R语言中,对上述的距离都有现成函数,只需要借参数加以制定即可,具体如下:
dist(x,method=”euclidean”,diag=FALSE,upper=FALSE,p=2) #欧式距离 dist(x,method=”maximum” ,diag=FALSE,upper=FALSE,p=2)#切比雪夫距离 dist(x,method=”manhattan” ,diag=FALSE,upper=FALSE,p=2)#绝对值距离 dist(x,method=”canberra”, diag=FALSE,upper=FALSE,p=2)#Lance距离; dist(x,method=”binary” ,diag=FALSE,upper=FALSE,p=2)#d定性变量距离
讲完距离后,需要对原始数据进行相应的处理,否则数据规模的差异会被算法误认为属性权重值而影响最终的聚类效果。我们需要进行数据的中心化和标准化转换。中心化即让所有的数据都已0为中心点,常用的标准化的做法是将数据看作正态分布,只需要将数据除以标准差即可到达标准化作用。数据中心化和标准化后,各个变量的取值大小相接近,这样各个变量都平等的发挥决策作用。
R语言中提供了相应的函数:
Scale(x,center=TRUE,scale=TRUE)
接下来先介绍最古老的聚类算法——层次聚类法
思想:
Step1:每个样本各自作为一类; Step2:计算类之间的距离; Step3:将距离最短的两个类合并为一个新类; Step4:重复2-3步,即不断合并最近的两个类,每次减少一个类,直至所有样本被合并为一类;
接下来介绍下类间距离:
最短距离法:两个类中所有点距离中的最小值;
最长距离法:两个类中所有点距离中的最大值;
中间距离法:取介于最小值和最大值两者间的距离;
类平均法:取所有距离的评价值;
重心法:类重心(均值)之间的距离;
离差平法和法:各项与评价项之差的平方的总和;
R提供了hclust()函数做层次聚类方法,下面举个简单的例子来说明下用法:
x<-c(1,2,6,8,11) dim(x)<-c(5,1) d<-dist(x) hc1<-hclust(d,"single")#最短距离法 hc2<-hclust(d,"complete")#最长距离法 hc3<-hclust(d,"median")#中间距离法 hc4<-hclust(d,"ward")#离差平方和法 cpar<-par(mfrow=c(2,2)) plot(hc1,hang=-1) plot(hc2,hang=-1) plot(hc3,hang=-1) plot(hc4,hang=-1) par(cpar) rect.hclust(hc1,k=2)#人工辅助告诉R分为几大类
结果见下图:其中的哦第一板块的红色划分认为告诉R需要分几类后,R自动画出分类的展示:
原文地址:http://blog.csdn.net/howardge/article/details/41847445