ジュリアでクラスタリングパッケージを使用する方法
概要
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
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)
クラスタリングがうまく実行されたことが確認できます。
全コード
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