ClusterR ClusterRパート2

この記事は、クラスタリングについてであり、CRANに最近追加されたClusterRパッケージです。 以下の詳細と例は、主にVignetteパッケージに基づいています。



クラスター分析またはクラスター化は、あるグループ内のオブジェクト(クラスターと呼ばれる)が他のグループ(クラスター)のオブジェクトよりも(ある意味では)互いに類似するように、オブジェクトのセットをグループ化するタスクです。 これは、研究データ分析の主要なタスクの1つであり、以下を含むさまざまな分野で使用される標準的な統計分析手法です。 機械学習、パターン認識、画像分析、情報検索、バイオインフォマティクス、データ圧縮、コンピューターグラフィックス。



クラスタリングアルゴリズムの最も有名な例は、 接続ベースのクラスタリング (階層的クラスタリング)、 中心ベースのクラスタリング (k-means法、k-medoid法)、 分布ベースのクラスタリング (GMM-Gaussian混合モデル)、および密度 (DBSCAN-ノイズを伴うアプリケーションの密度ベースの空間クラスタリング-密度に基づくノイズを伴うアプリケーションの空間クラスタリング、OPTICS-クラスタリング構造を識別するための順序点-クラスタリング構造を決定するための順序点など)



最初の部分 :分布のガウス混合(GMM)、k-means法、ミニグループのk-means法。



K-medoid法



k-medoidアルゴリズム (L. Kaufman、P. Russo、1987)は、k-meansアルゴリズムおよびmedoid変位アルゴリズムと共通のクラスタリングアルゴリズムです。 k-meansとk-medoidsのアルゴリズムは分離されており、どちらも同じクラスターからの点とこのクラスターの中心によって指定された点の間の距離を最小化しようとします。 k-meansアルゴリズムとは異なり、k-medoidメソッドはデータセットからポイントを中心 (medoidまたは標準) として選択し、 ポイントの距離の任意のメトリックで機能します。 kを決定するための便利なツールは、輪郭の幅です。 k-medoid法は、2乗ユークリッド距離の合計ではなく、ペアワイズ偏差の合計を最小化するため、k-meansよりもノイズと異常値に対して耐性があります。 medoidは、クラスター内の他のすべてのオブジェクトからの平均偏差が最小のクラスターのオブジェクトとして定義できます。 これは、クラスターの中心に最も近いポイントです。



k-medoidクラスタリングの最も一般的な実装は、Partitioning Around Medoids(PAM)アルゴリズムです。 RAMには、「ビルド」(ビルド)と「再配置」(SWAP)の2つのフェーズがあります。 BUILDフェーズでは、アルゴリズムは初期medoidの適切なセットを検索し、SWAPフェーズでは、目的関数が減少しなくなるまで、BUILD medoidと値の間のすべての可能な移動が実行されます(オブジェクト指向環境でのクラスタリング、A.Shtruyf、M.Hubert 、P。Russo、1997)。



ClusterRパッケージでは、関数Cluster_MedoidsおよびClara_MedoidsはPAM(medoidの周りのパーティション分割)およびCLARA(大規模アプリケーションのクラスタリング)アルゴリズムに対応しています。



次のコード例では、 マッシュルームデータを使用して、ユークリッド以外の距離メトリックでk-medoidメソッドがどのように機能するかを示します。 マッシュルームデータは、23のカテゴリ属性(クラスを含む)と8124値で構成されています。 パッケージのドキュメントには、このデータに関する詳細が記載されています。



Cluster_Medoids


入力として、 Cluster_Medoids関数は(データ行列に加えて)偏差行列も受け入れることができます。 すべての変数がカテゴリ(2つ以上の一意の値)であるマッシュルームデータの場合、 ガウアー距離を使用することは理にかなっています。 距離ガワーは、タイプ(数値、順序付き、および順序なしリスト)に応じて、さまざまなインジケーターにさまざまな機能を使用します。 この偏差メトリックは、クラスターパッケージ( デイジー機能)およびFDパッケージ( gowdis機能)の中でも特に、多くのRパッケージに実装されています。 FDパッケージのgowdis関数を使用します。これにより、ユーザー定義の重みを別の要素として設定することもできます。



data(mushroom) X = mushroom[, -1] y = as.numeric(mushroom[, 1]) #     gwd = FD::gowdis(X) #   'gower'    gwd_mat = as.matrix(gwd) #     cm = Cluster_Medoids(gwd_mat, clusters = 2, swap_phase = TRUE, verbose = F)
      
      





adjust_rand_index avg_silhouette_width
0.5733587 0.2545221
前述のように、FDパッケージのgowdis関数を使用すると、ユーザーは個々の変数に異なる重みを設定できます。 たとえば、 ランダム検索を使用して、より良いクラスタリング結果を実現するなど、重みを調整できます。 たとえば、個々の変数のこのような重みを使用すると、 調整済みランドインデックス (外部検証)と平均シルエット幅 (平均輪郭幅、内部検証)の両方を改善できます。

予測因子 重り
cap_shape 4.626
cap_surface 38.323
cap_color 55.899
あざ 34.028
臭い 169.608
gill_attachment 6.643
gill_spacing 42.08
gill_size 57.366
gill_color 37.938
stalk_shape 33.081
stalk_root 65.105
stalk_surface_above_ring 18.718
stalk_surface_below_ring 76.165
stalk_color_above_ring 27.596
stalk_color_below_ring 26.238
veil_type 0.0
veil_color 1.507
リング番号 37.314
リングタイプ 32.685
spore_print_color 127.87
人口 64.019
生息地 44.519


 weights = c(4.626, 38.323, 55.899, 34.028, 169.608, 6.643, 42.08, 57.366, 37.938, 33.081, 65.105, 18.718, 76.165, 27.596, 26.238, 0.0, 1.507, 37.314, 32.685, 127.87, 64.019, 44.519) gwd_w = FD::gowdis(X, w = weights) #  'gower'    d_mat_w = as.matrix(gwd_w) #     cm_w = Cluster_Medoids(gwd_mat_w, clusters = 2, swap_phase = TRUE, verbose = F)
      
      





adjust_rand_index avg_silhouette_width
0.6197672 0.3000048


Clara_Medoids


CLARA (大規模アプリケーションのクラスタ化-大規模アプリケーションのクラスタリング)は、大規模データセットのクラスタリングに適した選択肢です。 データセット全体のmedoidを検索する代わりに-不一致マトリックスの計算も不可能なタスクです-CLARAは小さなサンプルを取得し、PAMアルゴリズム(Partitioning Around Medoids)を適用して、このサンプルのmedoidの最適なセットを生成します。 得られたmedoidの品質は、データセット内の各オブジェクトとそのクラスターのmedoidの平均の非類似性によって決まります。



ClusterRパッケージのClara_Medoids関数は同じロジックを使用し、 Cluster_Medoids関数を各サンプルに適用します。 Clara_Medoidsはさらに2つのパラメーター、 samplesおよびsample_sizeを受け入れます。 1つ目は、元のデータセットから形成する必要があるサンプルの数を決定し、2つ目は、サンプル形成の各反復におけるデータの割合(0.0〜1.0の小数)を決定します。 Cluster_Medoids関数と異なり、 Clara_Medoids関数は不一致マトリックスを入力として受け入れないことに注意してください



以前に使用したマッシュルームデータセットにClara_Medoids関数を適用し、 ハミング距離を不一致メトリックとして、計算時間と結果をCluster_Medoids関数の結果と比較します。 ハミング距離は、次のようにキノコデータに適しています。 離散変数に適用可能であり、2つの比較されたインスタンスに対して異なる値をとる属性の数として定義されます(「データマイニングアルゴリズム:Rによる説明」、Powell Chikosh、2015、p。318)。



 cl_X = X #    #  Clara_Medoids     #      for (i in 1:ncol(cl_X)) { cl_X[, i] = as.numeric(cl_X[, i]) } start = Sys.time() cl_f = Clara_Medoids(cl_X, clusters = 2, distance_metric = 'hamming', samples = 5, sample_size = 0.2, swap_phase = TRUE, verbose = F, threads = 1) end = Sys.time() t = end - start cat('time to complete :', t, attributes(t)$units, '\n') #   : 3.104652 
      
      





adjust_rand_index avg_silhouette_width
0.5944456 0.2678507


 start = Sys.time() cl_e = Cluster_Medoids(cl_X, clusters = 2, distance_metric = 'hamming', swap_phase = TRUE, verbose = F, threads = 1) end = Sys.time() t = end - start cat('time to complete :', t, attributes(t)$units, '\n') #   : 14.93423 
      
      





adjust_rand_index avg_silhouette_width
0.5733587 0.2545221


ハミング距離を使用すると、 Clara_MedoidsCluster_Medoidsは( ガウアー距離の結果と比較して)ほぼ同じ結果を返しますが、 Clara_Medoids関数はこのデータセットのCluster_Medoidsより4倍以上高速です。



最後の2つのコードフラグメントの結果を使用して、 Silhouette_Dissimilarity_Plot関数を使用して、グラフに等高線の幅をプロットできます。 ここで言及する価値があるのは、 Clara_Medoids関数の輪郭の非類似性と幅は、 Cluster_Medoids関数の場合のように、データセット全体ではなく、最良の選択に基づいていることです。



 #     "Clara_Medoids" Silhouette_Dissimilarity_Plot(cl_f, silhouette = TRUE)
      
      







 #     "Cluster_Medoids" Silhouette_Dissimilarity_Plot(cl_e, silhouette = TRUE)
      
      







k-Medoid関数のリンク



k-medoidの関数( Cluster_MedoidsおよびClara_Medoids )の実装には、最初は最初のmedoidがk-meansアルゴリズムの中心と同じ方法で初期化されると思ったため、かなり時間がかかりました。 なぜなら KaufmanとRussoの本にはアクセスできませんでした。詳細なドキュメントを含むクラスターパッケージは大いに役立ちました。 必要に応じて、アルゴリズム、PAM(Medoidのパーティション分割-Medoidの分離)、およびCLARA(大規模アプリケーションのクラスタリング-大規模アプリケーションのクラスタリング)の両方が含まれ、結果を比較できます。



次のコードフラグメントでは、前の量子化の例に基づいて、 クラスターパッケージのpam関数と、ClusterRパッケージのCluster_Medoidsおよび受信したmedoidsを比較します。



 #==================================== #  pam  cluster #==================================== start_pm = Sys.time() set.seed(1) pm_vq = cluster::pam(im2, k = 5, metric = 'euclidean', do.swap = TRUE) end_pm = Sys.time() t_pm = end_pm - start_pm cat('time to complete :', t_pm, attributes(t_pm)$units, '\n') #   : 12.05006  pm_vq$medoids
      
      





 # [,1] [,2] [,3] # [1,] 1.0000000 1.0000000 1.0000000 # [2,] 0.6325856 0.6210824 0.5758536 # [3,] 0.4480000 0.4467451 0.4191373 # [4,] 0.2884769 0.2884769 0.2806337 # [5,] 0.1058824 0.1058824 0.1058824
      
      





 #==================================== #  Cluster_Medoids  ClusterR   6  (   OpenMP) #==================================== start_vq = Sys.time() set.seed(1) cl_vq = Cluster_Medoids(im2, clusters = 5, distance_metric = 'euclidean', swap_phase = TRUE, verbose = F, threads = 6) end_vq = Sys.time() t_vq = end_vq - start_vq cat('time to complete :', t_vq, attributes(t_vq)$units, '\n') #   : 3.333658  cl_vq$medoids
      
      





 # [,1] [,2] [,3] # [1,] 0.2884769 0.2884769 0.2806337 # [2,] 0.6325856 0.6210824 0.5758536 # [3,] 0.4480000 0.4467451 0.4191373 # [4,] 0.1058824 0.1058824 0.1058824 # [5,] 1.0000000 1.0000000 1.0000000
      
      





 #==================================== #  Cluster_Medoids  ClusterR    #==================================== start_vq_single = Sys.time() set.seed(1) cl_vq_single = Cluster_Medoids(im2, clusters = 5, distance_metric = 'euclidean', swap_phase = TRUE, verbose = F, threads = 1) end_vq_single = Sys.time() t_vq_single = end_vq_single - start_vq_single cat('time to complete :', t_vq_single, attributes(t_vq_single)$units, '\n') #   : 8.693385  cl_vq_single$medoids
      
      





 # [,1] [,2] [,3] # [1,] 0.2863456 0.2854044 0.2775613 # [2,] 1.0000000 1.0000000 1.0000000 # [3,] 0.6325856 0.6210824 0.5758536 # [4,] 0.4480000 0.4467451 0.4191373 # [5,] 0.1057339 0.1057339 0.1057339
      
      





このデータセット(5625行と3列)の場合、OpenMPが使用可能な場合(6ストリーム)、 Cluster_Medoids関数はpam関数のほぼ4倍の速度で同じmedoidを返します。



ClusterRパッケージの現在のバージョンは、私のGithubリポジトリで入手できます。バグレポートについては、 このリンクを使用してください



All Articles