介绍

一、实验说明

1. 环境登录

无需密码自动登录,系统用户名shiyanlou,密码shiyanlou

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序:

1. LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令
2. GVim:非常好用的编辑器,最简单的用法可以参考课程[Vim编辑器](http://www.shiyanlou.com/courses/2)
3. R:在命令行输入‘R’进入交互式环境,下面的代码都是在交互式环境运行。

3. 环境使用

使用R语言交互式环境输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。

完成实验后可以点击桌面上方的“实验截图”保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。

实验记录页面可以在“我的主页”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

二、课程介绍

这一节课主要介绍一些聚类的方法,包括k-均值聚类、k-中心点聚类、层次聚类和密度聚类。前面两节是介绍采用k-均值算法和k-中心点算法给鸢尾花数据聚类;第三节是关于使用相同的数据采取层次聚类算法的例子;最后一节介绍密度聚类和DBSCAN聚类算法思想,并演示如何使用DBSCAN算法聚类,并使用这个聚类模型给新的数据分类。

三、课程内容

1、K-Means聚类

这一节介绍使用鸢尾花数据进行k-均值聚类。

首先进行数据预处理:

> library(cluster)
# 建立一个新的鸢尾花数据集
> iris2 <- iris
# 移除数据集中关于种类的划分
> iris2$Species <- NULL
# 将数据进行k-均值聚类分为3类
> (kmeans.result <- kmeans(iris2, 3))
# 将k-Means聚类的结果与实际数值进行对比
> table(iris$Species, kmeans.result$cluster)

对比结果显示:

上图显示了setosa(山鸢尾)可以很容易从其他花种中区分开,但是versicolor(变色鸢尾)和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 = 8, cex=2)

聚类图如下:

###2、k中心点聚类

本节介绍使用函数pam()和pamk()实现k中心点聚类算法。k中心点聚类和k均值聚类算法很接近,它们之间主要的区别是:在k均值算法中,它的中心代表一个类,而在k中心点算法中将与类中心对象最接近的点作为一个类。

PAM(Partitioning Around Medoids)是k中心点聚类中一个经典算法,它的思想是基于距离聚类,具有良好的抗噪声、抗偏离点的能力。它的弱点是不能处理大量的数据,但是经过改良的算法CLARA算法选取数据的多个样本,在每个样本上都使用PAM算法,然后选取最好的聚类结果。PAM和CLARA这两个算法在R中可以通过包‘cluster’中的函数pam()和clara()实现,这两个函数都需要指定聚类的数量k。但是在包'fpc'中的函数pamk()可以通过调用pam()或者clara()选择效果最优的聚类数。

使用下面的代码观察聚类情况:

> library(fpc)
> pamk.result <- pamk(iris2)
# 聚类数量
> pamk.result$nc
# 检验聚类情况
> table(pamk.result$pamobject$clustering, iris$Species)
> layout(matrix(c(1,2),1,2)) # 一张图被分割为两个部分
> plot(pamk.result$pamobject)
# 将绘制的两个图表合并在一张图上显示
> layout(matrix(1))

输出结果如下:

上面的例子中,pamk()将数据集分为两类:一类是‘setosa’,另外一类是‘versicolor’和‘virginica’的混合数据。上图中,左半部分的图是一个二维的聚类图,里面的紫线显示了两个类别之间的距离。右半部分的图是这两个类的投影图,轮廓线si越接近1就说明该观测值聚类情况非常好;si越接近0就说明该观测值不容易被区分,处于两个类别之间。si为负值就说明该数据被错误分类。Si(i=1,2)分别代表第一类和第二类的平均投影情况,它们分别是0.81和0.62说明聚类情况良好。

接下来令聚类数量k=3使用pam()聚类。

> pam.result <- pam(iris2, 3)
> table(pam.result$clustering, iris$Species)
> layout(matrix(c(1,2),1,2))
> plot(pam.result)
> layout(matrix(1))

显示结果如下:

上图左半部分显示:第一类花‘setosa’能很好的与另外两类花区分,第二类和第三类花就有一些相似的地方,也就是说这两类鸢尾花的一些数据不能被正确的判别。

根据上面使用pamk()和pam()的两个聚类例子很难判断哪一种聚类方法更好,这取决于目标问题和各自的经验与知识领域。在这个例子中,pam()函数似乎更好一点,能够将鸢尾花聚为3类。所以pamk()不一定能给出最好的聚类数量。我们需要知道的是pam()函数使用的时候,是通过人为的方式设置了k=3,如果在不知道鸢尾花数据分类的情况下,聚类效果又是不一样的。

###3、层次聚类

这一节学习使用函数hclust()对鸢尾花数据集进行层次聚类。

首先,从鸢尾花数据集中抽取40个样本,这样就会避免聚类图上的点拥挤甚至重叠在一起,像之前一样也要把数据集中花的种类去掉,然后对数据进行分层聚类:

> idx <- sample(1:dim(iris)[1], 40)
> irisSample <- iris[idx,]
> irisSample$Species <- NULL
# method="ave"指的是取对象之间的平均距离为组间距离
> hc <- hclust(dist(irisSample), method="ave")
> plot(hc, hang = -1, labels=iris$Species[idx])
# 将聚类树分为3类
> rect.hclust(hc, k=3)
# 返回分类结果
> groups <- cutree(hc, k=3)

绘制的聚类树状图如下:

同k均值聚类结果一样,"setosa"这类花能被轻易的识别,第二类和第三类花仍然不能够很好的被区分。

###4、基于密度的聚类

使用包‘fpc’可以实现DBSCAN算法从而对数值型数据进行聚类。基于密度的聚类算法的目标是将一个高密度分布的数据区域划分为一类,依次类推,从而达到将数据分为几类的效果。在DBSCAN算法中有以下两个重要参数:

1. eps:可达距离,定义邻域的大小
2. MinPts:领域eps内所有满足为一类点的数量最小值要求。

如果给定点a邻域内的样本点数不超过MinPts,那么a就是一个核心对象。所有在a点附近的点如果是密度可达的,也就是说到点a的距离小于或者等于可达距离eps,那么这些点就被划分到a这一类。

密度聚类的优势在于它可以发现各种形状和大小的类并且对噪声不敏感。而k均值算法倾向于发现相同大小的球形类分布的数据群。

下面是关于鸢尾花数据集的基于密度的聚类算法实现:

> library(fpc)
> iris2 <- iris[-5] # 移除分类标签
> ds <- dbscan(iris2, eps=0.42, MinPts=5)
# 将聚类结果与原始类标签进行对比
> table(ds$cluster, iris$Species)

对比结果如下:

上表中,第一列中的1-3分别是已经分好的3类,而0代表噪声和异常值,也就是没有被分到任何类的对象。

> plot(ds, iris2)

上图中黑色的圆圈就是噪声(异常值)。

另外一种显示聚类结果的方式是使用包fpc内的函数plotcluster(),我们可以观察到不同类的数据已经被标签识别。

> plotcluster(iris2, ds$cluster)

在分析新数据与类之间的相似性的基础上,聚类模型可以给新数据进行分类。下面的例子就是从鸢尾花数据集中抽取10个样本,并结合加一些噪声组成一个新的数据集用来分类。其中,函数runif()可以生成均匀分布的噪声数据。

# 设置随机种子,随机产生10个鸢尾花样本
> set.seed(435)
> idx <- sample(1:nrow(iris), 10)
# 移除分类属性列
> newData <- iris[idx,-5]
> newData <- newData + matrix(runif(10*4, min=0, max=0.2), nrow=10, ncol=4)
# 给新数据分类
> myPred <- predict(ds, iris2, newData)
# 将聚类结果画图显示
> plot(iris2[c(1,4)], col=1+ds$cluster)
> points(newData[c(1,4)], pch="*", col=1+myPred, cex=3)
# 检验聚类效果
> table(myPred, iris$Species[idx])


                                                                                                  图4.1

                                                                                                       图4.1

[译]用R语言做挖掘数据《五》的更多相关文章

  1. [译]用R语言做挖掘数据《二》

    数据探索 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: ...

  2. [译]用R语言做挖掘数据《六》

    异常值检测 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: ...

  3. [译]用R语言做挖掘数据《七》

    时间序列与数据挖掘 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用 ...

  4. [译]用R语言做挖掘数据《四》

    回归 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: 1. ...

  5. [译]用R语言做挖掘数据《三》

    决策树和随机森林 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到 ...

  6. [译]用R语言做挖掘数据《一》

    介绍 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: 1. ...

  7. R语言实现金融数据的时间序列分析及建模

    R语言实现金融数据的时间序列分析及建模 一 移动平均    移动平均能消除数据中的季节变动和不规则变动.若序列中存在周期变动,则通常以周期为移动平均项数.移动平均法可以通过数据显示出数据长期趋势的变动 ...

  8. 用R语言 做回归分析

    使用R做回归分析整体上是比较常规的一类数据分析内容,下面我们具体的了解用R语言做回归分析的过程. 首先,我们先构造一个分析的数据集 x<-data.frame(y=c(102,115,124,1 ...

  9. R语言分析朝阳医院数据

    R语言分析朝阳医院数据 本次实践通过分析朝阳医院2016年销售数据,得出“月均消费次数”.“月均消费金额”.“客单价”.“消费趋势”等结果,并据此作出可视化图形. 一.读取数据: library(op ...

随机推荐

  1. mono+jexus 部署Asp.Net Mvc5之CompilationException2

    好不容易在ubuntu上搭建了mono+jexus,欣喜若狂的部署上发布的网站,急忙打开,成功运行. 但是别高兴的太早,当我打开WebApi帮助页时出现了CompilationException. 一 ...

  2. HtmlHelper扩展之mvchtmlstring

    后台: using System;using System.Web;using System.Web.Mvc; namespace EwayFramework.Utils.Token{ public ...

  3. cesium随笔 — 获取当前鼠标的经度、纬度、高度

    代码: function getPosition() { //得到当前三维场景 var scene = viewer.scene; //得到当前三维场景的椭球体 var ellipsoid = sce ...

  4. swagger简单配置

    第一步: 在nuget.org中查找Swashbuckle并下载 在nuget.org中查找Swagger.net.UI,并下载 第二步: 下载完之后,App_Start多了三个文件 Swagger. ...

  5. C#之通过图片地址下载图片

    因为项目上需要加载在线卫星云图,因此写了这个功能来把卫星云图下载的本地,在这里记录一下: string imageUrl=“http://image.nmc.cn/product/2018/08/06 ...

  6. A - 最少拦截系统 (最长上升子序列)

    点击打开链接 A - 最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度. ...

  7. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  8. C# Winform 小技巧(Datagridview某一列按状态显示不同图片)

    步骤: 一.导入状态图片到项目中: 二.在窗体中声明一个图片数组,并在窗体的OnLoad事件中加入图片资源: /// <summary> /// 存储状态图片序列,避免同一状态对图片重复读 ...

  9. apollo配置中心初探

    近在搞微服务框架的开发,需要有一个配置中心来满足统一管理业务应用以及组件的配置,在此期间也使用了多个配置中心比如:spring cloud config,自研的配置中心,当然还有apollo. spr ...

  10. spark 广播变量

    Spark广播变量 使用广播变量来优化,广播变量的原理是: 在每一个Executor中保存一份全局变量,task在执行的时候需要使用和这一份变量就可以,极大的减少了Executor的内存开销. Exe ...