當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。