热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

R语言混合型数据聚类

利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名

利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名义型变量和顺序型变量的数据)。本文将利用 Gower 距离、PAM(partitioning around medoids)算法和轮廓系数来介绍如何对混合型数据做聚类分析。

---------------------------------------------------------------------------------------------------

本文主要分为三个部分

  • 距离计算
  • 聚类算法的选择
  • 聚类个数的选择

为了介绍方便,本文直接使用 ISLR 包中的 College 数据集。该数据集包含了自 1995 年以来美国大学的 777 条数据,其中主要有以下几个变量:

  • 连续型变量
  1. 录取率
  2. 学费
  3. 新生数量
  • 分类型变量
  1. 公立或私立院校
  2. 是否为高水平院校,即所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50%

本文中涉及到的R包有:

 1 In [3]:
 2 
 3 set.seed(1680) # 设置随机种子,使得本文结果具有可重现性
 4 
 5 library(dplyr)
 6 library(ISLR)
 7 library(cluster)
 8 library(Rtsne)
 9 library(ggplot2)
10 Attaching package: ‘dplyr’
11 
12 The following objects are masked from ‘package:stats’:
13 
14     filter, lag
15 
16 The following objects are masked from ‘package:base’:
17 
18     intersect, setdiff, setequal, union

构建聚类模型之前,我们需要做一些数据清洗工作:

  • 录取率等于录取人数除以总申请人数
  • 判断某个学校是否为高水平院校,需要根据该学校的所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50% 来决定
 1 In [5]:
 2 
 3 college_clean <- College %>%
 4   mutate(name = row.names(.),
 5          accept_rate = Accept/Apps,
 6          isElite = cut(Top10perc,
 7                        breaks = c(0, 50, 100),
 8                        labels = c("Not Elite", "Elite"),
 9                        include.lowest = TRUE)) %>%
10   mutate(isElite = factor(isElite)) %>%
11   select(name, accept_rate, Outstate, Enroll,
12          Grad.Rate, Private, isElite)
13 
14 glimpse(college_clean)
15 Observations: 777
16 Variables: 7
17 $ name        (chr) "Abilene Christian University", "Adelphi University", "...
18 $ accept_rate (dbl) 0.7421687, 0.8801464, 0.7682073, 0.8369305, 0.7564767, ...
19 $ Outstate    (dbl) 7440, 12280, 11250, 12960, 7560, 13500, 13290, 13868, 1...
20 $ Enroll      (dbl) 721, 512, 336, 137, 55, 158, 103, 489, 227, 172, 472, 4...
21 $ Grad.Rate   (dbl) 60, 56, 54, 59, 15, 55, 63, 73, 80, 52, 73, 76, 74, 68,...
22 $ Private     (fctr) Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes,...
23 $ isElite     (fctr) Not Elite, Not Elite, Not Elite, Elite, Not Elite, Not...

R语言-混合型数据聚类R语言-混合型数据聚类距离计算

聚类分析的第一步是定义样本之间距离的度量方法,最常用的距离度量方法是欧式距离。然而欧氏距离只适用于连续型变量,所以本文将采用另外一种距离度量方法—— Gower 距离。

1Gower 距离

Gower 距离的定义非常简单。首先每个类型的变量都有特殊的距离度量方法,而且该方法会将变量标准化到[0,1]之间。接下来,利用加权线性组合的方法来计算最终的距离矩阵。不同类型变量的计算方法如下所示:

  • 连续型变量:利用归一化的曼哈顿距离
  • 顺序型变量:首先将变量按顺序排列,然后利用经过特殊调整的曼哈顿距离
  • 名义型变量:首先将包含 k 个类别的变量转换成 k 个 0-1 变量,然后利用 Dice 系数做进一步的计算
    • 优点:通俗易懂且计算方便
    • 缺点:非常容易受无标准化的连续型变量异常值影响,所以数据转换过程必不可少;该方法需要耗费较大的内存

利用 daisy 函数,我们只需要一行代码就可以计算出 Gower 距离。需要注意的是,由于新生入学人数是右偏变量,我们需要对其做对数转换。daisy函数内置了对数转换的功能,你可以调用帮助文档来获取更多的参数说明。

 1 In [6]:
 2 
 3 # Remove college name before clustering
 4 
 5 gower_dist <- daisy(college_clean[, -1],
 6                     metric = "gower",
 7                     type = list(logratio = 3))
 8 
 9 # Check attributes to ensure the correct methods are being used
10 # (I = interval, N = nominal)
11 # Note that despite logratio being called, 
12 # the type remains coded as "I"
13 
14 summary(gower_dist)
15 Out[6]:
16 
17 301476 dissimilarities, summarized :
18      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
19 0.0018601 0.1034400 0.2358700 0.2314500 0.3271400 0.7773500 
20 Metric :  mixed ;  Types = I, I, I, I, N, N 
21 Number of objects : 777

此外,我们可以通过观察最相似和最不相似的样本来判断该度量方法的合理性。本案例中,圣托马斯大学和约翰卡罗尔大学最相似,而俄克拉荷马科技和艺术大学和哈佛大学差异最大。

 1 In [7]:
 2 
 3 gower_mat <- as.matrix(gower_dist)
 4 
 5 # Output most similar pair
 6 
 7 college_clean[
 8   which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),
 9         arr.ind = TRUE)[1, ], ]
10 Out[7]:
11 
12      name    accept_rate    Outstate    Enroll    Grad.Rate    Private    isElite
13 682    University of St. Thomas MN    0.8784638    11712    828    89    Yes    Not Elite
14 284    John Carroll University    0.8711276    11700    820    89    Yes    Not Elite
15 In [8]:
16 
17 # Output most dissimilar pair
18 
19 college_clean[
20   which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),
21         arr.ind = TRUE)[1, ], ]
22 Out[8]:
23 
24      name    accept_rate    Outstate    Enroll    Grad.Rate    Private    isElite
25 673    University of Sci. and Arts of Oklahoma    0.9824561    3687    208    43    No    Not Elite
26 251    Harvard University    0.1561486    18485    1606    100    Yes    Elite

聚类算法的选择

现在我们已经计算好样本间的距离矩阵,接下来需要选择一个合适的聚类算法,本文采用 PAM(partioniong around medoids)算法来构建模型,PAM 算法的主要步骤:

  1. 随机选择 k 个数据点,并将其设为簇中心点
  2. 遍历所有样本点,并将样本点归入最近的簇中
  3. 对每个簇而言,找出与簇内其他点距离之和最小的点,并将其设为新的簇中心点
  4. 重复第2步,直到收敛

该算法和 K-means 算法非常相似。事实上,除了中心点的计算方法不同外,其他步骤都完全一致 。

  • 优点:简单易懂且不易受异常值所影响
  • 缺点:算法时间复杂度为 O(n2)

聚类个数的选择

我们将利用轮廓系数来确定最佳的聚类个数,轮廓系数是一个用于衡量聚类离散度的内部指标,该指标的取值范围是[-1,1],其数值越大越好。通过比较不同聚类个数下轮廓系数的大小,我们可以看出当聚类个数为 3 时,聚类效果最好。

 1 In [9]:
 2 
 3 # Calculate silhouette width for many k using PAM
 4 
 5 sil_width <- c(NA)
 6 
 7 for(i in 2:10){
 8   
 9   pam_fit <- pam(gower_dist,
10                  diss = TRUE,
11                  k = i)
12   
13   sil_width[i] <- pam_fit$silinfo$avg.width
14   
15 }
16 
17 # Plot sihouette width (higher is better)
18 
19 plot(1:10, sil_width,
20      xlab = "Number of clusters",
21      ylab = "Silhouette Width")
22 lines(1:10, sil_width)

聚类结果解释

1描述统计量

聚类完毕后,我们可以调用 summary 函数来查看每个簇的汇总信息。从这些汇总信息中我们可以看出:簇1主要是中等学费且学生规模较小的私立非顶尖院校,簇2主要是高收费、低录取率且高毕业率的私立顶尖院校,而簇3则是低学费、低毕业率且学生规模较大的公立非顶尖院校。

 1 In [18]:
 2 
 3 pam_fit <- pam(gower_dist, diss = TRUE, k = 3)
 4 
 5 pam_results <- college_clean %>%
 6   dplyr::select(-name) %>%
 7   mutate(cluster = pam_fit$clustering) %>%
 8   group_by(cluster) %>%
 9   do(the_summary = summary(.))
10 
11 print(pam_results$the_summary)
12 [[1]]
13   accept_rate        Outstate         Enroll         Grad.Rate      Private  
14  Min.   :0.3283   Min.   : 2340   Min.   :  35.0   Min.   : 15.00   No :  0  
15  1st Qu.:0.7225   1st Qu.: 8842   1st Qu.: 194.8   1st Qu.: 56.00   Yes:500  
16  Median :0.8004   Median :10905   Median : 308.0   Median : 67.50            
17  Mean   :0.7820   Mean   :11200   Mean   : 418.6   Mean   : 66.97            
18  3rd Qu.:0.8581   3rd Qu.:13240   3rd Qu.: 484.8   3rd Qu.: 78.25            
19  Max.   :1.0000   Max.   :21700   Max.   :4615.0   Max.   :118.00            
20       isElite       cluster 
21  Not Elite:500   Min.   :1  
22  Elite    :  0   1st Qu.:1  
23                  Median :1  
24                  Mean   :1  
25                  3rd Qu.:1  
26                  Max.   :1  
27 
28 [[2]]
29   accept_rate        Outstate         Enroll         Grad.Rate      Private 
30  Min.   :0.1545   Min.   : 5224   Min.   : 137.0   Min.   : 54.00   No : 4  
31  1st Qu.:0.4135   1st Qu.:13850   1st Qu.: 391.0   1st Qu.: 77.00   Yes:65  
32  Median :0.5329   Median :17238   Median : 601.0   Median : 89.00           
33  Mean   :0.5392   Mean   :16225   Mean   : 882.5   Mean   : 84.78           
34  3rd Qu.:0.6988   3rd Qu.:18590   3rd Qu.:1191.0   3rd Qu.: 94.00           
35  Max.   :0.9605   Max.   :20100   Max.   :4893.0   Max.   :100.00           
36       isElite      cluster 
37  Not Elite: 0   Min.   :2  
38  Elite    :69   1st Qu.:2  
39                 Median :2  
40                 Mean   :2  
41                 3rd Qu.:2  
42                 Max.   :2  
43 
44 [[3]]
45   accept_rate        Outstate         Enroll       Grad.Rate      Private  
46  Min.   :0.3746   Min.   : 2580   Min.   : 153   Min.   : 10.00   No :208  
47  1st Qu.:0.6423   1st Qu.: 5295   1st Qu.: 694   1st Qu.: 46.00   Yes:  0  
48  Median :0.7458   Median : 6598   Median :1302   Median : 54.50            
49  Mean   :0.7315   Mean   : 6698   Mean   :1615   Mean   : 55.42            
50  3rd Qu.:0.8368   3rd Qu.: 7748   3rd Qu.:2184   3rd Qu.: 65.00            
51  Max.   :1.0000   Max.   :15516   Max.   :6392   Max.   :100.00            
52       isElite       cluster 
53  Not Elite:199   Min.   :3  
54  Elite    :  9   1st Qu.:3  
55                  Median :3  
56                  Mean   :3  
57                  3rd Qu.:3  
58                  Max.   :3  

PAM 算法的另一个优点是各个簇的中心点是实际的样本点。从聚类结果中我们可以看出,圣弗朗西斯大学是簇1 的中心点,巴朗德学院是簇2 的中心点,而密歇根州州立大学河谷大学是簇3 的中心点。

1 In [19]:
2 
3 college_clean[pam_fit$medoids, ]
4 Out[19]:
5 
6      name    accept_rate    Outstate    Enroll    Grad.Rate    Private    isElite
7 492    Saint Francis College    0.7877629    10880    284    69    Yes    Not Elite
8 38    Barnard College    0.5616987    17926    531    91    Yes    Elite
9 234    Grand Valley State University    0.7525653    6108    1561    57    No    Not Elite

2可视化方法

t-SNE 是一种降维方法,它可以在保留聚类结构的前提下,将多维信息压缩到二维或三维空间中。借助t-SNE我们可以将 PAM 算法的聚类结果绘制出来,有趣的是私立顶尖院校和公立非顶尖院校这两个簇中间存在一个小聚类簇。

 1 In [22]:
 2 
 3 tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
 4 
 5 tsne_data <- tsne_obj$Y %>%
 6   data.frame() %>%
 7   setNames(c("X", "Y")) %>%
 8   mutate(cluster = factor(pam_fit$clustering),
 9          name = college_clean$name)
10 
11 ggplot(aes(x = X, y = Y), data = tsne_data) +
12   geom_point(aes(color = cluster))

进一步探究可以发现,这一小簇主要包含一些竞争力较强的公立院校,比如弗吉尼亚大学和加州大学伯克利分校。虽然无法通过轮廓系数指标来证明多分一类是合理的,但是这 13 所院校的确显著不同于其他三个簇的院校。

 1 In [25]:
 2 
 3 tsne_data %>%
 4   filter(X > 15 & X <25,
 5          Y > -15 & Y <-10) %>%
 6   left_join(college_clean, by = "name") %>%
 7   collect %>%
 8   .[["name"]]
 9 Out[25]:
10 
11 'Kansas State University'
12  
13 'North Carolina State University at Raleigh'
14 'Pennsylvania State Univ. Main Campus'
15  
16 'SUNY at Buffalo'
17 'Texas A&M Univ. at College Station'
18  
19 'University of Georgia'
20  
21 'University of Kansas'
22 'University of Maryland at College Park'
23  
24 'University of Minnesota Twin Cities'
25 'University of Missouri at Columbia'
26  
27 'University of Tennessee at Knoxville'
28 'University of Texas at Austin'

 

转自:http://mp.weixin.qq.com/s?__biz=MzA5NDQ3MDI4NA==&mid=2658610279&idx=1&sn=c913e162de03343a4f89410c18e503a9&scene=1&srcid=09093EVj3DjQk3Jr0UoGqBNT#rd

原文链接:https://dpmartin42.github.io/blogposts/r/cluster-mixed-types

 


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
wujianhong61391
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有