无监督学习 聚类分析①

简介: 聚类分析介绍聚类分析是一种数据规约技术,旨在借楼一个数据集中观测值的子集。他可以把大量的观测值归约未若干类。聚类分析被广泛应用于生物和行为科学,市场以及医学研究中。

聚类分析

介绍

  • 聚类分析是一种数据规约技术,旨在借楼一个数据集中观测值的子集。他可以把大量的观测值归约未若干类。聚类分析被广泛应用于生物和行为科学,市场以及医学研究中。例如一名心理学家可能基于抑郁症病人的症状和人口统计学数据对病人进行聚类,试图得出抑郁症的亚型,以期通过亚型来找到更加有针对性和有效的治疗方法,同时更好地理解这个疾病。医学研究人员通过对DNA微阵列数据进行聚类分析来获得基因表达模式,从而帮助他们理解人类的正常发育以及导致许多疾病的根本原因。

  • 最常用的两种聚类方法是层次聚类(hierarchical agglomerative clustring)和划分聚类(partitioning clustering)。在层次聚类中,每一个观测值自成一类,这些类每次两两合并,直到所有的类被聚成一类为止。在划分聚类中,首先指定类个数K,然后观测值被随机分成K类,再重新形成聚合的类。这两种方法都对应许多可供选择的聚类算法。对于层次聚类来说,最常用的算法是单联动和全联动以及质心。对于划分聚类来说,最常用的是K均值(K-means)和围绕中心点的划分(PAM)。每一类聚类方法都有它的优点和缺点。

步骤

  • 选择合适的变量
  • 缩放数据

如果我们在分析中选择的变量变化范围很大,那么该变量对结果的影响也是最大的。这往往是不可取的。最常用的将数据缩放的方法是将每个变量标准化为均值为0和标准差为1的变量。其他的方法包括每个变量被其最大值相除或该变量减去它的平均值并除以变量的平均绝对偏差。这三种方法如下:
df1 <- apply(mydata, 2, function(x){ (x-mean(x))/sd(x)})
df2 <- apply(mydata, 2, function(x){x/max(x)})
df3 <- apply(mydata, 2, function(x){x - mean(x))/mad(x)})

  • 寻找异常点。许多聚类方法对异常值是十分敏感的,他能扭曲我们得到的聚类方案。可以通过outliers包中的函数来筛选异常单变量利群点。mvoutlier包中心包含了能识别多元变量的离群点的函数。一个替代的方案是使用对异常值稳健的聚类方法,围绕中心店的划分。
  • 计算距离
    • 选择聚类算法:层次聚类对与小样本更实用,划分的方法能处理更大的数据量。
  • 获得一种或者多种聚类方法
  • 确定类的数目
  • 获得最终的聚类方案
  • 结果可视化
  • 解读类
  • 验证结果

计算距离


> setwd("E:\\Rwork")
> data(nutrient, package = "flexclust")
> head(nutrient, 4)
             energy protein fat calcium iron
BEEF BRAISED    340      20  28       9  2.6
HAMBURGER       245      21  17       9  2.7
BEEF ROAST      420      15  39       7  2.0
BEEF STEAK      375      19  32       9  2.6
> d <- dist(nutrient)
> as.matrix(d)[1:4,1:4]
             BEEF BRAISED HAMBURGER BEEF ROAST BEEF STEAK
BEEF BRAISED      0.00000   95.6400   80.93429   35.24202
HAMBURGER        95.64000    0.0000  176.49218  130.87784
BEEF ROAST       80.93429  176.4922    0.00000   45.76418
BEEF STEAK       35.24202  130.8778   45.76418    0.00000

层次聚类分析

如前所述,在层次聚类中,起初每一个实例或者观测值属于一类。聚类就是每一次把两类聚成新的一类,直到所有的类聚成单个类为止。算法如下:
(1) 定义每个观测值(行或单元) 为一类;

(2) 计算每类和其他各类的距离;

(3) 把距离最短的两类合并成一类,这样类的个数就减少一个;

(4) 重复步骤(2)和步骤,直到包含所有观测值的类合并成单个的类为止;

层次聚类可以用hclust()函数来实现,格式是hclust(d, method=),其中d是通过dist()函数产生的距离矩阵,并且方法包括"single". "complete". "average"."centroid"和"ward"。

  • 结果如下:

> setwd("E:\\Rwork")
> 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)

img_5128c9b07f8150d3f02714d81a1d53ea.png
  • 如果最终目的是这些食品分配的类较少,需要NbClust包来确定一个聚类分析里的最佳数目。
library(NbClust)
devAskNewPage(ask = TRUE)
nc <- NbClust(nutrient.scaled, distance = "euclidean", 
              min.nc = 2, max.nc = 15, method = "average")
table(nc$Best.n[1,])
barplot(table(nc$Best.n[1,]),
        xlab = "number of cluster", ylab = "number of criteria",
        main = "number of cluster chosen by 26 cruteria")
table(nc$Best.n[1,])

 0  1  2  3  4  5  9 10 13 14 15 
 2  1  4  4  2  4  1  1  2  1  4 
******************************************************************* 
* Among all indices:                                                
* 4 proposed 2 as the best number of clusters 
* 4 proposed 3 as the best number of clusters 
* 2 proposed 4 as the best number of clusters 
* 4 proposed 5 as the best number of clusters 
* 1 proposed 9 as the best number of clusters 
* 1 proposed 10 as the best number of clusters 
* 2 proposed 13 as the best number of clusters 
* 1 proposed 14 as the best number of clusters 
* 4 proposed 15 as the best number of clusters 

                   ***** Conclusion *****                            
 
* According to the majority rule, the best number of clusters is  2 
img_a7b07722111e432cfd3d2a159beea67b.png
  • 显示性状之间的关系
clusters <- cutree(fit.average, k=5)
table(clusters)
plot(fit.average, hang = -1, cex = .8,
     main = "average linkage clustering \ n5 cluster solution")

rect.hclust(fit.average, k =5)
img_ad8aa034dfe1b67e000809620363be35.png
目录
相关文章
|
缓存 Dart JavaScript
flutter版本控制工具 `FVM`
文章目录 FVM 切换VSCode 的Flutter版本 在windows上安装fvm 方法一:先安装 choco 检查安装是否成功 常用指令 接下来安装fvm 方法二:pub方式安装 fvm VSCode配置 安卓studio Flutter版本切换 项目 缓存目录 列出配置 设置缓存路径 配置 常用命令 安装 删除 列出 releases doctor 路由 配置全局版本 项目多个选项 针对不用flavor版本 切换flavor版本 查看flavor 常见问题 运行 FVM 时内核二进制文件无效或 sdk 哈希无效 PATH 中 Windows 的环境变量顺序 找不到命令“pub”
1094 1
flutter版本控制工具 `FVM`
|
传感器 编解码 知识图谱
Google Earth Engine ——MOD17A2H V6总初级生产力(GPP)产品是一个具有500米分辨率的8天累积综合数据产品
Google Earth Engine ——MOD17A2H V6总初级生产力(GPP)产品是一个具有500米分辨率的8天累积综合数据产品
1505 0
Google Earth Engine ——MOD17A2H V6总初级生产力(GPP)产品是一个具有500米分辨率的8天累积综合数据产品
|
11月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
252 52
|
10月前
|
弹性计算 运维 网络安全
阿里云云服务诊断工具评测报告
作为一名运维工程师,我日常负责云资源的运维和管理。阿里云的云服务诊断工具是我工作中的得力助手,尤其在健康状态和诊断功能方面表现出色。健康状态功能实时展示云资源的关键指标,帮助我提前发现并解决性能瓶颈;诊断功能则能迅速定位并解决各类复杂问题,显著提升工作效率。然而,该工具在面对新兴云服务架构和混合云环境时仍存在一定局限,建议进一步扩展监测指标和增强兼容性诊断能力,以提供更全面的支持。
|
存储 Java Maven
win自定义配置本地maven仓库位置,修改maven仓库位置
win自定义配置本地maven仓库位置,修改maven仓库位置
830 0
win自定义配置本地maven仓库位置,修改maven仓库位置
|
计算机视觉
【论文速递】CVPR2022 - 基于可重复使用的教师分类器的知识蒸馏
【论文速递】CVPR2022 - 基于可重复使用的教师分类器的知识蒸馏
|
iOS开发
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)(3)
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)
259 0
|
NoSQL Go Redis
Go异步任务处理解决方案:Asynq
Go异步任务处理解决方案:Asynq
550 1
Go异步任务处理解决方案:Asynq
|
搜索推荐 小程序 数据挖掘
数据分析思维导图
数据分析思维导图
|
缓存 应用服务中间件 数据库
淘宝服务端高并发分布式架构演进之路
淘宝服务端高并发分布式架构演进之路
313 0