R做聚类分析

数据中心化与标准化变换:scale函数

scale(x, center = TRUE, scale = TRUE)
其中x是样本构成的数据矩阵,center为逻辑变量,表示对数据进行中心化变换,scale也为逻辑变量,表示对数据进行中心化变换

距离计算函数dist:

dist(x,method=“euclidean”,diag=FALSE,upper=FALSE,p=2)
其中x是样本矩阵或者数据框。
method表示计算哪种距离,所定义的距离有:
Euclide距离:“euclidean”
Chebyshev距离:“maxinum”
绝对值距离:“manhattan”
Lance距离:“canberra”
Minkowski距离:“minkowski”
定性变量距离:"binary"

diag 为TRUE的时候给出对角线上的距离。
upper为TURE的时候给出上三角矩阵上的值。
注: (1)欧氏距离:可以简单的描述为多维空间的点点之间的几何距离,但欧式距离通常采用的是原始数据,而并非规划化后的数据,不能消除量纲的影响,所以其优势在于新增对象不会影响到任意两个对象之间的距离。
(2)切比雪夫距离:切比雪夫距离主要表现为在多维空间中,对象从某个位置转移到另外一个对象所消耗的最少距离,因此可以简单的描述为用一维属性决定某对象属于哪个簇。
(3)曼哈顿距离:如果欧式距离看成是多维空间对象点点的直线距离,那么曼哈顿距离就是计算从一个对象到另一个对象所经过的折线距离,但曼哈顿距离取消了欧式距离的平方,因此使得离群点的影响减弱。

层次聚类

hclust函数提供了系统聚类的计算,plot函数可画出系统聚类的树形图(或称为谱系图)
hclust(d, method = “complete”, members=NULL)
其中d是由"dist"构成的结构,method是系统聚类的方法(缺省是最长距离法),其参数有:
最短距离法:“single”
最长距离法:“conmplete”
中间距离法:“median”
Mcquitty相似法:“mcquitty”
类平均法:“average”
重心法:“centroid”
离差平方和法:“ward”
plot(x, labels = NULL, hang = 0.1,
axes = TRUE, frame.plot = FALSE, ann = TRUE,
main = “Cluster Dendrogram”,
sub = NULL, xlab = NULL, ylab = “Height”, …)
其中x是由hclust函数生成的对象,hang是表明谱系图中各类所在的位置,当为负值时谱系图中的类从底部画起。

例子: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, “mcquitty”)
#绘制所有树形结构图,2*2的显示绘制在一张图上
opar <- par(mfrow = c(2, 2))
plot(hc1,hang=-1); plot(hc2,hang=-1)
plot(hc3,hang=-1); plot(hc4,hang=-1)
par(opar)
分多少个类:plot((hc1,hang=-1)
rect.hclust(hc1,k=2)

结果导出:n <- cutree(hc1,k=2)        #聚类结果存在变量n里面
                或:table(x,cutree(hc1,k=2))
                        cbind(x,cutree(hc1,k=2))
动态聚类:K-means方法

kmeans()函数形式 kmeans(x,centers,iter.max=10,nstart=1,algorithm=c())
#x是由数据构成的矩阵或者数据框 centers是聚类的个数或者是初始类的中心
#iter.max是最大迭代次数缺省时为10
#nstart随机集合的个数(当centers为聚类的个数时)
#algorithm为动态聚类的算法 “Hartigan-Wong"(缺省时), “Lloyd”,“Forgy”, "MacQueen

例子:X=iris[,1:4]
x=scale(X)
km=kmeans(x,3)
或cluster包实现了PAM:kc=pam(x,3)
作图:plot(newiris[c(“Sepal.Length”, “Sepal.Width”)], col = km$cluster)

 结果导出:table(iris$Species, km$cluster);         #查看分类概括
              或:cbind(x,km$cluster)
聚类分析时确定类的个数:

方法一:
K平均算法(k-means)
误差平方和图中,拐点(bend or elbow)的位置对应的x轴即k-means聚类给出的合适的类的个数。

#读入数据
n = 100
g=6
set.seed(g)
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))))
#rnorm生成服从正态分布的随机数,
#k-means聚类确定聚类个数
mydata <- d
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15)
wss[i] <- sum(kmeans(mydata,centers=i)$withinss)
###这里的wss(within-cluster sum of squares)是组内平方和
plot(1:15, wss, type=“b”, xlab=“Number of Clusters”,ylab=“Within groups sum of squares”)

该方法给出合理的类别个数是4个。
方法二:
K中心聚类算法(K-mediods)
使用fpc包里的pamk函数来估计类的个数:

install.packages(“cluster”)
install.packages(“fpc”)
library(cluster)
library(fpc)
pamk.best <- pamk(d)
cat(“number of clusters estimated by optimum average silhouette width:”, pamk.bestKaTeX parse error: Undefined control sequence: \n at position 6: nc, "\̲n̲") #number of …nc))
n=pamk.best p a m o b j e c t pamobject clustering #聚类结果存放n中

sihouette值是用来表示某一个对象和它所属类的凝合力强度以及和其他类分离强度的,值范围为-1到1,值越大表示该对象越匹配所属类以及和邻近类有多不匹配。
所以从上图sihouette plot中可以看出,该方法给出的合理类的个数为4个。
方法三:
基于模型假设的聚类,利用的是mclust包:

install.packages(“mclust”)
library(mclust)
d_clust <- Mclust(as.matrix(d), G=1:20)
m.best <- dim(d_clustKaTeX parse error: Undefined control sequence: \n at position 63: …rs:", m.best, "\̲n̲") #model-based…classification #聚类结果存放n中

方法四:
基于AP算法的聚类

library(apcluster)
d.apclus <- apcluster(negDistMat(r=2), d)
cat(“affinity propogation optimal number of clusters:”, length(d.apclus@clusters), “\n”)
#affinity propogation optimal number of clusters: 4
#4 得出的分类个数
heatmap(d.apclus)
plot(d.apclus, d)

系统聚类:

1、关键点
#聚类分析是一类将数据所研究对象进行分类的统计方法,这一类方法的共同特点是:
#事先不知道类别的个数与结构 据以进行分类的数据是对象之间的相似性 或差异性数据
#将这些相似(相异)性数据看成是对象之间的距离远近的一种度量 将距离近的对象
#归入一类 不同类之间的对象距离较远
#聚类分析根据分类对象不同分为Q型聚类分析(指的是对样本进行聚类) 和R型聚类分析(指的是对变量进行聚类)
#距离和相似系数
#聚类分析是研究对样本或变量的聚类 变量可以分为两类1定量变量 通常指的是连续量
#2 定性变量(有序变量+名义变量) 这些量并非真有数量上的变化 而只有性质上的差异
#1.距离 1绝对值距离 棋盘距离 城市街区距离 2 Euclide1距离 3Minkowski1距离 4切比雪夫距离 5 Mahalanobis距离 6LanceWilliams距离
#2.数据中心化标准化变换 中心化变换 标准化变换 极差标准化变换 极差正规化变换
#3.相似系数

系统聚类的案列分析:
X<-data.frame(
x1=c(2959.19, 2459.77, 1495.63, 1046.33, 1303.97, 1730.84,
1561.86, 1410.11, 3712.31, 2207.58, 2629.16, 1844.78,
2709.46, 1563.78, 1675.75, 1427.65, 1783.43, 1942.23,
3055.17, 2033.87, 2057.86, 2303.29, 1974.28, 1673.82,
2194.25, 2646.61, 1472.95, 1525.57, 1654.69, 1375.46,
1608.82),
x2=c(730.79, 495.47, 515.90, 477.77, 524.29, 553.90, 492.42,
510.71, 550.74, 449.37, 557.32, 430.29, 428.11, 303.65,
613.32, 431.79, 511.88, 512.27, 353.23, 300.82, 186.44,
589.99, 507.76, 437.75, 537.01, 839.70, 390.89, 472.98,
437.77, 480.99, 536.05),
x3=c(749.41, 697.33, 362.37, 290.15, 254.83, 246.91, 200.49,
211.88, 893.37, 572.40, 689.73, 271.28, 334.12, 233.81,
550.71, 288.55, 282.84, 401.39, 564.56, 338.65, 202.72,
516.21, 344.79, 461.61, 369.07, 204.44, 447.95, 328.90,
258.78, 273.84, 432.46),
x4=c(513.34, 302.87, 285.32, 208.57, 192.17, 279.81, 218.36,
277.11, 346.93, 211.92, 435.69, 126.33, 160.77, 107.90,
219.79, 208.14, 201.01, 206.06, 356.27, 157.78, 171.79,
236.55, 203.21, 153.32, 249.54, 209.11, 259.51, 219.86,
303.00, 317.32, 235.82),
x5=c(467.87, 284.19, 272.95, 201.50, 249.81, 239.18, 220.69,
224.65, 527.00, 302.09, 514.66, 250.56, 405.14, 209.70,
272.59, 217.00, 237.60, 321.29, 811.88, 329.06, 329.65,
403.92, 240.24, 254.66, 290.84, 379.30, 230.61, 206.65,
244.93, 251.08, 250.28),
x6=c(1141.82, 735.97, 540.58, 414.72, 463.09, 445.20, 459.62,
376.82, 1034.98, 585.23, 795.87, 513.18, 461.67, 393.99,
599.43, 337.76, 617.74, 697.22, 873.06, 621.74, 477.17,
730.05, 575.10, 445.59, 561.91, 371.04, 490.90, 449.69,
479.53, 424.75, 541.30),
x7=c(478.42, 570.84, 364.91, 281.84, 287.87, 330.24, 360.48,
317.61, 720.33, 429.77, 575.76, 314.00, 535.13, 509.39,
371.62, 421.31, 523.52, 492.60, 1082.82, 587.02, 312.93,
438.41, 430.36, 346.11, 407.70, 269.59, 469.10, 249.66,
288.56, 228.73, 344.85),
x8=c(457.64, 305.08, 188.63, 212.10, 192.96, 163.86, 147.76,
152.85, 462.03, 252.54, 323.36, 151.39, 232.29, 160.12,
211.84, 165.32, 182.52, 226.45, 420.81, 218.27, 279.19,
225.80, 223.46, 191.48, 330.95, 389.33, 191.34, 228.19,
236.51, 195.93, 214.40),
row.names=c(“北京”,“天津”,“河北”,“山西”,“内蒙古”,
“辽宁”,“吉林”,“黑龙江”,“上海”,“江苏”,“浙江”,
“安徽”,“福建”,“江西”,“山东”,“河南”,“湖北”,
“湖南”,“广东”,“广西”,“海南”,“重庆”,“四川”,
“贵州”,“云南”,“西藏”,“陕西”,“甘肃”,“青海” ,
“宁夏”,“新疆”)
)
#1.用数据框输入数据
#2.生成距离结构,做系统聚类
d=dist(scale(X)) #scale对数据做中心化或者标准化处理
hc1<-hclust(d) #hclust提供系统聚类的计算 最长距离法
hc2<-hclust(d,“average”)
hc3<-hclust(d,“centroid”) #重心法
hc4<-hclust(d,“ward”) #ward法
opar<-par(mfrow=c(2,1), mar=c(5.2,4,1,0)) #生成两行一列 图像距离边界的距离
#hang是表明谱系图中各类所在的位置 当hang取负值时,谱系图中的类从底部画起 生成谱系图
plclust(hc1,hang=-1)
re1<-rect.hclust(hc1, k=5, border=“red”) #将分类结果分成5类 用红色矩形笔迹标记
plclust(hc2,hang=-1)
re1<-rect.hclust(hc1, k=5, border=“red”) #将分类结果分成5类 用红色矩形笔迹标记
par(opr) #在活动设备中返回所有图形参数和他们的值
opar<-par(mfrow(2,1),mar(5.2,4,0,0))
plclust(hc3,hang=-1)
re3<-rect.hclust(hc3,k=5,border=“red”)
plclust(hc4,hang=-1)
re4<-rect.hclust(hc4,k=5,border=“red”)
#在R软件中 与确定类的个数有关的函数是rect.hclust()函数 它的本质是由给定的个数或给定的阈值来确定聚类的情况
#tree是由hclust生成的结构 k是类的个数 border是矩形框的颜色
par(opar)

发布了30 篇原创文章 · 获赞 0 · 访问量 341

猜你喜欢

转载自blog.csdn.net/hua_chang/article/details/105035504