精华内容
下载资源
问答
  • R语言聚类分析机器学习资料 英文版!
  • R语言聚类分析案例

    千次阅读 2020-09-26 10:58:42
    R语言聚类分析案例 在 mclust 包中包含一个 diabetes 数据集(加载 mclust 包后,可通过代码“head(diabetes)”查看数据的前 5 行,通过“?diabetes”查看每个变量的具体意义),该数据集包含 145 名糖尿病患者的三...

    R语言聚类分析案例

    在 mclust 包中包含一个 diabetes 数据集(加载 mclust 包后,可通过代码“head(diabetes)”查看数据的前 5 行,通过“?diabetes”查看每个变量的具体意义),该数据集包含 145 名糖尿病患者的三个指标的测量数据,针对该数据集,请进行如下分析:
    (1)只考虑 3 个指标数据,使用 k-means 聚类对数据进行聚类分析,找到合适的聚类数目,并对聚类效果进行评估;

    ######################第五题 聚类分析############################################
    library(mclust)
    library(MASS)
    data(diabetes)
    diabetes=diabetes#导入数据
    head(diabetes)#观察前五行
    ?diabetes
    

    结果如下:

    > head(diabetes)#观察前五行
       class glucose insulin sspg
    1 Normal      80     356  124
    2 Normal      97     289  117
    3 Normal     105     319  143
    4 Normal      90     356  199
    5 Normal      90     323  240
    6 Normal      86     381  157
    

    进行聚类:

    km<-kmeans(diabetes[,2:4], 3, nstart = 1) 
    km 
    diabetes$cluster<-km$cluster#赋值进去
    diabetes
    

    聚类结果如下:

    > km 
    K-means clustering with 3 clusters of sizes 33, 86, 26
    
    Cluster means:
        glucose   insulin      sspg
    1 107.42424  531.5455 323.66667
    2  91.39535  359.2791 166.72093
    3 241.65385 1152.8846  75.69231
    
    Clustering vector:
      1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30 
      2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
     31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
      2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
     61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90 
      2   2   2   2   2   2   2   2   1   2   1   2   2   2   2   1   2   2   2   2   2   1   2   2   1   1   1   1   1   1 
     91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
      1   1   1   1   1   2   1   1   1   1   1   1   2   2   2   1   1   1   1   2   1   2   3   3   1   3   3   3   3   3 
    121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 
      3   3   3   1   3   3   3   3   3   3   1   3   3   1   1   1   1   3   3   3   3   3   3   3   3 
    
    Within cluster sum of squares by cluster:
    [1] 1058399.6  592025.2 1738796.1
     (between_SS / total_SS =  80.5 %)
    
    Available components:
    
    [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"        
    [8] "iter"         "ifault"      
    
    
    > diabetes
           class glucose insulin sspg cluster
    1     Normal      80     356  124       2
    2     Normal      97     289  117       2
    3     Normal     105     319  143       2
    4     Normal      90     356  199       2
    5     Normal      90     323  240       2
    

    由:Within cluster sum of squares by cluster:[1] 1058399.6 592025.2 1738796.1 (between_SS / total_SS = 80.5 %) 发现聚类效果良好,与原类别标签也较为一致。

    (2)在使用系统聚类时,使用不同的距离得到的聚类结果有何异同?

    基本思想: 是一类将数据所对应研究对象进行分类的统计方法。它是将个体 (样品)或者对象 (变量)按相似程度(距离远近)划分类别,使得同一类中的元素之间相似性比其他类的元素的相似性更强。目的在于使类间元素的同质性最大化和类与类间元素的异质性最大化。
    Q 型聚类分析是指对样本进行聚类,R 型聚类分析是指对变量进行聚类分析。
    基本方法:
    ①系统聚类法:最短距离法、最长距离法、中间距离法、类平均法和离差平方和法等
    聚集——开始时将 n 个样品各自作为一类,并规定样品之间的距离和类与类之间的距离,然后将距离最近的两类合并成一个新类,计算新类与其他类的距离;重复进行两个最近类的合并,每次减少一类,直至所有的样品合成一类。
    分割——由 n 个样品组成一类开始,按某种最优准则将它分割成两个尽可能远的子类,再
    用同样准则将每一子类进一步地分割成两类,从中选一个分割最优地子类,这样将类数由
    两类增加到三类。如此下去,直至所有 n 个样品各自为一类或采用某种停止规则。

    
    d <- dist(scale(diabetes[,2:4]))#建立距离矩阵
    
    #不同方法对比
    method=c("complete", "average", "centroid", "ward.D")
    alldata<-data.frame()
    hc<-hclust(d,"complete"); 
    class1<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"average"); 
    class2<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"centroid"); 
    class3<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"ward.D"); 
    class4<-cutree(hc, k=5) #分成3类 
    
    alldata<-data.frame(diabetes,class1,class2,class3,class4)#合并为一个数据框
    alldata
    

    聚类结果:

    > alldata
           class glucose insulin sspg cluster class1 class2 class3 class4
    1     Normal      80     356  124       2      1      1      1      1
    2     Normal      97     289  117       2      1      1      1      1
    3     Normal     105     319  143       2      1      1      1      1
    4     Normal      90     356  199       2      1      1      1      2
    5     Normal      90     323  240       2      1      1      1      2
    6     Normal      86     381  157       2      1      1      1      1
    7     Normal     100     350  221       2      1      1      1      2
    

    可发现系统聚类法,使用不同的距离方法的时候,聚类结果有所差异,但差异不算特别大。对于两端值分类结果较为良好,但对于类别之间中间值分类较为差。

    (3)该数据集的分布情况适合使用密度聚类吗?如果使用密度聚类,聚类的效果是否会比上述的两种聚类方法效果更好?

    密度聚类也称为基于密度的聚类,基本出发点是假设聚类结果可以通过样本分布
    的稠密程度来确定,主要目标是寻找被低密度区域分离的高稠密区域。它有以下优点:
    ①相较于 K-means 聚类,DBSCAN 不需要预先声明聚类数量,即聚类数量会根据领域和 MinPts 参数动态确定,从而能更好体现数据的簇分布的原始特征点,但是根据不同参数会得到不同的聚类结果。
    ②DBSCAN 密度聚类可以找出任何形状的聚类,适用于数据分布形状不规则的数据集。

    library(fpc)
    model<-dbscan(diabetes[,2:4],eps=50,MinPts=5)
    diabetes$dbscan<-model$cluster
    
    ## 可视化在不同的eps情况下,聚类的情况
    eps <- c(40,50,60,70)
    name <- c("one","two","three","four")
    dbdata <- diabetes[,2:4]
    for (ii in 1:length(eps)) {
      modeli <- dbscan(diabetes[,2:4],eps=eps[ii],MinPts=5)
      dbdata[[name[ii]]] <- as.factor(modeli$cluster)
      
    }
    head(dbdata)
    

    聚类结果如下:

    > head(dbdata)
      glucose insulin sspg one two three four
    1      80     356  124   1   1     1    1
    2      97     289  117   1   1     1    1
    3     105     319  143   1   1     1    1
    4      90     356  199   1   1     1    1
    5      90     323  240   1   1     1    1
    6      86     381  157   1   1     1    1
    ........
    138     188     958  100   0   0     2    3
    139     339    1354   10   0   0     0    0
    140     265    1263   83   0   0     0    0
    141     353    1428   41   0   0     0    2
    142     180     923   77   0   0     2    3
    

    可发现,自动聚类成了3-4类,前三种都是划分为3类,故分为3类较为合理。

    展开全文
  • 关于聚类分析的讲解及其r代码
  • R语言聚类分析

    2017-12-26 16:44:39
    R语言实现多种聚类方法,包括k-means聚类,pamk聚类,层次聚类,基于密度的dbscan算法的聚类
  • R语言聚类分析(系统聚类、K-均值聚类)

    万次阅读 多人点赞 2019-03-20 20:55:50
    原始数据 选自巨潮网 下表为2018年34家上市公司的利润表,选取其中营业收入、营业成本、销售费用、营业利润、利润总额、净利润六个指标。(单位:千万) 序号 机构名称 ......
    • 原始数据

    选自巨潮网

    下表为2018年34家上市公司的利润表,选取其中营业收入、营业成本、销售费用、营业利润、利润总额、净利润六个指标。(单位:千万)

    序号

    机构名称

    营业收入

    营业成本

    销售费用

    营业利润

    利润总额

    净利润

    1

    北京顺鑫

    1207.44

    724.96

    122.38

    106.28

    105.94

    72.81

    2

    深圳联得

    66.36

    43.64

    4.21

    9.15

    9.45

    8.53

    3

    深圳星源

    58.35

    30.19

    2.89

    12.40

    24.89

    20.27

    4

    安泰科技

    505.41

    416.36

    13.17

    -20.78

    -31.45

    -33.15

    5

    北京利尔

    319.69

    207.43

    37.35

    42.79

    41.26

    33.37

    6

    嘉事堂

    1795.99

    1612.23

    62.86

    77.72

    77.49

    57.06

    7

    朗姿

    266.15

    111.92

    95.65

    23.95

    22.75

    20.43

    8

    北京三夫

    42.03

    24.02

    10.44

    0.66

    0.65

    0.47

    9

    舒泰神

    80.61

    7.48

    48.34

    14.97

    15.10

    13.41

    10

    华润双鹤

    822.51

    301.44

    319.38

    118.93

    118.41

    98.95

    11

    有研

    476.79

    445.72

    5.31

    9.27

    10.00

    8.25

    12

    用友

    770.35

    231.48

    164.88

    94.31

    95.03

    81.02

    13

    江河创建

    1603.73

    1307.75

    17.98

    86.59

    86.86

    73.86

    14

    北京昭衍

    40.88

    19.21

    0.66

    12.60

    12.79

    10.82

    15

    飞亚达

    340.05

    199.38

    85.70

    23.04

    23.12

    18.38

    16

    河北建投能源

    1397.63

    1172.12

    6.15

    88.70

    88.22

    66.16

    17

    天津天保基建

    228.97

    96.97

    1.88

    25.20

    25.37

    9.70

    18

    中体产业

    144.99

    110.10

    5.67

    13.76

    13.79

    9.15

    19

    天津环球磁卡

    14.53

    11.72

    0.33

    7.29

    7.18

    7.18

    20

    新奥生态

    1363.25

    1069.69

    18.91

    162.68

    162.12

    140.57

    21

    曙光信息

    905.69

    739.90

    38.46

    53.19

    53.71

    46.75

    22

    中航善达

    665.56

    534.84

    11.10

    121.98

    122.53

    82.40

    23

    天马微电子

    2891.15

    2451.97

    48.07

    98.35

    101.92

    98.39

    24

    华润三九

    1342.77

    416.04

    646.86

    170.35

    171.89

    147.49

    25

    深圳顺络

    236.20

    154.38

    6.78

    49.80

    55.48

    48.30

    26

    广东威华

    252.37

    217.38

    7.23

    15.17

    15.81

    15.34

    27

    深圳通产丽星

    136.92

    105.76

    6.46

    10.08

    9.80

    9.12

    28

    深圳信立泰

    465.19

    94.37

    134.56

    172.00

    170.62

    145.46

    29

    深圳英威腾电气

    222.81

    139.79

    23.46

    21.53

    21.00

    17.79

    30

    顺丰

    9094.27

    7464.22

    182.58

    581.81

    586.75

    446.43

    31

    天虹商场

    1913.80

    1392.19

    362.69

    116.29

    116.88

    90.46

    32

    深圳同兴达科技

    409.54

    375.23

    3.75

    8.85

    11.36

    9.81

    33

    深南电路

    760.21

    584.38

    15.70

    78.39

    77.75

    69.83

    34

    方大集团

    304.87

    233.79

    4.98

    297.00

    296.98

    224.62

    二、使用R语言进行聚类分析

    1)系统聚类法(分成四类)

    mydata<-read.table("D:\\信息\\数据.txt")

    distance<-dist(mydata)#计算距离

    hc1<-hclust(distance,"ward.D2")#使用离差平方和法,默认最长距离法

    plclust(hc1,hang=0.1)#绘画系谱图

    re1<-rect.hclust(hc1,k=4,border="red")#k表示分为几类

    re1

    for(i in 1:4){

    print(paste("第",i,"类"))

    print(mydata[re1[[i]],])

    }

    可以看出第30家公司自成一类,第6、13、16、20、23、31家公司为一类,第2、3、5、7、8、9、14、15、17、18、19、25、26、27、29家公司为一类,第1、4、10、11、12、21、22、24、28、32、33、34家公司为一类,第一类公司利润最高,第三类公司利润最低。

    2K-均值聚类(分成四类)

     plot(mydata)

     kc4<-kmeans(mydata,centers=4,nstart=1,trace=TRUE)#centers表示分成几类

     kc4

    指标变量间两两相关关系的散点图:

    研究对象归为四类的结果:

    由Clustering vector可知34家公司的分类情况:第2、3、4、5、7、8、9、11、14、15、17、18、19、25、26、27、28、29、32、34为一类,第6、13、23、31为一类,第30家为一类,第1、10、12、16、20、21、22、24、33为一类。第三类公司利润最高,第二类公司利润最低。与系统聚类的分类结果虽不太相同,但两种聚类结果中第30家都是自成一类。

    展开全文
  • 利用R语言编写的聚类分析、PCA算法的实现以及应用,用于生物信息学领域的数据分析,有助于R语言与生物信息数据处理的入门有帮助!包含数据集(.txt)
  • R语言聚类分析

    万次阅读 多人点赞 2017-02-27 17:10:27
    部分参考薛毅的《统计建模与R软件》和《R语言实战》聚类分析是一类将数据所研究对象进行分类的统计方法,这一类方法的共同特点是:事先不知道类别的个数和结构,据以进行分析的数据是对象之间的相似性或相异性的数据...

    自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享。部分参考薛毅的《统计建模与R软件》和《R语言实战》

    聚类分析是一类将数据所研究对象进行分类的统计方法,这一类方法的共同特点是:事先不知道类别的个数和结构,据以进行分析的数据是对象之间的相似性或相异性的数据。将这些相似(相异)性数据看成是对象之间的“距离”远近的一种度量,将距离近的变量归为一类,不同类之间的对象距离较远。这就是聚类分析方法的共同思路。

    setwd("C://Users//DELL//Documents//WD")

    需要安装的包

    install.packages("NbClust")
    install.packages("flexclust")

    1. 数据的预处理

    1.1 R里的距离计算公式

    在度量空间中,可自行定义距离公式。常用的定量变量间的距离公式有:绝对值距离、Euclide距离、Minkowski距离、Chebyshev距离、Mahalanobis距离、Lance和Williams距离。除此之外还有对定型变量的距离公式。

    在R软件中,dist()函数给出了各种距离的计算结果,其使用格式为:

      dist(x, method = " ",diag = FALSE, upper = FALSE, p = 2)
    

    其中x是样本构成的数据矩阵(样本按行输入)或数据框,method表示计算距离选用的方法,缺省值为Euclide距离,其他可选用的方法有:

    • “euclidean” – Euclide距离
    • “maximum” – Chebyshev距离
    • “manhattan” – 绝对值距离
    • “canberra” – Lance距离
    • “minkowski” – Minkowski距离,其中参数p是Minkowski距离的阶数,即公式中的q
    • “binary” – 定型变量的距离
      (以上距离的数学公式可参见薛毅书P467)

    diag是逻辑变量,当diag = TRUE时,给出对角线上的距离;upper是逻辑变量,当upper = TRUE时,给出上三角矩阵的值(缺省值仅给出下三角矩阵的值)

    1.2 数据中心化与标准化变换

    在作聚类分析过程中,大多数数据往往是不能直接参与运算的,需要先将数据作中心化或标准化处理。

    * 1.2.1 中心化变换*

    Xij* = Xij - Xj均, i=1,2,…,p 为中心化变换,
    变换后数据的均值为0,方差阵不变

    * 1.2.2 标准化变换*

    Xij* = (Xij - Xj均)/Sj, i=1,2,…,p 为中心化变换,
    变换后数据,每个变量的样本均值均为0,标准差为1,而且标准化后的数据与变量的量纲无关

    在R软件中,用scale()函数作数据的中心化或标准化,使用格式为:

     scale(x, center = TRUE, scale = TRUE)
    

    其中x是样本构成的数据矩阵,center是逻辑变量,TRUE(缺省值)表示对数据作中心化变换,FALSE表示不作变换;scale是逻辑变量,TRUE(缺省值)表示表示对数据作标准化变换,FALSE表示不作变换。
    1.2.1中公式的计算函数为:X* = scale(x,scale = FALSE);
    1.2.2中公式的计算函数为:X* = scale(x)

    * 1.2.3 极差标准化变换*

    Xij* = (Xij - Xj均)/Rj, i=1,2,…,n,j=1,2,…,p 为极差标准化变换,
    变换后的数据,每个变量的样本均值都为0,极差为1,且|Xij*|<1,在以后的分析计算中可以减少误差的产生,同时变换后的数据也是无量纲的量

    在R软件中,可用sweep()函数作极差标准化变换,变换过程如下:

     center <- sweep( x, 2, apply(x, 2, mean) )
     R <- apply(x, 2, max) - apply(x, 2, min)
     x_star <- sweep(center, 2, R, "/")
    

    其中x是样本构成的数据矩阵,第一行是将数据中心化,第二行是计算极差Rj,j=1,2,…,p,第三行是将中心化后的数据除以极差,得到数据的极差标准化数据。

    其中用到的sweep()函数是对数组或矩阵运算,格式为:

     sweep(x, MARGIN, STATS, FUN = "-" , ...)
    

    其中x是数组或矩阵,MARGIN是运算的区域,对于矩阵来讲,1表示行,2表示列。STATS是统计量,如apply(x,2,mean)表示各列的均值。FUN表示函数的运算,缺省值为减法运算。

    从sweep()函数的用法可知,将上述命令第三行改为x_star <- sweep(center, 2, sd(x), “/”),得到的就是(普通)标准化变换后的结果

    * 1.2.4 极差正则化变换*

    Xij* = [Xij - MIN 1<=k<=n (Xkj)]/Rj, i=1,2,…,n,j=1,2,…,p 为极差正则化变换
    变换后数据 0 <= Xij* <= 1,极差为1,也是无量纲的量

    利用sweep()函数,可以得到数据的极差正则化变换,其变换过程如下:

     center <- sweep( x, 2, apply(x, 2, min) )
     R <- apply(x, 2, max) - apply(x, 2, min)
     x_star <- sweep(center, 2, R, "/")
    

    1.3 相似系数

    聚类分析不仅用来对样本进行分类,也可以对变量来进行分类。在对变量进行分类时,常用相似系数来度量变量之间的相似程度。

    * 1.3.1 夹角余弦*

    计算公式与计算向量余弦的算法一样,变量Xi的n次观测值作为一个向量,Xj的n个观测值做另一个向量,这里不作展示

    在R软件中,可用scale()函数完成两向量余弦的计算,公式如下:

     y <- scale(x, center = F, scale = T)/sqrt(nrow(x)-1)
     C <-t(y) %*% y
    

    其中x是样本构成的数据矩阵,C是计算得出的相似系数构成的矩阵

    * 1.3.2 相关系数*

    相关系数就是对数据作标准化处理后的夹角余弦,也就是变量Xi和变量Xj的相关系数rij,这里记作cij,公式这里不作展示

    在R软件中,cij的计算更加方便,即样本的相关矩阵:C <- cor(x)

    变量之间常借助于相似系数来定义距离,如令 dij^2 = 1 - cij^2,有时也用相似系数来度量变量间的相似程度。 (上述两公式见薛毅书P473)


    2.层次聚类法(也叫系统聚类法)

    既可处理分类变量,也可处理连续变量,但不能同时处理两种变量类型,不需要指定类别数。聚类结果间存在着嵌套,或者说层次的关系。系统聚类方法是聚类分析诸方法中用得最多的一种,其基本思想是:开始将n个样本各自作为一类,并规定样本之间的距离和类和类之间的距离,然后将距离最近的两类合并为一个新类,计算新类与其他类的距离;重复进行两个类的合并,每次减少一类,直至所有的样本合并为一类。可用于定义“距离”的统计量包括了欧氏距离(euclidean)、马氏距离(manhattan)、两项距离(binary)、明氏距离(minkowski)。还包括相关系数和夹角余弦。在计算类间距离时则有六种不同的方法,分别是最短距离法、最长距离法、类平均法、重心法、中间距离法、离差平方和法。

    在R软件中,hclust()函数提供了系统聚类的计算,plot()函数可画出系统聚类的树形图(或称为谱系图)

    hclust()函数使用格式为:

     hclust(d, method = "complete", members = NULL)
    

    其中d是由“dist”构成的结构。method是系统聚类方法(缺省值是最长距离法),可选用的其他参数有:

    • “single” – 最短距离法
    • “complete” – 最长距离法
    • “median” – 中间距离法
    • “mcquitty” – Mcquitty相似法
    • “average” – 类平均法
    • “centroid” – 重心法
    • “ward“ – 离差平方和法

    members的缺省值为NULL,或与d有相同变量长度的向量,具体使用方法见帮助

    plot()函数画出谱系图的格式为:

     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是表明谱系图中各类所在的位置,当hang取负值时,谱系图中的类从底部画起。其他参数见plot帮助文件

    下面用实例来说明系统聚类方法

    2.1 例1. 城镇居民消费水平(对变量进行分类) (cluster1)

    城镇居民消费水平通常用8项指标来描述:人均粮食之处(元/人)x1,人均副食支出(元/人)x2,人均烟、酒、茶支出(元/人)x3,人均其他副食支出(元/人)x4,人均衣着商品支出(元/人)x5,人均日用品支出(元/人)x6,人均燃料支出(元/人)x7,人均非商品支出(元/人)x8。这8项指标间存在着一定的相关性。为了研究城镇居民的消费结构,需将相关性强的指标归并到一起,这实际上是对指标聚类。

    * 2.1.1 绘制谱系图*

    #用sas中相同的数据源,输入数据,列名称是x1-x8,行名称是1-30的序号
    x <- read.csv("cluster1.csv")
    #相关系数矩阵
    r <- cor(x)
    #生成距离结构
    d<-as.dist(1-r)  #method缺省值默认是Euclide距离
    #用四种不同的距离方法生成系统聚类
    hc1<-hclust(d, "single"); hc2<-hclust(d, "complete") #最短距离法和最长距离法
    hc3<-hclust(d, "median"); hc4<-hclust(d, "mcquitty") #中间距离法和Mcquitty相似法
    #绘制出以上四种方法的树形结构图,并以2x2的形式画在一张图上.图像距离边界的距离
    opar <- par(mfrow = c(2, 2))
    #hang是表明谱系图中各类所在的位置 当hang取负值时,谱系图中的类从底部画起  生成谱系图
    plot(hc1,hang=-1); plot(hc2,hang=-1)
    plot(hc3,hang=-1); plot(hc4,hang=-1)
    par(opar)

    R中与绘制谱系图有关的函数还有as.dendrogram(object, hang = -1, …)

    其中object是是由hclust得到的对象,此时plot()函数用法为:

     plot(x, type = c("rectangle","triangle"), center = FALSE, 
     edge.root = is.leaf(x)||!is.null(attr(x,"edgetest"), 
     nodePar = NULL, edgePar = list(),
     leaflab = c("perpendicular","textlike","none"),
     dLeaf = NULL, xlab = "", ylab = "", xaxt = "n", yaxt = "s",
     horiz = FALSE, frame.plot = FALSE,...)
    

    其中x是由dendrogram得到的对象,type表示画谱系图的类型,“rectangle”表示矩形(缺省值),“triangle”为三角形;horiz是逻辑变量,当horiz = TRUE时,表示谱系图水平放置。其他参数见帮助文件

    * 2.1.2 设置谱系图形状*

    #以hc1为例绘制不同参数下的谱系图
    dend1<-as.dendrogram(hc1)
    #生成两行一列  图像距离边界的距离
    opar <- par(mfrow = c(2, 2),mar = c(4,3,1,2))
    #通过设置参数分别画出四种不同的图
    plot(dend1)  #原始图像
    plot(dend1, nodePar=list(pch = c(1,NA), cex=0.8, lab.cex = 0.8),
         type = "t", center=TRUE)  #斜线
    plot(dend1, edgePar=list(col = 1:2, lty = 2:3), dLeaf=1, edge.root = TRUE)  #虚线
    plot(dend1, nodePar=list(pch = 2:1,cex=.4*2:1, col = 2:3), horiz=TRUE)      #纵向
    par(opar)

    2.2 例2. 女中学生体型指标分类(对变量进行分类)(一个小函数让图形好看一点)

    对305名女中学生测量8个体型指标,给出相应的相关矩阵。将相关系数看成相似系数,定义距离为:dij = 1 - rij,用最长距离法作系统聚类分析

    # 输入相关矩阵. 
    x<- c(1.000, 0.846, 0.805, 0.859, 0.473, 0.398, 0.301, 0.382,
          0.846, 1.000, 0.881, 0.826, 0.376, 0.326, 0.277, 0.277, 
          0.805, 0.881, 1.000, 0.801, 0.380, 0.319, 0.237, 0.345, 
          0.859, 0.826, 0.801, 1.000, 0.436, 0.329, 0.327, 0.365, 
          0.473, 0.376, 0.380, 0.436, 1.000, 0.762, 0.730, 0.629, 
          0.398, 0.326, 0.319, 0.329, 0.762, 1.000, 0.583, 0.577, 
          0.301, 0.277, 0.237, 0.327, 0.730, 0.583, 1.000, 0.539, 
          0.382, 0.415, 0.345, 0.365, 0.629, 0.577, 0.539, 1.000)
    names<-c("身高 x1", "手臂长 x2", "上肢长 x3", "下肢长 x4", "体重 x5", 
             "颈围 x6", "胸围 x7", "胸宽 x8")
    r<-matrix(x, nrow=8, dimnames=list(names, names))
    # 作系统聚类分析, 
    # as.dist()的作用是将普通矩阵转化为聚类分析用的距离结构. 
    d<-as.dist(1-r); hc<-hclust(d); dend<-as.dendrogram(hc)
    # 写一段小程序, 其目的是在绘图命令中调用它, 使谱系图更好看.
    nP<-list(col=3:2, cex=c(2.0, 0.75), pch= 21:22, 
             bg= c("light blue", "pink"),
             lab.cex = 1.0, lab.col = "tomato")
    addE <- function(n){
       if(!is.leaf(n)) {
           attr(n, "edgePar") <- list(p.col="plum")
           attr(n, "edgetext") <- paste(attr(n,"members"),"members")
       }
       n
    }
    # 画出谱系图.
    op<-par(mfrow=c(1,1), mar=c(4,3,0.5,0))
    de <- dendrapply(dend, addE); plot(de, nodePar= nP)
    par(op)

    从图中容易看出,变量x2(手臂长)与x3(上肢长)最先合并成一类,解析来是变量x1(身高)与x4(下肢长)合并成一类.再合并就是将新得到的两类合并成一类(可称为“长”类).后面要合并的是x5(体重)与x3(颈围).再合并就是将x7(胸围)加到新类中.再加就是x8(胸宽).最后合并为一类.


    2.3 类的个数的确定

    在聚类问题中如何确定合适的分类个数,是一个非常困难的问题,至今没有特别令人满意的答案。

    * 2.3.1 rect.hclust()函数确定分类个数*

    在R软件中,与确定类的个数有关的函数是rect.hclust()函数,它的本质是由给定类的个数或给定阈值(类与类间的距离)来确定分类个数

     rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, cluster = NULL)
    

    其中tree是由hclust生成的结构,k是类的个数,h是谱系图中的阈值,要求分成的各类的距离大于h.border是数或向量,表示矩形框的颜色

    对2.2中例2的八个体型指标的聚类分析中,将变量分为三类,即k=3,其程序和计算结果如下:

    plclust(hc,hang = -1)   #与plot类似用法
    re <- rect.hclust(hc,k=3)   #加入k=3的类

    根据谱系图确定分类个数的准则:
    A.各类重心的距离必须很大
    B.确定的类中,各类所包含的元素都不要太多
    C.类的个数必须符合实用目的
    D.若采用集中不同的聚类方法处理,则在各自的聚类途中因发现相同的类。

    得到身高(x1),手臂长(x2),上肢长(x3),下肢长(x4)分为第一类;胸宽(x8)为第二类;体重(x5),颈围(x6),胸围(x7)分为第三类。

    上边程序中,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")
    

    其中tree是由hclust()函数生成的对象,其他参数设置与plot()函数中的相同

    * 2.3.2 例3.NbClust包确定在一个聚类分析里类的最佳数目*(用flexclust包里自带数据作为例子,clust1是对变量聚类,数据是相关系数矩阵,无法使用)

    par(ask=TRUE)
    opar <- par(no.readonly=FALSE)
    #输入flexclust包自带数据nutrient,是27个不同种类的肉的5个成分含量
    data(nutrient, package="flexclust")
    row.names(nutrient) <- tolower(row.names(nutrient))
    #标准化,生成距离结构,类平均发生成聚类
    nutrient.scaled <- scale(nutrient)                                  
    d <- dist(nutrient.scaled)                                          
    fit.average <- hclust(d, method="average")                          
    plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering")
    #用NbClust()函数判断生成类的个数
    library(NbClust)
    nc <- NbClust(nutrient.scaled, distance="euclidean", 
                  min.nc=2, max.nc=15, method="average")
    #设置图形
    par(opar)
    table(nc$Best.n[1,])
    #标准图
    barplot(table(nc$Best.n[1,]), xlab="Numer of Clusters", ylab="Number of Criteria",main="Number of Clusters Chosen by 26 Criteria") 

    函数给出最佳类别数量为2,选择2类

    #使用前先清除历史图片,或者将第二个代码块运行两次
    #每个种类的个数
    clusters <- cutree(fit.average, k=2) 
    table(clusters)
    #每个种类的中位数
    aggregate(nutrient, by=list(cluster=clusters), median) 
    #标准化后的中位数
    aggregate(as.data.frame(nutrient.scaled), by=list(cluster=clusters),median)
    #画图,k选择2
    plot(fit.average, hang=-1, cex=.8,main="Average Linkage Clustering\n5 Cluster Solution")
    rect.hclust(fit.average, k=2)

    根据实际情况,选择5类

    clusters <- cutree(fit.average, k=5) 
    table(clusters)
    aggregate(nutrient, by=list(cluster=clusters), median) 
    aggregate(as.data.frame(nutrient.scaled), by=list(cluster=clusters),median)
    plot(fit.average, hang=-1, cex=.8,  main="Average Linkage Clustering\n5 Cluster Solution")
    rect.hclust(fit.average, k=5)   #k选择5

    2.4 例4. 一个具体的实例来总结前面介绍的聚类分析的方法(cluster2、对样本分类)

    列出1999年全国31个省市自治区,的城镇居民家庭平均每人全年消费性支出的八个主要指标(变量)数据,这八个变量是x1食品,x2衣着,x3家庭设备用品及服务,x4医疗保健,x5交通与通讯,x6娱乐教育文化服务,x7居住,x8杂项商品和服务

    例. 某研究者收集了24种菌株,其中17~22号为已知的标准菌株,它们分别取自牛、羊、犬、猪、鼠、绵羊,其他的为xx菌株。测得各菌株的16种脂肪酸百分含量,试作样品聚类分析,以便了解哪些为止菌株与已知的标准菌株在全部指标上最为接近。

    #用sas中相同的数据源,输入数据,列名称是x1-x8,行名称是1-30的序号
    y <- read.csv("cluster2.csv")
    #生成距离结构
    bacterium <- dist(scale(y))  #method缺省值默认是Euclide距离,scale函数先将y作标准化变换
    #用四种不同的距离方法生成系统聚类
    hc1<-hclust(bacterium, "complete")  #最长距离法
    hc2<-hclust(bacterium, "average")   #类平均法
    hc3<-hclust(bacterium, "centroid")  #重心法
    hc4<-hclust(bacterium, "ward.D2")      #离差平方和法
    #以上聚类模型画图

    * 2.4.1 rect.hclust()函数,根据谱系图,结合实际情况选定类别个数*

    k <- 3   #根据谱系图,结合实际情况,自行选定类别个数
    #生成两行一列  图像距离边界的距离
    opar<-par(mfrow=c(2,1), mar=c(2,4,2,2))
    #hang是表明谱系图中各类所在的位置 当hang取负值时,谱系图中的类从底部画起  生成谱系图
    plot(hc1,hang=-1);re1<-rect.hclust(hc1,k,border="red")  #将分类结果分成5类 用红色矩形笔迹标记
    plot(hc2,hang=-1);re2<-rect.hclust(hc2,k,border="red")
    #在活动设备中返回所有图形参数和他们的值
    par(opar)
    opar<-par(mfrow=c(2,1), mar=c(2,4,2,2))
    plot(hc3,hang=-1);re3<-rect.hclust(hc3,k,border="red")
    plot(hc4,hang=-1);re4<-rect.hclust(hc4,k,border="red")
    par(opar)

    由结果的谱系图看,k=3时的最长距离法分类较为合理,分类结果是:
    第一类:3、4、5、7、8、12、14、15、16、17、18、22、23、24、26、27、28、29、30; 第二类:1、2、6、10、11、25; 第三类:9、13、19、20、21

    * 2.4.2 NbClust包确定类别个数*

    #library(NbClust)
    #默认index参数为all,会报错,出现极小值需要设置tolerance。但是这个函数过于复杂,不作手动修改
    #nc <- NbClust(scale(y),min.nc=2,max.nc=8,method = "average")
    #index=“hubert”,通过图形判断类别个数
    nc <- NbClust(scale(y),min.nc=2,max.nc=8,method = "average",index = "hubert")

    没有查找到Hubert统计值的具体含义,猜想左边图k=3时极小值,右图k=3到k=3+1有明显下降趋势,所以设置k=3.


    3.动态聚类法(这里介绍的是用K-均值方法的kmeans()函数)例5. K-均值法作cluster2的聚类分析

     系统聚类法以此形成类之后就不能改变,这就要求一次分类分得比较准确,对分类的方法要求较高,相应的计算量也会增大。尤其是对于大样本问题,需要很长的计算时间,还会占据足够大的计算机内存。基于这种情况,产生了动态聚类,即动态聚类法。
    
     动态聚类法又称逐步聚类法,其基本思想是,开始先粗略的分一下类,然后按照某种最优原则修改不合理的分类,直至类分得比较合理为止,形成最终的分类结果。这种方法具有计算量较小,占计算机内存较少和方法简单的优点,适用于大样本的Q型聚类分析。
    
     这里介绍用于动态聚类的R函数kmeans()函数,它采用的是K-均值方法。针对连续变量,也可处理有序分类变量,运算很快,但需要指定类别数。K-均值聚类法不会自动对数据进行标准化处理,需要先自己手动进行标准化分析
    
     kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong","Lloyd","Forgy","MacQueen"))
    

    其中x是由数据构成的矩阵或数据框,centers是聚类的个数或者是初始类的中心,iter.max为最大迭代次数(缺省值为10),nstart随机集合的个数(当centers为聚类的个数时),algorithm为动态聚类的算法(缺省值为Hartigan-Wong方法)

    3.1 令类的个数k=5作聚类分析

    与例4.一样,为消除数据数量级的影响,先对数据作标准化处理,然后再用kmeans()函数作动态聚类,为与前面的方法作比较,类的个数选为5

    y <- read.csv("cluster2.csv")
    #算法选择Hartigan-Wong方法,即缺省状态
    km <- kmeans(scale(y),5,nstart = 20);km
    #便于看出聚类后的分类情况,sort()函数对分类情况排序
    sort(km$cluster)
    library(fpc)
    plotcluster(scale(y), km$cluster)    #生成聚类图

    “cluster”是一个整数向量,用于表示记录所属的聚类
    “centers”是一个矩阵,表示每聚类中各个变量的中心点
    “totss”表示所生成聚类的总体距离平方和
    “withinss”表示各个聚类组内的距离平方和
    “tot.withinss”表示聚类组内的距离平方和总量
    “betweenss”表示聚类组间的聚类平方和总量
    “size”表示每个聚类组中成员的数量

    (between_SS / total_SS = 80.9 %),组间的距离平方和占了整体距离平方和的的80.9 %,也就是说各个聚类间的距离做到了最大

    结合实际情况17-22为标准类,发现k=5并不符合实际情况。

    3.2 类别个数k的选择

    在SAS中PROC CLUSTER会在输出聚类结果的同时还是输出一大坨统计量或者伪统计量,主要是这四个:
    RSQ、SPRSQ、PSF以及PST2,分别指的是R^2、半偏R^2(伪R^2)、伪F和伪t^2 。

    先简单介绍下这四个量,如果把样本分为k个类,R2统计量的思想其实和回归分析中的可决系数系数,即类间偏差平方和的总和与总离差平方总和的比值,如果值越大就说明k个类越能够区分开,即聚类效果越好。但需要注意的是,跟回归中类似,R2的值总是随着k的减少而减小,也就是说单纯的根据R2来判断是没有意义,因此我们更关注的是他的变化情况,如果从k到k-1有非常显著的下降,那么可以认为分为k类是比较合适。基于此有人就又提出了半偏R2统计量,其实就是相邻两个R2的差值。F的值越大分类效果越显著,但唯一的缺点是他只是看起来像F统计量,但实际上却不服从F分布。当然伪t2同样如此。
    数学公式参考网页 https://www.52ml.net/8663.html/comment-page-1#comment-185

    下面提供上述统计量的计算和图像

    * 3.2.1 先看within-cluster sum of squares组内平方和的趋势图*

    y <- read.csv("cluster2.csv")
    mydata <- y
    wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
      for (i in 2:13) wss[i] <- sum(kmeans(mydata,centers=i)$withinss)
    ###这里的wss(within-cluster sum of squares)是组内平方和
    plot(1:13, wss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares")

    * 3.2.2 R方和伪R方*

    #先对k=2的时候计算,再构造循环,计算k=1-7的情况,并画图
    #分类个数i为2时,R方的公式为:
    R2 <- kmeans(mydata,centers=2)$betweenss / kmeans(mydata,centers=2)$tot.withinss
       for (i in 2:7)R2[i] <- kmeans(mydata,centers=i)$betweenss / kmeans(mydata,centers=i)$tot.withinss
    fakeR2 <- R2[2]-R2[1]
       for (i in 2:7)fakeR2[i] <- R2[i]-R2[i-1]
    plot(R2,type="b",xlab="Number of Clusters", ylab="R Square")
    plot(fakeR2,type="b",xlab="Number of Clusters", ylab="Fake R Square")

    * 3.2.3 伪F和伪t^2*

    #先对k=2的时候计算,再构造循环,计算k=1-7的情况,并画图
    fakeF <- 1 -  kmeans(mydata,centers=2)$betweenss*(nrow(mydata)-2) /
                 (kmeans(mydata,centers=2)$tot.withinss-kmeans(mydata,centers=2)$betweenss)*(2-1)
       for (i in 2:7)fakeF[i] <- 1 -  kmeans(mydata,centers=i)$betweenss*(nrow(mydata)-i) /
                                  (kmeans(mydata,centers=i)$tot.withinss-kmeans(mydata,centers=i)$betweenss)*(i-1)
    #伪t方没有找到计算公式,略
    plot(fakeF,type="b",xlab="Number of Clusters", ylab="fake F")

    * 3.2.4 结合以上统计量一起画图比较*

    #四行一列的图,调整图形左右上下的间距大小
    opar<-par(mfrow=c(4,1), mar=c(4,5,3,2))
    plot(1:13, wss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares")
    plot(R2,type="b",xlab="Number of Clusters", ylab="R Square")
    plot(fakeR2,type="b",xlab="Number of Clusters", ylab="Fake R Square")
    plot(fakeF,type="b",xlab="Number of Clusters", ylab="fake F")
    par(opar)

    图一wws看出,分类个数为2-4个。从3类变成2类时,伪R方急剧减小,聚类结果的解释度迅速下降,说明2类不合适,3类较合适。此时wss趋于平稳,R方也在3类变成2类时明显波动,伪F值也是波动明显,最后选定分类个数k=3

    * 3.2.5 NbClust包来确定类别数量*

    library(NbClust)
    #默认index参数为all,会报错,出现极小值需要设置tolerance。但是这个函数过于复杂,不作手动修改
    #nc <- NbClust(scale(y),min.nc=2,max.nc=15,method = "kmeans")
    #index=“hubert”,通过图形判断类别个数
    nc <- NbClust(scale(y),min.nc=2,max.nc=15,method = "kmeans",index = "hubert")

    没有查找到Hubert统计值的具体含义,猜想左边图k=3时极小值,右图k=3到k=3+1有明显上升趋势,所以设置k=3.


    3.3 选择3.2里的类别个数,类的个数k=3作聚类分析**

    y <- read.csv("cluster2.csv")
    #算法选择Hartigan-Wong方法,即缺省状态
    km <- kmeans(scale(y),centers = 3, nstart = 20);km
    #便于看出聚类后的分类情况,sort()函数对分类情况排序
    sort(km$cluster)
    library(fpc)
    plotcluster(scale(y), km$cluster)   #生成聚类图

    24个菌株分为三类,第一类:1、2、3、4、5、7、9、10、11、16、18、22
    第二类:6、8、12、13、14、15、17、19、21、23、24
    第三类:20
    和张佳玉sas的结果完全一致。


    4. 结果导出(对应sas三个过程)

    * 4.1 例1.(2.1) cluster1数据的对变量分类* (k=3)

    x <- read.csv("cluster1.csv")
    r <- cor(x)
    d<-as.dist(1-r) 
    hc1<-hclust(d, "single"); hc2<-hclust(d, "complete")
    hc3<-hclust(d, "median"); hc4<-hclust(d, "mcquitty")
    n1 <- cutree(hc1,k=3);n2 <- cutree(hc2,k=3);n3 <- cutree(hc3,k=3);n4 <- cutree(hc4,k=3)
    n1=as.data.frame(n1);n2=as.data.frame(n2);n3=as.data.frame(n3);n4=as.data.frame(n4)
    n <- rbind(t(n1),t(n2),t(n3),t(n4))
    x[31,] <- n[1,];x[32,] <- n[2,];x[33,] <- n[3,];x[34,] <- n[4,]
    write.csv(x,"cluster1_result.csv")

    * 4.2 例4.(2.4) cluster2数据对样本分类* (k=3)

    y <- read.csv("cluster2.csv")
    bacterium <- dist(scale(y))
    hc1<-hclust(bacterium, "complete");hc2<-hclust(bacterium, "average")
    hc3<-hclust(bacterium, "centroid");hc4<-hclust(bacterium, "ward.D2")
    n1 <- cutree(hc1,k=3);n2 <- cutree(hc2,k=3);n3 <- cutree(hc3,k=3);n4 <- cutree(hc4,k=3)
    n1=as.data.frame(n1);n2=as.data.frame(n2);n3=as.data.frame(n3);n4=as.data.frame(n4)
    n <- cbind(n1,n2,n3,n4)
    y$n1 <- n$n1;y$n2 <- n$n2;y$n3 <- n$n3;y$n4 <- n$n4
    write.csv(y,"cluster2_result1.csv")

    * 4.3 例5.(3.3) K-均值法作cluster2的聚类分析* (k=3)

    y <- read.csv("cluster2.csv")
    km <- kmeans(scale(y),centers = 3, nstart = 20)
    y$cluster <- km$cluster
    write.csv(y,"cluster2_result2.csv")

    n1,n2,n3,n4(31,32,33,34)分别为最短距离法,最长距离法,中间距离法,Mcquitty相似法的分类结果

    展开全文
  • R语言聚类分析-kmeans聚类分析实战

    万次阅读 多人点赞 2018-04-12 22:47:17
    这次分享的是在工作中经常用到的聚类分析,只要是工作中涉及到客户分群,哪能不用到聚类分析呢?聚类分析涉及的方法有层次聚类、kmeans聚类、密度聚类等,这里主要介绍最容易上手的kmeans聚类算法,上手就是王道!...

    这次分享的是在工作中经常用到的聚类分析,只要是工作中涉及到客户分群,哪能不用到聚类分析呢?聚类分析涉及的方法有层次聚类、kmeans聚类、密度聚类等,这里主要介绍最容易上手的kmeans聚类算法,上手就是王道!

    kmeans聚类原理:基于原型的、划分的距离技术,它试图发现用户指定个数(K)的簇。统计学原理请大家自觉完成自学~~

    实战一:

    老板的需求:将17家门店分成3类,依据指标是销售金额和客户数量,其中要求销售金额权重(60%),客户数量权重(40%)

    需求解析:很幸运,这是一个具体的要求,恩!这里已经指定分类数量,并且要求对各个指标赋权重,那么就需要对各个指标依次进行聚类,得到分组后,对各组值赋一个分数,再将分数乘以权重比例相加,就能实现boss的要求~~

    #载入cluster
    library(cluster)
    #读入需要聚类的数据
    a<-read.csv("testdata.csv",header=TRUE)
    str(a)
    'data.frame':	17 obs. of  3 variables:
     $ 网点分类: Factor w/ 17 levels "store1","store10",..: 1 10 11 12 13 14 15 16 17 2 ...
     $ 销售金额: num  29.41 9.72 6.15 5.72 5.57 ...
     $ 客户数量: num  141.3 84.7 95 98.5 58.3 ...
    #查看数据前4行
    > head(a,n=4)
      网点分类  销售金额  客户数量
    1   store1 29.408587 141.33560
    2   store2  9.719984  84.67674
    3   store3  6.154773  95.00602
    4   store4  5.721835  98.48247
    #将第一个指标划分为3类
    res1<-kmeans(a$销售金额,3)
    #将第二个指标划分为3类
    res2<-kmeans(a$客户数量,3)
    #将聚类结果按列合并在数据集中
    res3<-cbind(a,res1$cluster,res2$cluster)
    #查看前4行数据
    > head(res3,n=4)
      网点分类  销售金额  客户数量 res1$cluster res2$cluster
    1   store1 29.408587 141.33560            3            1
    2   store2  9.719984  84.67674            1            2
    3   store3  6.154773  95.00602            1            2
    4   store4  5.721835  98.48247            1            2
    #两个指标的聚类中心
    > res1$centers
           [,1]
    1  5.519207
    2  2.566558
    3 29.408587
    > res2$centers
           [,1]
    1 123.11407
    2  86.39321
    3  64.49325
    #导出聚类结果
    write.csv(res3,file='res3.csv')

    因为聚类结果已经划分为3类,因此只要将3类结果赋予对应分值,然后按照权重计算出结果,解释出各个分类群体对应业务含义(其实就是打标签),就完成了门店的分类工作。

    实战二:

    老板需求:对我们的门店数据集进行分类

    需求解析:这是一个很普遍的情况~~这里业务场景没有指定数量,也没有对指标赋予权重,我们要做的是将两个指标:销售金额与客户数量一起作为聚类的指标,参与聚类,得出结果,打出标签!考虑到数据单位不同,建议处理使用数据时进行标准化处理。

    #载入factoextra包  
    library(factoextra)  
    #读入需要聚类的数据  
    a<-read.csv("testdata.csv",header=TRUE)  
    str(a)  
    #对数据进行标准化处理,需要去掉非数字的列  
    a1<-a[,-1]  
    b<-scale(a1)  
    #设置随机种子,保证试验客重复进行  
    set.seed(123)  
    #确定最佳聚类个数,使用组内平方误差和法  
    fviz_nbclust(b,kmeans,method="wss")+geom_vline(xintercept=4,linetype=2)  
    


    实用!这里函数直观给出最佳分类个数:4

    #根据最佳聚类个数,进行kmeans聚类
    res<-kmeans(b,4)
    #将分类结果放入原数据集中
    res1<-cbind(a,res$cluster)
    #导出最终结果
    write.csv(res1,file='res1.csv')
    #查看最终聚类图形
    fviz_cluster(res,data=a1)

    从图形可以看出fviz_cluster()函数功能还是非常强大,可视化效果很直观清晰,12号门店单独一类,6号门店单独一类,13号、9号等6家门店一类,11号、4号等9家一类,你需要做的是给这四类门店打标签,给出合理的业务描述,那么工作才算完成!

    今天的分享就到这里,欢迎交流,下次再见!

    展开全文
  • 聚类分析有很多种, 效果好不好大概要根据数据特征来确定。最常见的是kmeans法聚类>setwd("D:\\R_test")>data_in>fit>library(cluster)>clusplot(data_in,fit$cluster,color=T,shade=T,labels=2,...
  • 原文链接:R语言鸢尾花iris数据集的层次聚类分析​tecdat.cn介绍本文在数据集上展示了如何来增强Hierarchical Cluster Analysis(更好的可视化和灵敏度分析)。背景鸢尾花数据集​我们可以看到,Setosa物种与...
  • 基于R语言做层次聚类分析

    千次阅读 2021-05-12 10:14:47
    聚类分析法(Cluster Analysis) 是在多元统计分析中研究如何对样品(或指标)进行...原理就不多说了,我们今天主要来说下怎么使用R语言进行层次聚类分析,使用R包flexclust自带的数据nutrient,主要说的是27种肉类的营
  • 聚类分析原理及R语言实现过程

    千次阅读 2021-01-14 07:48:08
    聚类分析定义与作用:是把分类对象按照一定规则分成若干类,这些类不是事先设定的,而是根据数据的特征确定的。在同一类中这些对象在某种意义上趋向于彼此相似,而在不同类中对象趋向于彼此不相似。在经济、管理、...
  • 基本思想 每一个样本作为一类 ...**注意:一般聚类前要将数据进行标准化。**消除量纲影响 irisScaled <- scale(iris[, -5])# 数据标准化 具体实验步骤 计算样本之间的距离 d <- dist(irisScaled[, 1:4]) fitH
  • 基于R语言聚类分析

    2021-10-02 23:08:15
    最小距离法聚类分析运行结果 结果分析 2.最大距离法 最大距离法聚类分析运行结果 结果分析 距离法计算公式 最短距离法是类与类之间按照公式; 来计算的系统聚类法。它等于类Gp与类Gq中最邻近的两个样品...
  • R语言--聚类分析

    2020-11-07 11:18:46
    为了比较我国31个省、市、自治区2013年和2007年城镇居民生活消费的分布规律,根据调查资料作区域消费类型划分,并将2013年和2007你的数据进行对比分析,提交数据分析过程报告。今收集了八个反映城镇居民生活消费结构...
  • R语言聚类分析--cluster, factoextra

    万次阅读 多人点赞 2018-02-06 20:50:28
    R语言聚类分析–cluster, factoextra 本文转载自“R语言中文社区”,己获授权,宏基因组公众号编辑对内容进行测试、修改及补充。 原文链接:https://mp.weixin.qq.com/s/M_rJqcHz6HUlGIHVeN4RkQ 对于有很多...
  • R语言 聚类分析

    千次阅读 2017-02-18 14:04:38
    聚类分析聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。 聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,...
  • 2. 热点图+聚类 # 热点图 heatmap(Amat) 3. 纵向聚类图1 # 横向聚类1 library(amap) clu <- hclusterpar(Amat) plot(clu,sub="",hang = -1,xlab = NA,ylab = NA,main = NA) 4. 纵向聚类图2 # 横向聚类 ...
  • 基于R语言聚类分析(k-means,层次聚类)

    万次阅读 多人点赞 2017-12-17 21:42:11
    今天给大家展示基于R语言的聚类,在此之前呢,首先谈谈聚类分析,以及常见的聚类模型,说起聚类我们都知道,就是按照一定的相似性度量方式,把接近的一些个体聚在一起。这里主要是相似性度量,不同的数据类型,我们...
  • 【数据挖掘】使用R语言进行聚类分析

    万次阅读 多人点赞 2018-04-09 15:29:15
    本文主要介绍在R语言中使用k-means和K-Medoids进行聚类分析的方法。一、首先介绍下聚类分析中主要的算法:l K-均值聚类(K-Means) 十大经典算法l K-中心点聚类(K-Medoids)l 密度聚类(DBSCAN)l 系谱聚类...
  • 实验目的:了解系统聚类的原理,明白R语言系统聚类的函数 实验要求:课本中p77页习题4.3,p79习题4.5进行系统聚类和快速聚类 实验代码: 实验4.5
  • R语言算法之聚类分析

    2019-02-18 11:24:18
    R语言算法之聚类分析 Kmeans聚类 先以已知的鸢尾花数据集为例(它的类已知,为三类) 加载数据集 data(iris) # 查看数据集结构 head(iris) 数据处理: 图中可以看出,数据的单位差不了多少,不需要对数据集进行...
  • 聚类分析计算与分析(基于系统聚类法)下面以一个具体的例子来实现实证分析。2008年我国其中31个省、市和自治区的农村居民家庭平均每人全年消费性支出。根据原始数据对我国省份进行归类统计。原始数据如下注:数据来源...
  • 聚类分析的一般步骤:1.选择合适的变量2.缩放数据3.寻找异常点4.计算距离5.选择聚类算法6.获得一种或多种聚类方法7.确定聚类数目8.获得最终的聚类解决方案9.结果可视化10.解读类11.验证结果下面正式开始层次聚类的...
  • R语言 : 层次聚类分析

    千次阅读 2017-08-19 21:09:42
    R语言 层次聚类分析 双色球
  • 因子分析+聚类分析.R

    2019-05-25 10:13:37
    多元统计分析中 factor analysis和cluster analysis代码,采用r语言实现
  • R语言聚类分析之层次聚类(hierarchical clustering)实战 目录 R语言聚类分析之层次聚类(hierarchical clustering)实战 #距离计算 #层次聚类(基于平均链接距离) #选择聚类簇的个数 #最终聚类方案 #...
  • R语言聚类分析之基于划分的聚类KMeans实战:基于葡萄酒数据 目录 R语言聚类分析之基于划分的聚类KMeans实战:基于葡萄酒数据 #葡萄酒数据Kmeans聚类 #聚类效能评估 #围绕中心点的划分方法PAM #PAM算法聚类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,969
精华内容 6,787
关键字:

r语言聚类分析

友情链接: withkeycode.rar