logo

ジュリアでクラスタリングパッケージを使用する方法 📂ジュリア

ジュリアでクラスタリングパッケージを使用する方法

概要

Juliaでは、クラスタリング用のパッケージとしてClustering.jlが提供されている1。実装されているアルゴリズムは次の通りです:

  • K-means
  • K-medoids
  • Affinity Propagation
  • Density-based spatial clustering of applications with noise (DBSCAN)
  • Markov Clustering Algorithm (MCL)
  • Fuzzy C-Means Clustering
  • 階層クラスタリング
    • Single Linkage
    • Average Linkage
    • Complete Linkage
    • Ward’s Linkage

コード

DBSCAN

iris.png

DBSCAN (Density-based spatial clustering of applications with noise)はdbscan()関数で実装されています。$p$次元のデータが$n$個ある場合、$p \times n$サイズの行列と半径radiusが引数として与えられなければなりません。

julia> points = [iris.PetalLength iris.PetalWidth]'
2×150 adjoint(::Matrix{Float64}) with eltype Float64:
 1.4  1.4  1.3  1.5  1.4  1.7  1.4  1.5  1.4  1.5  1.5  …  5.4  5.6  5.1  5.1  5.9  5.7  5.2  5.0  5.2  5.4  5.1      
 0.2  0.2  0.2  0.2  0.2  0.4  0.3  0.2  0.2  0.1  0.2     2.1  2.4  2.3  1.9  2.3  2.5  2.3  1.9  2.0  2.3  1.8      

julia> dbscaned = dbscan(points, 0.5)
DbscanResult(DbscanCluster[DbscanCluster(50, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10  …  41, 42, 43, 44, 45, 46, 47, 48, 49, 50], Int64[]), DbscanCluster(100, [51, 52, 53, 54, 55, 56, 57, 58, 59, 60  …  141, 142, 143, 144, 145, 146, 147, 148, 149, 150], Int64[])], [1, 51], [50, 100], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1  …  2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

julia> dbscaned |> propertynames
(:clusters, :seeds, :counts, :assignments)

DBSCANの結果はDbscanResultという構造体で返されます。.assignments.clusterが重要です。

各クラスタにどのデータポイントが属しているかは、次のようにgetproperty()関数を通じて得ることができます。

julia> getproperty.(dbscaned.clusters, :core_indices)
2-element Vector{Vector{Int64}}:
 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10  …  41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
 [51, 52, 53, 54, 55, 56, 57, 58, 59, 60  …  141, 142, 143, 144, 145, 146, 147, 148, 149, 150]

各データポイントがどのクラスタに属しているかは、次のように.assignmentsプロパティを通じて知ることができます。

julia> dbscaned.assignments
150-element Vector{Int64}:
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 ⋮
 2
 2
 2
 2
 2
 2
 2
 2
 2
 2
 2
 2
 2
 2

視覚化のコツとして、クラスタは任意の整数に割り当てられるので、散布図を描く際に*.assignmentsをそのままcolorオプションに入れると、次のように各クラスタに対応する色が指定されます。

scatter(iris.PetalLength, iris.PetalWidth,
xlabel = "PetalLength", ylabel = "PetalWidth",
color = dbscaned.assignments)

iris_dbscan.png

クラスタリングがうまく実行されたことが確認できます。

全コード

using Clustering
using RDatasets
iris = dataset("datasets", "iris")

scatter(iris.PetalLength, iris.PetalWidth, xlabel = "PetalLength", ylabel = "PetalWidth")
png("iris")

points = [iris.PetalLength iris.PetalWidth]'
dbscaned = dbscan(points, 0.5)
dbscaned |> propertynames

getproperty.(dbscaned.clusters, :core_indices)
dbscaned.assignments

scatter(iris.PetalLength, iris.PetalWidth,
xlabel = "PetalLength", ylabel = "PetalWidth",
color = dbscaned.assignments)

環境

  • OS: Windows
  • julia: v1.9.0
  • Clustering v0.15.4