k-means法与k-medoids法都是基于距离判别的聚类算法。本文将使用iris数据集,在R语言中实现k-means算法与k-medoids算法。

  • k-means聚类

首先删去iris中的Species属性,留下剩余4列数值型变量。再利用kmeans()将数据归为3个簇

names(iris)
iris2 <- iris[,-5] #删去species一列
kmeans_result <- kmeans(iris2,3) #将数据归为3个簇
str(kmeans_result)    #查看数据结构
table(iris$Species,kmeans_result$cluster)  #查看聚类结果和观测值的对比

 

从聚类结果可看出,'versicolor‘类与'virginica’类之间存在小范围的重叠。有2个versicolor被错误归类为第一类,有14个'virginica’被归为第三类。

 plot(iris2[c('Sepal.Length','Sepal.Width')],col=kmeans_result$cluster)
points(kmeans_result$centers[,c('Sepal.Length','Sepal.Width')],col=1:3,pch=10,cex=3)

数据集有四个维度,而绘图只用了前两个维度的数据,
图中所示的一些靠近绿色中心的黑点实际在四维空间中更靠近黑色中心
需注意的是多次运行得到的K-means聚类结果可能不同,这是因为初始的簇中心是随机选择的

  • k-medoids聚类

先使用fpc包中的pamk()实现K-中心聚类,优点是不要求用户输入K的值

 #而是自动调用pam()或函数clara()更具最优平均阴影宽度估计的聚类簇个数来划分数据
library(fpc)
pamk.result <- pamk(iris2)
str(pamk.result)

pamk.result$nc #推荐使用两个簇

table(iris$Species,pamk.result$pamobject$clustering)

layout(matrix(c(1,2),1,2))   #图形显示为一行两列
plot(pamk.result$pamobject)

在 上 面 的 例 子 中 , 函 数 pamk() 生 成 了 两 个 簇 : 一 个 是 “ setosa ” , 另 一 个 是 “ versicolor ”
和 “ virgrnica " 的 混 合 。 在 图 6 . 2 中 , 左 边 的 图 像 为 两 个 簇 的 2 维 聚 类 图 像 ( “ clusplot " ) ,
两 个 簇 中 间 的 直 线 表 示 距 离 ; 右 边 的 图 像 显 示 了 这 两 个 簇 的 附 影 。 当 的 值 比 较 大 时 ( 接 近
1 ) 表 明 相 应 的 观 测 点 能 够 准 确 地 划 分 到 相 似 性 较 大 的 簇 中 , 当 的 值 比 较 小 时 ( 接 近 0 ) 表
明 观 测 点 位 于 这 两 个 簇 重 叠 的 部 分 。 如 果 观 测 点 的 凿 值 为 负 数 , 则 说 明 观 测 点 被 划 分 到 错 误
的 族 中 。 由 于 在 上 面 的 阴 影 图 中 , 两 个 簇 的 均 值 分 别 为 0 , 81 和 0 . 62 , 所 以 这 表 明 这 两 个
簇 的 划 分 结 果 很 好

接下来使用cluster包中的pam()函数

library(cluster)
pam.result <- pam(iris2,3)
table(pam.result$clustering,iris$Species)

对 比 上 面 两 个 聚 类 的 结 果 , 很 难 说 函 数 pamk() 和 pam() 哪 一 个 能 获 得 更 好 的 聚 类 结 果 ,
结 果 质 量 的 好 坏 依 赖 于 目 标 问 题 以 及 领 域 知 识 和 经 验 。 在 这 个 例 子 中 , 函 数 pam() 得 到 的 聚
类 结 果 似 乎 更 好 , 这 是 因 为 它 识 别 出 3 个 不 同 的 簇 , 分 别 对 应 于 3 个 不 同 的 种 类 。 因 此 , 使
用 启 发 式 方 法 来 识 别 簇 个 数 的 函 数 pamk() 并 不 意 味 着 总 是 能 得 到 更 好 的 聚 类 结 果 。 还 需 要 注
意 的 是 , 由 于 事 先 已 经 知 道 Species 属 性 确 实 只 包 含 了 3 个 种 类 , 因 此 在 使 用 函 数 pam() 时 将
设 置 为 3 也 具 有 一 定 的 投 机 性 。

  • 两种聚类算法的对比

  •  层次聚类

使用iris数据集,抽取40个样本

 set.seed()
idx <- sample(:nrow(iris),) #抽取40个数
iris_sample <- iris[idx,-] #抽取40个样本且删去species一列

out.dist <- dist(iris_sample,method = 'euclidean')#dist()将数据转化为两点之间的距离

hc <- hclust(out.dist,method='average') #代入两点距离(out.dist),method='ave'指使用类平均法聚类

plot(hc,hang=-1,labels=iris$Species[idx]) #labels:根据目测值添加标签

rect.hclust(hc,k=3) #归为三类

groups <- cutree(hc,k=3) #查看分类

  • 基于密度的聚类

 library(fpc)
iris2 <- iris[,-5]
ds <- dbscan(iris2,eps = 0.42,MinPts = 5) #设置可达距离和最小数目的对象点
table(ds$cluster,iris$Species)

‘1’-‘3’指被识别出来的三个聚类簇,‘0’表示噪声数据或离散点,即不属于任何簇的对象,绘制的图中使用黑色小圆圈表示

 plot(ds,iris2[c(1,4)]) #展示第一列和第四列的聚类结果

 plot(ds,iris2)

 

基于R实现k-means法与k-medoids法的更多相关文章

  1. 【转】时间序列分析——基于R,王燕

    <时间序列分析——基于R>王燕,读书笔记 笔记: 一.检验: 1.平稳性检验: 图检验方法:     时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列     自相关图检验:(ac ...

  2. 统计学习导论:基于R应用——第二章习题

    目前在看统计学习导论:基于R应用,觉得这本书非常适合入门,打算把课后习题全部做一遍,记录在此博客中. 第二章习题 1. (a) 当样本量n非常大,预测变量数p很小时,这样容易欠拟合,所以一个光滑度更高 ...

  3. 基于R语言的ARIMA模型

    A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...

  4. 如何求出数组中最小(或者最大)的k个数(least k问题)

    输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...

  5. (数据科学学习手札10)系统聚类实战(基于R)

    上一篇我们较为系统地介绍了Python与R在系统聚类上的方法和不同,明白人都能看出来用R进行系统聚类比Python要方便不少,但是光介绍方法是没用的,要经过实战来强化学习的过程,本文就基于R对2016 ...

  6. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...

  7. 快速排序/快速查找(第k个, 前k个问题)

    //快速排序:Partition分割函数,三数中值分割 bool g_bInvalidInput = false; int median3(int* data, int start, int end) ...

  8. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  9. 基于R语言的时间序列指数模型

    时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...

  10. (找到最大的整数k使得n! % s^k ==0) (求n!在b进制下末尾0的个数) (区间满足个数)

    题目:https://codeforces.com/contest/1114/problem/C 将b分解为若干素数乘积,记录每个素数含多少次方 b = p1^y1·p2^y2·...·pm^ym. ...

随机推荐

  1. Swap是个什么东东?

    要明白这个首先要知道什么是保护模式和实模式.以前的操作系统是实模式,例如dos.每个时候只有一个进程在跑,这个进程使用全部的物理内存.后来发展到保护模式,分时多进程.一个CPU上跑多个进程, 但进程不 ...

  2. node.js的npm命令常见错误及解决方案

    使用npm命令进行模块安装的时候场出现各种错误,本文总结我所遇到的各种错误,并提供解决方案.(大部分内容为网上收集) 首先使用淘宝 NPM 镜像 大家都知道国内直接使用 npm 的官方镜像是非常慢的, ...

  3. 32、SpringBoot-整合Dubbo

    分布式应用 在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring, Spring Boot+Spring Cloud. 分布式系统: Zook ...

  4. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

  5. BurpSuite Intruder 4种攻击模式

    BurpSuite intruder attack-type 4种爆破模式 Sniper 单参数爆破,多参数时同一个字典按顺序替换各参数,总之初始值有一个参数不变 Battering ram 多参数同 ...

  6. Jenkins Gitlab持续集成打包平台搭建

    http://www.cnblogs.com/skyseraph/p/5695021.html 1. 相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的 ...

  7. [转]TortoiseSVN客户端的安装

    TortoiseSVN是windows平台下Subversion的免费开源客户端. 一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要 ...

  8. LeetCode刷题(数据库)---- 交换工资

    题:给定一个工资表,如下所示,m=男性 和 f=女性 .交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然).要求使用一个更新查询,并且没有中间临时表. 例如: | id | nam ...

  9. PAT——1068. 万绿丛中一点红

    对于计算机而言,颜色不过是像素点对应的一个24位的数值.现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围8个相邻像素的颜色差充分大. 输入 ...

  10. Linux内存管理-高端内存(二)

    在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...