《数据科学:R语言实战》一第1章 模式的数据挖掘1.1 聚类分析

    xiaoxiao2023-12-28  122

    本节书摘来自异步社区《数据科学:R语言实战》一书中的第1章,第1.1节,作者 【美】Dan Toomey(丹·图米),更多章节内容可以访问云栖社区“异步社区”公众号查看

    第1章 模式的数据挖掘

    数据科学:R语言实战数据挖掘常用于检测数据中的模式或规则。

    兴趣点在于仅能够通过使用大数据集进行检测的不明显模式。一段时间内可以检测更简易的模式,如用于购买关联或时间选择的购物篮分析。我们对R编程的兴趣在于检测意外的关联,这能够带来新的机会。

    某些模式本质上是有序的,例如,基于以往结果预测系统中的故障,通过使用大数据集,以往结果会更加明确。下一章会探讨相关内容。

    本章探讨使用R来发现数据集不同方法中的模式。

    聚类分析:这是检测数据和建立多组相似数据点的过程。通过运用多种算法可以进行聚类分析。不同的算法着重使用数据分布的不同属性,如点间的距离、密度或统计范围。异常检测:这是着眼于表面相似但某些属性存在差异或异常的数据的过程。异常检测经常用于执法机关、欺诈检测及保险索赔等领域。关联规则:这是一组可以根据数据做出的决策。我们会寻找具体的步骤,这样,如果我们找到数据点,就可以运用规则确定是否可能存在另一个数据点。此规则经常用于购物篮方法。在数据挖掘中,我们寻找存在于数据中更深层次的不明显规则。

    1.1 聚类分析

    通过运用各种算法(如下表列举的一些算法)可进行聚类分析。

    在算法中,同样也有更高级别的粒度,其中包括硬聚类或软聚类等。

    硬聚类或软聚类:用于界定数据点是否可以成为一个以上集群的一部分。分割规则:用于确定如何向不同分区分配数据点,规则如下。严密:此规则检查分区是否包括不紧密的数据点。

    重叠:此规则检查分区是否以任何方式重叠。分层:此规则检查分区是否分层。在R编程中,聚类工具用于:

    K-means聚类;K-medoids聚类;分层聚类;期望最大化;密度估计。

    1.1.1 K-means聚类

    K-means聚类是将数据集分割成k集群的方法。需要预先确定将数据集分成几个集群。K-means算法的步骤如下所示。

    (1)从数据中选取k随机行(质心)(可使用预先确定的集群数量)。

    (2)我们使用Lloyd's算法(系统默认)来确定集群。

    (3)根据与质心的距离而对每个数据点进行分配。

    (4)将每个质心重新计算为与其相关的所有点的平均值。

    (5)对与质心距离最近的数据点进行重新分配。

    (6)继续执行步骤3和步骤4,直到不再分配数据点或循环次数已为最大值为止。

    这是启发式算法,最好多次运行流程。通常,此算法会在R中快速运行,原因在于每个步骤都不难执行。其目的是通过不断完善术语,将平方和降到最小。

    预先确定集群数量可能会出现问题。用图表表示数据(或平方等数值)应直观地呈现数据的逻辑分组。通过确定截止进行选择的步骤来进行迭代,以此来确定分组大小(本章后面会使用此步骤)。同样也有其他企图计算选择截止的R功能包。完成后,应核实选取集群的拟合。

    使用平均值(步骤3中)表示K-means无法与相当稀疏的数据或带有许多异常值的数据一起工作。此外,如果集群的线性形状不好,就会出现问题。图示应证明数据是否适合此算法。

    1.用法用kmeans函数在R编程中进行K-means聚类。使用k-means聚类的R编程遵循了此处提出的约定(注意:读者可以通过使用内联help函数确定函数的约定以便获取此信息,如?kmeans):

    kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE)

    下表对不同参数进行了说明。

    调用kmeans函数能够返回带有下列属性的kmeans对象。

    2.示例首先,在正态分布中生成了一百组随机数,并且将随机数分配给矩阵x,如下所示:

    >x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))

    我们可以显示生成的数值,如下所示:

    >x [,1] [,2] [1,] 0.4679569701 -0.269074028 [2,] -0.5030944919 -0.393382748 [3,] -0.3645075552 -0.304474590 [98,] 1.1121388866 0.975150551 [99,] 1.1818402912 1.512040138 [100,] 1.7643166039 1.339428999

    生成的kmeans对象值可确定并显示如下(使用10个集群):

    > fit <- kmeans(x,10) > fit K-means clustering with 10 clusters of sizes 4, 12, 10, 7, 13, 16, 8, 13, 8, 9 Cluster means: [,1] [,2] 1 0.59611989 0.77213527 2 1.09064550 1.02456563 3 -0.01095292 0.41255130 4 0.07613688 -0.48816360 5 1.04043914 0.78864770 6 0.04167769 -0.05023832 7 0.47920281 -0.05528244 8 1.03305030 1.28488358 9 1.47791031 0.90185427 10 -0.28881626 -0.26002816 Clustering vector: [1] 7 10 10 6 7 6 3 3 7 10 4 7 4 7 6 7 6 6 4 3 10 4 3 6 10 6 6 3 6 10 3 6 4 3 6 3 6 6 6 7 3 4 6 7 6 10 4 10 3 10 5 2 9 2 [55] 9 5 5 2 5 8 9 8 1 2 5 9 5 2 5 8 1 5 8 2 8 8 5 5 8 1 1 5 8 9 9 8 5 2 5 8 2 2 9 2 8 2 8 2 8 9 Within cluster sum of squares by cluster: [1] 0.09842712 0.23620192 0.47286373 0.30604945 0.21233870 0.47824982 0.36380678 0.58063931 0.67803464 0.28407093 (between_SS / total_SS = 94.6 %) Available components: [1] "cluster" "centers" "totss" "withinss" "tot. withinss" "betweenss" "size" "iter" "ifault"

    如果我们查看结果,就会发现某些有意思的数据点:

    Cluster means表示用于集群分配的平均值的分解。Clustering vector表示将100个数分配给哪个集群。Cluster sum of squares表示总平方和,如输出中所示。百分比值是betweenss值在totss值中的百分比。如果值为94.6%,说明拟合好。

    我们任意选取数量为10的集群,但是应核实此数字确实好用。通过使用一系列的集群大小多次运行kmeans函数,最终会得到一张与下列示例中图表相似的图表。

    例如,如果我们运行下列代码,并且记录结果,输出数据如下所示:

    results <- matrix(nrow=14, ncol=2, dimnames=list(2:15,c("clusters","s umsquares"))) for(i in 2:15) { fit <- kmeans(x,i) results[i-1,1] <- i results[i-1,2] <- fit$totss } plot(results)

    数据分布得越多,就越能够明确划分集群的最大数量,正如深层聚类的平方和不会有所增加。然而,由于测试中使用了平滑数据,因此可以增加集群数量。

    一旦确定了集群,您就能够收集到可视化表示形式,如下图所示:

    1.1.2 K-medoids聚类

    K-medoids聚类是确定数据集中集群的另一种方法。medoid是数据集的实体。数据集表示将medoid嵌入的群组。K-means与质心一起工作。质心是人为创造的概念,用以表示集群。所以,实际上,medoid是数据集的一部分,质心是派生数量。

    当围绕medoids进行分割时,务必确保注意下列事项。

    向每个实体仅分配一个集群。向每个实体分配用于界定集群的medoid。准确界定k集群。算法的两个阶段包括多个步骤,具体如下。构建阶段:在构建阶段,我们提出对集群进行初步估计。

    (1)随机选取成为medoids的k实体(可向算法提供k实体)。

    (2)计算相异度矩阵(计算数据集中观测值之间的所有成对相异点(距离))以便发现距离。

    (3)将每个实体分配给距离最近的medoid。

    交换阶段:在交换阶段,鉴于在构建阶段确定的集群比较粗糙,我们调整了初步估计。

    (1)搜索实体的每个集群,实体大大降低了平均相异系数,因此成为集群的medoid。

    (2)如果medoid出现变化,请从构建阶段的步骤3重新开始。

    1.用法用pam函数在R编程中进行K-medoid聚类:

    pam(x, k, diss, metric, medoids, stand, cluster.only, do.swap, keep.diss, keep.data, trace.lev)下表对pam函数的不同参数进行了说明。

    可显示从pam函数返回的结果,这样难以说明结果;或可绘图表示结果,这样能够直观地了解结果。

    2.示例使用带有两个(直观上)清晰集群的一组简单数据,如下表所示,此数据存储在名为medoids. csv的文件中:

    使用文件medoids. csv上的pam函数,如下所示:

    # load pam function > library(cluster) #load the table from a file > x <- read.table("medoids.csv", header=TRUE, sep=",") #execute the pam algorithm with the dataset created for the example > result <- pam(x, 2, FALSE, "euclidean") Looking at the result directly we get: > result Medoids: ID Object x y [1,] 2 2 2 11 [2,] 7 7 2 6 Clustering vector: [1] 1 1 1 1 2 2 2 2 2 Objective function: build swap 1.564722 1.564722 Available components: [1] "medoids" "id.med" "clustering" "objective" "isolation" [6] "clusinfo" "silinfo" "diss" "call" "data"

    对结果进行评估:

    我们指定使用两个medoids,并且选择第3行和第6行。这些行如同clustering vector中显示的那样聚集在一起(与预期一样,大约一半在第一个medoid,其余都在另一个medoid)。从构建阶段到交换阶段,函数未出现巨大变化(构建阶段的Objective function值为1.56,交换阶段的Objective function值也为1.56)。让我们通过摘要函数来进行更清楚的观察,可见下列结果:

    > summary(result) Medoids: ID Object x y [1,] 2 2 2 11 [2,] 7 7 2 6 Clustering vector: [1] 1 1 1 1 2 2 2 2 2 Objective function: build swap 1.564722 1.564722 Numerical information per cluster: sizemax_dissav_diss diameter separation [1,] 4 2.236068 1.425042 3.741657 5.744563 [2,] 5 3.000000 1.676466 4.898979 5.744563 Isolated clusters: L-clusters: character(0) L*-clusters: [1] 1 2 Silhouette plot information: cluster neighbor sil_width 2 1 2 0.7575089 3 1 2 0.6864544 1 1 2 0.6859661 4 1 2 0.6315196 8 2 1 0.7310922 7 2 1 0.6872724 6 2 1 0.6595811 9 2 1 0.6374808 5 2 1 0.5342637 Average silhouette width per cluster: [1] 0.6903623 0.6499381 Average silhouette width of total data set: [1] 0.6679044 36 dissimilarities, summarized : Min. 1st Qu. Median Mean 3rd Qu. Max. 1.4142 2.3961 6.2445 5.2746 7.3822 9.1652 Metric : euclidean Number of objects : 9 Available components: [1] "medoids" "id.med" "clustering" "objective" "isolation" [6] "clusinfo" "silinfo" "diss" "call" "data"

    下载示例代码

    凡购买过Packt出版的书籍的用户,均可访问http://www.packtpub.com,登录账户,并下载书籍的示例代码文件。如果读者是在别处购买的本书,可登录http://www.packtpub.com/support,注册账户,以便通过邮箱直接获取文件。摘要提供了有关medoid的更多详情,并介绍了如何选取medoid。然而,同样需注意相异度。

    通过用图表表示数据,可见下列输出数据:

    #plot a graphic showing the clusters and the medoids of each cluster > plot(result$data, col = result$clustering)

    生成图和预期一样。从图中能够清楚地看到分裂为两个medoid的数据,各有各的空间,并且用颜色区分二者。

    1.1.3 分层聚类

    分层聚类是确定数据集中某一层集群的方法。

    通过使用分层聚类,我们试图创建集群的层次,有如下两种方法。

    聚合法(或自底向上):在此方法中,每个实体开始都是自己的集群,并且当每组都提升层次时会合并。分裂法(或自顶向下):在此方法中,当所有实体下移层次时,就会归为一个集群,并且分裂。通常,通过使用系统树图的树形模型/图模型,显示生成的分层。

    用hclust函数在R编程中进行分层聚类。

    1.用法hclust函数调用如下所示:

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

    下表对hclust函数的不同参数进行了说明。

    2.示例开始,我们通过使用下列代码在正态分布上生成某些随机数据:

    > dat <- matrix(rnorm(100), nrow=10, ncol=10) > dat [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1.4811953 -1.0882253 -0.47659922 0.22344983 -0.74227899 0.2835530 [2,] -0.6414931 -1.0103688 -0.55213606 -0.48812235 1.41763706 0.8337524 [3,] 0.2638638 0.2535630 -0.53310519 2.27778665 -0.09526058 1.9579652 [4,] -0.50307726 -0.3873578 -1.54407287 -0.1503834 Then, we calculate the hierarchical distribution for our data as follows: > hc <- hclust(dist(dat)) > hc Call: hclust(d = dist(dat)) Cluster method : complete Distance : euclidean Number of objects : 10

    生成的数据对象未提供任何信息。我们通过使用系统树图显示分层集群,如下所示:

    >plot(hc)

    系统树图是预期的形状。我发现这些图表有些不易了解,但是,如果仔细研究,可得出如下推论。

    用自顶向下的方法读图,我们可以看出此图有两个不同的分支。这暗示着有两个截然不同的分组。在两个分支内,我们可以看出10和3与剩余部分截然不同。不出所料,我们确定有一个偶数组和一个奇数组。用自底向上的方法读图,我们可以看出许多元素相近、相似。这可从简单的随机分布预期得到。

    1.1.4 期望最大化

    期望最大化(EM)是评估统计模型中参数的过程。

    对于给定的模型,参数如下所示。

    X:这是一组观测数据。Z:这是一组缺失值。T:这是一组未知参数,应将其应用于模型中以便预测Z。执行期望最大化的步骤如下。

    (1)将未知参数(T)初始化为随机值。

    (2)通过使用新的参数值计算最优缺失值(Z)。

    (3)使用刚刚计算出的最优缺失值(Z)以便更好地评估未知参数(T)。

    (4)迭代采用步骤2和步骤3,直至收敛。

    此版本的算法生成了硬参数值(Z)。实际上,可能对软数值感兴趣,因为将概率分配给了参数的各种数值(Z)。通过硬值,我们可以选取特定的Z值。相反,我们可能会使用软值,因为通过某些概率分布Z会出现变化。

    利用mclust程序库里的Mclust函数在R编程中使用EM。Mclust的完整描述是通过EM算法拟合的正态混合模型,EM算法是基于模型的聚类、分类及密度估计,包括贝叶斯正则化。

    1.用法Mclust函数如下所示:

    Mclust(data, G = NULL, modelNames = NULL, prior = NULL, control = emControl(), initialization = NULL, warn = FALSE, ...)

    下表对Mclust函数的不同参数进行了说明。

    2.模型名称列表当Mclust函数试图决定哪个项目属于某一个集群时,此函数就会使用模型。单变量、多变量及单一分量数据集有不同的模型名称。目的在于选取说明数据的模型,例如:VII将用于数据,并且用每个集群的等体积取代进行球状取代。

    3.示例首先,我们必须加载包括mclust函数的程序库(我们需要将程序库安装在本地环境中),如下所示:

    > install.packages("mclust") > library(mclust)

    我们会在此示例中使用iris数据,如下所示:

    > data <- read.csv("http://archive.ics.uci.edu/ml/machine-learningdatabases/ iris/iris.data")

    现在,我们可以通过EM计算最优匹配(注意:大写Mclust),如下所示:

    > fit <- Mclust(data)

    结果显示如下所示:

    > fit 'Mclust' model object: best model: ellipsoidal, equal shape (VEV) with 2 components > summary(fit) ---------------------------------------------------- Gaussian finite mixture model fitted by EM algorithm ---------------------------------------------------- Mclust VEV (ellipsoidal, equal shape) model with 2 components: log.likelihood n df BIC ICL -121.1459 149 37 -427.4378 -427.4385 Clustering table: 1 2 49 100

    简单地显示fit数据对象不会提供太多信息,仅表示使用什么计算数据集的密度。

    summary指令显示了有关结果的更多详细信息,如下所列:

    log.likelihood(-121):这是BIC数值的对数似然值。n(149):这是数据点数量。df(37):这是分布。BIC(-427):这是贝叶斯信息准则,是最优值。ICL(-427):集成完全数据似然值——BIC的分类版本。由于我们有相同的ICL和BIC数值,因此可对数据点进行分类。为了能够直观地确认结果,可用图表表示结果,如下所示: > plot(fit)

    注意:EM 的plot指令生成了下列四个图。

    用于选择集群数量的BIC数值。有关聚类的图。有关分类不确定性的图。有关集群的轨道图。下图是密度图。

    第一幅图用不同的模型名称说明BIC范围和分量的数量。在这种情况下,我们可能不应该使用VEV,例如:

    第二幅图表示对使用数据馈送的每个分量与数据馈送的每隔一个分量进行比较以便确定产生的聚类。选取提供数据最优聚类的分量。熟悉数据是选取聚类的合适数据点的关键,这只是其中一例。

    在此示例中,我认为选取X5.1和X1.4会产生距离最近的集群,如下图所示。

    第三幅图表示不同选择对聚类迭代的影响,通过消除图中的任意点来突出主要集群,此图用于主要集群,如下所示。

    第四幅图是每个集群的轨道图,相对于每个集群的中心,突出显示点可能会出现在哪个地方,如下所示。

    1.1.5 密度估计

    密度估计是评估观测组中群组的概率密度函数的过程。密度估计过程会采用观测值,将其分散到若干数据点中,运行FF转换以便确定核心,然后运行线性近似来评估密度。

    密度估计对难以察觉的总体分布函数进行预估。用于生成密度估计的方法如下所示。

    Parzen窗:在此方法中,观测值放置在窗口中,密度估计根据接近度生成。向量量化:此方法让您按照观测值的分布做出概率密度函数的模型。直方图:可以直观地表示密度(条形的大小);而绘制直方图时所选择的bin的数量决定了密度的结果。

    通过R编程中的density函数进行密度估计。R中其他用于密度估计的函数如下所示。

    函数 描述

    1.用法density函数调用如下所示:

    density(x, bw = "nrd0", adjust = 1, kernel = c("gaussian", "epanechnikov", "rectangular", "triangular", "biweight", "cosine", "optcosine"), weights = NULL, window = kernel, width, give.Rkern = FALSE, n = 512, from, to, na.rm = FALSE, ...)

    下表对density函数的不同参数进行了说明。

    通过使用以下指令可发现可用带宽:

    bw.nrd0(x) bw.nrd(x) bw.ucv(x, nb = 1000, lower = 0.1 * hmax, upper = hmax, tol = 0.1 * lower) bw.bcv(x, nb = 1000, lower = 0.1 * hmax, upper = hmax, tol = 0.1 * lower) bw.SJ(x, nb = 1000, lower = 0.1 * hmax, upper = hmax, method = c("ste", "dpi"), tol = 0.1 * lower)

    下表对bw函数的不同参数进行了说明。

    2.示例iris数据集可使用如下:

    > data <- read.csv("http://archive.ics.uci.edu/ml/machine-learningdatabases/ iris/iris.data") The density of the X5.1 series (sepal length) can be computed as follows: > d <- density(data$X5.1) > d Call: density.default(x = data$X5.1) Data: data$X5.1 (149 obs.); Bandwidth 'bw' = 0.2741 x y Min.:3.478 Min. :0.0001504 1st Qu.:4.789 1st Qu.:0.0342542 Median :6.100 Median :0.1538908 Mean :6.100 Mean :0.1904755 3rd Qu.:7.411 3rd Qu.:0.3765078 Max. :8.722 Max. :0.3987472

    密度值可绘制如下:

    > plot(d)

    此图表示大部分数据都是出现在5和7之间。所以,萼片长度平均低于6。 相关资源:敏捷开发V1.0.pptx
    最新回复(0)