基于高斯混合的数据聚类
导言
本例介绍了一种在由高斯分布的混合生成的合成数据上实现刚性聚类算法的技术。
混合高斯模型是解决聚类分析问题的有效工具。 该方法的基本思想是,作为训练模型的结果而获得的多维正态分布的分量可以被解释为数据结构中的单独聚类。
混合物的每个组分都由其自己的参数表征-数学期望的向量和协方差矩阵,这使得可以对各种几何形状,大小和空间取向的聚类进行建模。 这种方法提供了多维数据在统计上合理地划分为同质组。
这种技术对于分析复杂结构的数据特别有效,其中传统的聚类方法可能由于球形聚类的假设而表现出有限的准确性。
初始数据
我们将导入并附加必要的库。
import PkgPkg.add(["Random", "Distributions", "LinearAlgebra", "Clustering", "GaussianMixtures"])using Random, Distributions, LinearAlgebra, Clustering, GaussianMixtures
让我们使用函数对两个二维高斯分布的混合数据进行建模 MvNormal.
Random.seed!(123)μ1 = [1.0, 2.0]σ1 = [3.0 0.2; 0.2 2.0]μ2 = [-1.0, -2.0]σ2 = [2.0 0.0; 0.0 1.0]X1 = rand(MvNormal(μ1, σ1), 200)'X2 = rand(MvNormal(μ2, σ2), 100)'X = vcat(X1, X2)точек = size(X, 1)
让我们显示生成数据的散点图。
график1 = scatter(X[:, 1], X[:, 2], markersize=3, markercolor=:black, marker=:o, legend=false, title="点集")# , xlabel="X₁", ylabel="X₂")display(график1)
为生成的数据训练模型
让我们为生成的数据训练一个双分量混合高斯模型。 在该演示中,混合物的组分的数量是预先已知的,并且对应于数据生成中使用的初始分布的数量。
gm = GMM(2, X; kind=:full, nIter=5000, nInit=100, method=:kmeans)
让我们创建一个脚本,用于同时显示一组点和轮廓。
function отобразить(X, gm) к = size(gm.μ, 1) μs = gm.μ Σ_ = gm.Σ веса = gm.w function gmPDF(x, y) точка = [x, y] сумма = 0.0 for k in 1:к μ = μs[k, :] L = Σ_[k] Σ = L * L' распределение = MvNormal(μ, Σ) сумма += веса[k] * pdf(распределение, точка) end return сумма end x_сетка = range(-5, 6, length=80) y_сетка = range(-5, 6, length=80) plot(size=(800, 600)) scatter!(X[:, 1], X[:, 2], label="", color=:black, markersize=3, marker=:circle, alpha=0.7) contour!(x_сетка, y_сетка, (x,y)->gmPDF(x,y), levels=20, color=:jet, linewidth=3.5, colorbar=false, label="", alpha=0.8) title!("一组点和轮廓") # xlabel!("X₁") # ylabel!("X₂") return current()end
我们可视化的轮廓估计概率密度的双分量混合分布。
график2 = отобразить(X, gm)display(график2)
每个分量的最大概率密度区域的观察到的分离表明数据结构允许它们有意义地分成两个簇。 该视觉证据证实了使用双分量混合高斯模型对所考虑的数据集进行聚类的有效性。
使用训练好的模型对数据进行聚类
让我们创建一组函数: предсказать 和 кластеризация. 这些函数执行刚性聚类,其中每个数据点唯一地属于恰好一个聚类的方法。 对于混合高斯模型,聚类将每个观测值分配给混合的两个分量之一。 每个选定聚类的中心对应于混合物的相应组分的期望向量,其提供聚类结果的有意义的解释。
function предсказать(gm::GMM, X::Matrix{Float64}) точек = size(X, 1) к = size(gm.μ, 1) метки = zeros(Int, точек) for i in 1:точек точка = X[i, :] макс_вероятность = -Inf лучший = 1 for k in 1:к μ = gm.μ[k, :] L = gm.Σ[k] Σ = L * L' распределение = MvNormal(μ, Σ) логарифм_плотности = logpdf(распределение, точка) логарифм_вероятности = log(gm.w[k]) + логарифм_плотности if логарифм_вероятности > макс_вероятность макс_вероятность = логарифм_вероятности лучший = k end end метки[i] = лучший end return меткиendfunction кластеризация(gm::GMM, X::Matrix{Float64}) return предсказать(gm, X)end
该函数返回整数标签的向量,其中每个值对应于相应观测值所属的聚类编号。 这允许您明确地将初始样本划分为与混合物的选定组分相对应的子集。
idx = кластеризация(gm, X)
让我们显示聚类结果。
function диаграмма(X, idx; colors=[:red, :blue], markers=[:+, :o])# ,标题=["集群1","集群2"]) p = plot(size=(800, 600), legend=:best) уникальные = unique(idx) for (i, кластер) in enumerate(уникальные) маска = idx .== кластер x_класт = X[маска, 1] y_класт = X[маска, 2] форма_маркера = markers[i] == :+ ? :circle : :dtriangle scatter!(x_класт, y_класт, markershape=форма_маркера, markercolor=colors[i], markersize=5, label="")# , label=titles[i]) end return pendграфик3 = диаграмма(X, idx)title!(график3, "聚类化")# xlabel!(图3,"x∶")# 伊拉贝尔!(图3,"x∶")display(график3)
每个选定的聚类对应于混合分布中的二维正态分量之一。 聚类算法将每个点分配给对应于最大估计概率的混合物的分量,因此这种方法提供了数据的统计上健全的分离。
聚类成员概率的估计
让我们创建一个用于直接计算估计概率矩阵的特殊函数。
function оценка(gm, X) точек = size(X, 1) к = size(gm.μ, 1) P = zeros(точек, к) for i in 1:точек логарифмы = zeros(к) for k in 1:к μ = gm.μ[k, :] L = gm.Σ[k] Σ = L * L' распределение = MvNormal(μ, Σ) логарифм_плотности = logpdf(распределение, X[i, :]) логарифмы[k] = log(gm.w[k]) + логарифм_плотности end макс_лог = maximum(логарифмы) смещенные = логарифмы .- макс_лог эксп_вероятности = exp.(смещенные) P[i, :] = эксп_вероятности ./ sum(эксп_вероятности) end return Pend
让我们计算并显示属于混合物的第一个成分的每个观察的概率。
P = оценка(gm, X)кластер1 = idx .== 1кластер2 = idx .== 2график4 = plot(size=(800, 600))scatter!(X[кластер1, 1], X[кластер1, 2], marker_z = P[кластер1, 2], markersize = 5, marker = :dtriangle, linewidth = 1.5, clims = (0, 1), color = :jet, colorbar = true, colorbar_title = "Оценочная вероятность", label="")# ,label="集群1")scatter!(X[кластер2, 1], X[кластер2, 2], marker_z = P[кластер2, 2], markersize = 5, marker = :circle, linewidth = 1.5, clims = (0, 1), color = :jet, label="")# ,label="Cluster2",colorbar=true,colorbar_title="估计概率")title!("估计概率")# xlabel!("X₁")# ylabel!("X₂")display(график4)
矩阵 它是一个维度数组 ,包含属于聚类的观测值的概率。
为集群分配新数据
在初始样本上训练的模型用于对附加观测值进行聚类。 将每个新点与在分析源数据阶段确定的分布分量进行比较。
让我们使用函数创建一个混合高斯模型 MixtureModel 使用先前定义的参数-数学期望的向量和组件的标准偏差。 此方法在建模中提供了更高级别的抽象,因为它允许您将分布模型作为封装混合物的所有参数(包括分量权重和协方差矩阵)的完整对象来处理。
mix = MixtureModel([MvNormal(μ1, σ1), MvNormal(μ2, σ2)], [0.75, 0.25])X0 = collect(rand(mix, 75)')
我们将为集群分配新数据并可视化结果。
idx0 = кластеризация(gm, X0)график5 = plot(size=(800, 600))к = size(gm.μ, 1)μs = gm.μΣ_ = gm.Σвеса = gm.wfunction gmPDF(x, y) точка = [x, y] сумма = 0.0 for k in 1:к μ = μs[k, :] L = Σ_[k] Σ = L * L' распределение = MvNormal(μ, Σ) сумма += веса[k] * pdf(распределение, точка) end return суммаendx_min, x_max = minimum(X0[:, 1])-1, maximum(X0[:, 1])+1y_min, y_max = minimum(X0[:, 2])-1, maximum(X0[:, 2])+1x_сетка = range(x_min, x_max, length=80)y_сетка = range(y_min, y_max, length=80)contour!(x_сетка, y_сетка, (x,y)->gmPDF(x,y), levels=20, color=:jet, linewidth=1.5, alpha=0.7, label="", colorbar=false)for (i, кластер) in enumerate(unique(idx0)) маска = idx0 .== кластер x_класт = X0[маска, 1] y_класт = X0[маска, 2] форма_маркера = i == 1 ? :dtriangle : :circle цвет_маркера = i == 1 ? :blue : :red # 集群编号="集群$i" scatter!(x_класт, y_класт, markershape=форма_маркера, markercolor=цвет_маркера, markersize=5, alpha=0.7, label="")# ,标签=簇号endtitle!("新数据的聚类")# xlabel!("X₁")# ylabel!("X₂")# legend!(position=:best)display(график5)
在计算属于聚类的新观测值的概率时,使用在模型训练阶段确定的混合分量的估计比例。 因此,跨集群的新数据分布应与为原始样本建立的比例相对应。
结论
本文演示了一种基于高斯混合模型的基于刚性聚类算法的多维数据聚类分析方法。 使用从二维正态分布的混合物生成的合成数据的示例,示出了分析的全周期:从对初始样本建模并训练混合物的参数到对训练和新观测两者进行分类。
主要结论:
-
混合高斯模型是一种有效且统计上可靠的聚类工具,它允许通过用一组正态分量近似经验分布来描述各种形状、大小和方向的聚类。
-
刚性聚类通过将每个观测值分配给具有最大估计概率的分量来实现,提供了将数据划分为组的明确且可解释的划分,其中心与混合物的相应分量的数
-
成员概率的计算不仅为研究人员提供了确定性聚类,而且还提供了分类不确定性的定量度量,这为在需要概率方法的任务中使用软聚类方法开辟了可
-
所考虑的方法的一个重要优点是其泛化能力:训练的模型可用于聚类新数据,前提是保持主要群体的统计同质性,这通过使用在训练阶段获得的估计混
实际意义:
所提出的方法可被推荐用于广泛的应用任务,包括客户数据库的分割、生物医学数据的分类、多维时间序列的分析以及需要在统计上合理地分配复杂数据结构中的同质对象组的其他领域。