当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R pam 围绕 Medoid 进行分区


R语言 pam 位于 cluster 包(package)。

说明

将数据分区(聚类)为 k 集群 “around medoids”,这是 K-means 的更强大版本。

用法

pam(x, k, diss = inherits(x, "dist"),
    metric = c("euclidean", "manhattan"), 
    medoids = if(is.numeric(nstart)) "random",
    nstart = if(variant == "faster") 1 else NA,
    stand = FALSE, cluster.only = FALSE,
    do.swap = TRUE,
    keep.diss = !diss && !cluster.only && n < 100,
    keep.data = !diss && !cluster.only,
    variant = c("original", "o_1", "o_2", "f_3", "f_4", "f_5", "faster"),
    pamonce = FALSE, trace.lev = 0)

参数

x

数据矩阵或 DataFrame ,或相异矩阵或对象,具体取决于 diss 参数的值。

对于矩阵或 DataFrame ,每行对应一个观察值,每列对应一个变量。所有变量都必须是数字。允许缺失值 (NA s) — 只要每对观测值至少有一个案例不缺失。

在相异矩阵的情况下, x 通常是 daisydist 的输出。长度为 n*(n-1)/2 的向量也是允许的(其中 n 是观测值的数量),并且将以与上述函数的输出相同的方式进行解释。不允许缺少值 (NA s)。

k

正整数,指定簇的数量,小于观测值的数量。

diss

逻辑标志:如果为 TRUE(distdissimilarity 对象的默认值),则 x 将被视为相异矩阵。如果为 FALSE,则 x 将被视为变量观察值矩阵。

metric

字符串,指定用于计算观测值之间差异的度量。
当前可用的选项是"euclidean"和"manhattan"。欧几里得距离是差值的平方根,曼哈顿距离是绝对差值之和。如果x已经是相异矩阵,那么这个参数将被忽略。

medoids

NULL(默认)或长度 - k 整数索引向量(在 1:n 中)指定初始中心点,而不是使用 ‘build’ 算法。

nstart

仅当medoids = "random": 指定数字随机“starts”;这个参数对应于以下之一kmeans()(从R的包stats)。

stand

逻辑性;如果为真,则在计算差异之前对 x 中的测量值进行标准化。通过减去变量的平均值并除以变量的平均绝对偏差,对每个变量(列)的测量值进行标准化。如果x已经是相异矩阵,则该参数将被忽略。

cluster.only

逻辑性;如果为 true,则仅计算并返回聚类,请参阅详细信息。

do.swap

逻辑指示是否应该发生交换阶段。默认值 TRUE 对应于原始算法。另一方面,交换阶段比大型 的构建阶段需要更多的计算机密集程度,因此可以被 do.swap = FALSE 跳过。

keep.diss , keep.data

逻辑指示是否应将差异和/或输入数据x保留在结果中。将它们设置为 FALSE 可以得到更小的结果,因此甚至可以节省内存分配时间。

pamonce

0:6 中的逻辑或整数指定 Reynolds 等人提出的算法快捷方式。 (2006)以及舒伯特和卢梭(2019、2021)见下文。

variant

character 字符串,表示要使用的 PAM 算法的变体;应该优先使用 pamonce 的更多 self-documenting 版本;请注意,"faster" 不仅使用 pamonce = 6,还使用 nstart = 1,因此默认使用 medoids = "random"

trace.lev

整数,指定在算法的构建和交换阶段打印诊断的跟踪级别。默认 0 不打印任何内容;值越高,打印的内容就越多。

细节

Kaufman 和 Rousseuw (1990) 的第 2 章完整说明了基本的 pam 算法。与 kmeans 中的 k-means 方法相比,函数 pam 具有以下特点: (a) 它还接受相异矩阵; (b) 它更稳健,因为它最小化了差异之和,而不是欧氏距离平方和; (c) 它提供了一种新颖的图形显示,轮廓图(参见 plot.partition ) (d) 它允许在结果 pr <- pam(..) 上使用 mean(silhouette(pr)[, "sil_width"]) 或直接其组件 pr$silinfo$avg.width 选择簇的数量,参见还有pam.object

什么时候cluster.only为 true,结果只是一个指定聚类的(可能已命名的)整数向量,即
pam(x,k, cluster.only=TRUE)是相同的
pam(x,k)$clustering但计算效率更高。

pam-算法基于搜索k数据集观测值中的代表性对象或中心点。这些观察结果应该代表数据的结构。找到一组后k中心点,k通过将每个观测值分配给最近的中心点来构建聚类。目标是找到k代表性对象,将观察结果与其最接近的代表性对象的差异总和最小化。
默认情况下,当medoids没有指定,算法首先寻找一组好的初始中心点(这称为建造阶段)。然后它找到目标函数的局部最小值,即一个解决方案,使得具有中心点(即‘swap’)的观测值不会出现单一切换,这会降低目标(这称为交换阶段)。

当指定(或随机生成)medoids 时,它们的顺序并不重要;一般来说,算法的设计不依赖于观察的顺序。

pamonce 选项是集群 1.14.2(2012 年 1 月)中的新选项,由日内瓦大学的 Matthias Studer 根据 Reynolds 等人的研究结果提出。 (2006) 并由多特蒙德工业大学的 Erich Schubert 进行了扩展,并进行了 FastPAM 优化。

默认的 FALSE (或整数 0 )对应于原始的 “swap” 算法,而 pamonce = 1 (或 TRUE )对应于第一个提案....并且 pamonce = 2 另外实现了第二个提案以及。

除了线性近似构建之外,“FastPAM”(Schubert 和 Rousseeuw,2019)的关键思想均已实现,如下所示:

pamonce = 3

通过利用点不能同时最接近所有当前中心点,将运行时间减少 O(k) 倍。

pamonce = 4

另外,允许每次迭代执行多次交换,通常会减少迭代次数。

pamonce = 5

添加了从 pamonce = 2 方法复制的小优化,预计将是所包含的“FastPam”变体中最快的。

“FasterPAM”(Schubert 和 Rousseuw,2021)是通过

pamonce = 6

执行每次交换都会立即改善结果,因此每次迭代通常会进行多次交换;此交换算法以 运行,而不是 时间,这对于除小 之外的所有算法来说要快得多。

此外,“FasterPAM”使用中心点的随机初始化(而不是‘build’阶段)来避免构建算法的 初始化成本。特别是对于较大的 k,这会产生更快的算法,同时保持相似的结果质量。

人们可以通过设置 nstart > 1 来决定使用重复的随机初始化。

代表聚类的 "pam" 类的对象。有关详细信息,请参阅?pam.object

注意

对于大型数据集,pam 可能需要太多内存或太多计算时间,因为两者都是 。那么,clara() 更好,请参阅其文档。

当前 存在硬限制,因为对于较大的 大于最大整数 ( .Machine$integer.max = )。

例子

## generate 25 objects, divided into 2 clusters.
x <- rbind(cbind(rnorm(10,0,0.5), rnorm(10,0,0.5)),
           cbind(rnorm(15,5,0.5), rnorm(15,5,0.5)))
pamx <- pam(x, 2)
pamx # Medoids: '7' and '25' ...
summary(pamx)
plot(pamx)
## use obs. 1 & 16 as starting medoids -- same result (typically)
(p2m <- pam(x, 2, medoids = c(1,16)))
## no _build_ *and* no _swap_ phase: just cluster all obs. around (1, 16):
p2.s <- pam(x, 2, medoids = c(1,16), do.swap = FALSE)
p2.s

p3m <- pam(x, 3, trace = 2)
## rather stupid initial medoids:
(p3m. <- pam(x, 3, medoids = 3:1, trace = 1))


pam(daisy(x, metric = "manhattan"), 2, diss = TRUE)

data(ruspini)
## Plot similar to Figure 4 in Stryuf et al (1996)
## Not run: plot(pam(ruspini, 4), ask = TRUE)

作者

Kaufman and Rousseeuw's orginal Fortran code was translated to C and augmented in several ways, e.g. to allow cluster.only=TRUE or do.swap=FALSE, by Martin Maechler.
Matthias Studer, Univ.Geneva provided the pamonce (1 and 2) implementation.
Erich Schubert, TU Dortmund contributed the pamonce (3 to 6) implementation.

参考

Reynolds, A., Richards, G., de la Iglesia, B. and Rayward-Smith, V. (1992) Clustering rules: A comparison of partitioning and hierarchical clustering algorithms; Journal of Mathematical Modelling and Algorithms 5, 475-504. doi:10.1007/s10852-005-9022-1.

Erich Schubert and Peter J. Rousseeuw (2019) Faster k-Medoids Clustering: Improving the PAM, CLARA, and CLARANS Algorithms; SISAP 2020, 171-187. doi:10.1007/978-3-030-32047-8_16.

Erich Schubert and Peter J. Rousseeuw (2021) Fast and Eager k-Medoids Clustering: O(k) Runtime Improvement of the PAM, CLARA, and CLARANS Algorithms; Preprint, to appear in Information Systems (https://arxiv.org/abs/2008.05171).

也可以看看

agnes 用于背景和参考; pam.objectclaradaisypartition.objectplot.partitiondist

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Partitioning Around Medoids。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。