AnyMath 文档
Notebook

基于高斯混合的数据聚类

导言

本例提出了一种在由高斯分布的混合生成的合成数据上实现刚性聚类算法的方法。

混合高斯模型是解决聚类分析问题的有效工具。 该方法的基本思想是,作为训练模型的结果而获得的多维正态分布的分量可以被解释为数据结构中的单独聚类。

混合物的每个组分都由其自己的参数表征-数学期望的向量和协方差矩阵,这使得可以对各种几何形状,大小和空间取向的聚类进行建模。 这种方法提供了多维数据在统计上合理地划分为同质组。

这种技术对于分析复杂结构的数据特别有效,其中传统的聚类方法可能由于聚类球形度的假设而表现出有限的准确性。

初始数据

我们将导入并附加必要的库。

In [ ]:
import PkgPkg.add(["Random", "Distributions", "LinearAlgebra", "Clustering", "GaussianMixtures"])using Random, Distributions, LinearAlgebra, Clustering, GaussianMixtures

让我们使用函数对两个二维高斯分布的混合数据进行建模 MvNormal.

In [ ]:
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)点数=大小(X,1)

让我们显示生成数据的散点图。

In [ ]:
график1 = scatter(X[:, 1], X[:, 2], markersize=3, markercolor=:black, marker=:o, legend=false, title="点集")# , xlabel="X₁", ylabel="X₂")显示(图1)

为生成的数据训练模型

让我们为生成的数据训练一个双分量混合高斯模型。 在该演示中,混合物的组分的数量是预先已知的,并且对应于数据生成中使用的初始分布的数量。

In [ ]:
gm = GMM(2, X; kind=:full, nIter=5000, nInit=100, method=:kmeans)
Out[ ]:
GMM{Float64} with 2 components in 2 dimensions and full covariance
Mix 1: weight 0.343617
 mean: [-0.7377815809293755, -1.942919371363109]
 covariance: 2×2 Matrix{Float64}:
 2.12472   0.294642
 0.294642  0.994616
Mix 2: weight 0.656383
 mean: [0.800774284695651, 2.041802685241795]
 covariance: 2×2 Matrix{Float64}:
 3.29572   0.218722
 0.218722  1.8319

让我们创建一个脚本,同时显示一组点和轮廓。

In [ ]:
功能显示(X,gm)    k=尺寸(gm。μ, 1)    μs = gm.μ    Σ_ = gm.Σ    权重=gm。w         function gmPDF(x, y)        =[x,y]        金额=0.0        对于k在1:k            μ = μs[k, :]            L = Σ_[k]            Σ = L * L'            分布=MvNormal(μ,Σ)            总和+=权重[k]*pdf(分布,)        end        退货金额    end        x_set=范围(-5,6,长度=80)    y_set=范围(-5,6,长度=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
Out[ ]:
отобразить (generic function with 1 method)

我们可视化的轮廓估计概率密度的双分量混合分布。

In [ ]:
graph2=显示(X,gm)显示(图2)

每个分量的最大概率密度区域的观察到的分离表明数据结构允许它们有意义地分成两个簇。 该视觉证据证实了使用双分量混合高斯模型对所考虑的数据集进行聚类的有效性。

使用训练好的模型对数据进行聚类

让我们创建一组函数: предсказатькластеризация. 这些函数执行刚性聚类,其中每个数据点唯一地属于恰好一个聚类的方法。 对于混合高斯模型,聚类将每个观测值分配给混合的两个分量之一。 每个选定聚类的中心对应于混合物的相应组分的期望向量,其提供聚类结果的有意义的解释。

In [ ]:
函数预测(gm::GMM,X::矩阵{Float64})    点数=大小(X,1)    k=尺寸(gm。μ, 1)    placemarks=(Int,dots)    对于I in1:分        =X[i,:]        max_概率=-Inf        最佳=1        对于k在1:k            μ = gm.μ[k, :]            L = gm.Σ[k]            Σ = L * L'            分布=MvNormal(μ,Σ)            密度对数=logpdf(分布,点)            概率对数=log(gm.w[k])+密度对数            如果概率的对数>max_概率                max_概率=对数_概率                最佳=k            end        end        标签[i]=最佳    end    返回标签end函数聚类(gm::GMM,X::Matrix{Float64})    回报预测(gm,X)end
Out[ ]:
кластеризация (generic function with 1 method)

该函数返回整数标签的向量,其中每个值对应于相应观测值所属的聚类编号。 这允许您明确地将初始样本划分为与混合物的选定组分相对应的子集。

In [ ]:
idx=聚类(gm,X)
Out[ ]:
300-element Vector{Int64}:
 2
 2
 2
 2
 2
 2
 2
 1
 2
 2
 2
 2
 2
 ⋮
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1

让我们显示聚类结果。

In [ ]:
function диаграмма(X, idx; colors=[:red, :blue], markers=[:+, :o])# ,标题=["集群1","集群2"])    p = plot(size=(800, 600), legend=:best)    unique=唯一(idx)    for(i,cluster)in enumerate(unique)        掩码=idx。==集群        x_clast=X[掩码,1]        y_clast=X[掩码,2]        form_marker=标记[i]==:+? :圆::dtriangle        scatter!(x_класт, y_класт, markershape=форма_маркера, markercolor=colors[i], markersize=5, label="")# , label=titles[i])    end    return pendgraph3=图表(X,idx)title!(график3, "聚类化")# xlabel!(图3,"x∶")# 伊拉贝尔!(图3,"x∶")显示(图3)

每个选定的聚类对应于混合分布中的二维正态分量之一。 聚类算法将每个点分配给对应于最大估计概率的混合物的分量,因此,这种方法提供了数据的统计上健全的分离。

聚类成员概率的估计

让我们创建一个用于直接计算估计概率矩阵的特殊函数。

In [ ]:
功能评分(gm,X)    点数=大小(X,1)    k=尺寸(gm。μ, 1)    P=零(点,k)    对于I in1:分        对数=零(k)        对于k在1:k            μ = gm.μ[k, :]            L = gm.Σ[k]            Σ = L * L'            分布=MvNormal(μ,Σ)            密度对数=logpdf(分布,X[i,:])            对数[k]=log(gm.w[k])+对数_disness        end        max_log=最大值(对数)        移位=对数。-max_log        exp_probabilities=exp。(流离失所)        P[i,:]=exp_概率。/总和(exp_概率)    end    return Pend
Out[ ]:
оценка (generic function with 1 method)

让我们计算并显示属于混合物的第一个成分的每个观察的概率。

In [ ]:
P=分数(gm,X)cluster1=idx。== 1cluster2=idx。== 2graph4=plot(大小=(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₂")显示(图4)

矩阵 它是一个维度数组 ,包含属于聚类的观测值的概率。

为集群分配新数据

在初始样本上训练的模型用于对附加观测值进行聚类。 将每个新点与在分析源数据阶段确定的分布分量进行比较。

让我们使用函数创建一个混合高斯模型 MixtureModel 使用先前定义的参数-数学期望的向量和组件的标准偏差。 此方法在建模中提供了更高级别的抽象,因为它允许您将分布模型作为封装混合物的所有参数(包括分量权重和协方差矩阵)的完整对象来使用。

In [ ]:
mix = MixtureModel([MvNormal(μ1, σ1), MvNormal(μ2, σ2)], [0.75, 0.25])X0 = collect(rand(mix, 75)')

我们将为集群分配新数据并可视化结果。

In [ ]:
idx0=聚类(gm,X0)graph5=plot(大小=(800,600))k=尺寸(gm。μ, 1)μs = gm.μΣ_ = gm.Σ权重=gm。wfunction gmPDF(x, y)    =[x,y]    金额=0.0    对于k在1:k        μ = μs[k, :]        L = Σ_[k]        Σ = L * L'        分布=MvNormal(μ,Σ)        总和+=权重[k]*pdf(分布,)    end    退货金额endx_min, x_max = minimum(X0[:, 1])-1, maximum(X0[:, 1])+1y_min, y_max = minimum(X0[:, 2])-1, maximum(X0[:, 2])+1x_set=范围(x_min,x_max,长度=80)y_set=范围(y_min,y_max,长度=80)contour!(x_сетка, y_сетка, (x,y)->gmPDF(x,y), levels=20, color=:jet, linewidth=1.5, alpha=0.7, label="", colorbar=false)for(i,cluster)in enumerate(unique(idx0))    掩码=idx0。==集群    x_clast=X0[掩码,1]    y_clast=X0[掩码,2]    form_marker=i==1 :dtriangle::    标记颜色=i==1 :蓝色::红色    # 集群编号="集群$i"    scatter!(x_класт, y_класт, markershape=форма_маркера, markercolor=цвет_маркера, markersize=5, alpha=0.7, label="")# ,标签=簇号endtitle!("新数据的聚类")# xlabel!("X₁")# ylabel!("X₂")# legend!(position=:best)显示(图5)

在计算属于聚类的新观测值的概率时,使用在模型训练阶段确定的混合分量的估计比例。 因此,跨集群的新数据分布应与为原始样本建立的比例相对应。

结论

本文演示了一种基于高斯混合模型的基于刚性聚类算法的多维数据聚类分析方法。 使用从二维正态分布的混合物生成的合成数据的示例,示出了分析的全周期:从对初始样本建模并训练混合物的参数到对训练和新观测两者进行分类。

主要结论:

  1. 混合高斯模型是一种有效且统计上可靠的聚类工具,它允许通过用一组正态分量逼近经验分布来描述各种形状、大小和方向的聚类。

  2. 刚性聚类通过将每个观测值分配给具有最大估计概率的分量来实现,提供了将数据划分为组的明确和可解释的划分,其中心对应于混合物的相应组分的数学期望。

  3. 成员概率的计算不仅为研究人员提供了确定性聚类,而且还提供了分类不确定性的定量度量,这为在需要概率方法的任务中使用软聚类方法开辟了可

  4. 所考虑的方法的一个重要优点是其泛化能力:训练的模型可用于聚类新数据,前提是保持主要群体的统计同质性,这通过使用在训练阶段获得的估计混

实际意义:
所提出的方法可被推荐用于广泛的应用任务,包括客户数据库的分割、生物医学数据的分类、多维时间序列的分析以及需要在统计上合理地分配复杂数据结构中的同质对象组的其他领域。