Engee 文档
Notebook

混合高斯模型

导言

对复杂多模态形状的概率分布进行建模是统计分析和机器学习中的一项基本任务。 解决这个问题的最强大和数学优雅的工具之一是混合高斯模型。

混合高斯是一种概率模型,它将复杂数据分布近似为有限数量的基础分布的加权和。 混合物的每个分量由其自己的期望向量、协方差矩阵和权重定义,其确定其对总体分布的贡献。 混合高斯模型的关键思想是,数据中的每个子组都可以用自己的高斯来描述,它们的叠加形成了一个能够描述不对称性、多模态性和复杂相关结构的灵

初始数据

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

In [ ]:
import Pkg
Pkg.add("Distributions")
Pkg.add("PlotlyBase")
using Distributions
plotly()

让我们确定二维高斯分布的双分量混合的分量、协方差矩阵和比例的平均值。

In [ ]:
mu = [[1.0, 2.0], [-3.0, -5.0]] # 平均值
sigma = [[2.0 0.0; 0.0 0.5], [1.0 0.0; 0.0 1.0]] # 协方差矩阵
p = [0.5, 0.5] # 比例

矩阵的行 mu 对应于各个分量的平均值的向量,一个三维阵列 sigma 它包含每个分量的协方差矩阵。

创建模型

让我们使用函数创建一个混合高斯模型 MixtureModel.

In [ ]:
gm = MixtureModel([MvNormal(μ, Σ) for (μ, Σ) in zip(mu, sigma)], p)
Out[0]:
MixtureModel{FullNormal}(K = 2)
components[1] (prior = 0.5000): FullNormal(
dim: 2
μ: [1.0, 2.0]
Σ: [2.0 0.0; 0.0 0.5]
)

components[2] (prior = 0.5000): FullNormal(
dim: 2
μ: [-3.0, -5.0]
Σ: [1.0 0.0; 0.0 1.0]
)

让我们显示创建的模型的属性。

In [ ]:
println("组件数目: ", length(gm.components))
println("尺寸: ", length(gm.components[1]))
println("重量: ", gm.prior.p)
println("组件类型: ", typeof(gm.components[1]))
for(i,k)in enumerate(gm.组件)
     println("\N组件$i:")
     println("    平均: ", mean(к))
     println("    协方差: ", cov(к))
end
Количество компонент: 2
Размерность: 2
Веса: [0.5, 0.5]
Типы компонент: FullNormal

  Компонента 1:
    Среднее: [1.0, 2.0]
    Ковариация: [2.0 0.0; 0.0 0.5]

  Компонента 2:
    Среднее: [-3.0, -5.0]
    Ковариация: [1.0 0.0; 0.0 1.0]

可视化

让我们计算分布密度函数并可视化其三维形状。

In [ ]:
gmPDF(x, y) = pdf(gm, [x, y])
gmPDF_vec(x, y) = [pdf(gm, [x[i], y[i]]) for i in 1:length(x)]
xs = range(-10, 10, length=100)
ys = range(-10, 10, length=100)
X = [x for x in xs, y in ys]
Y = [y for x in xs, y in ys]
Z = [gmPDF(x, y) for x in xs, y in ys]
p1 = surface(xs, ys, Z, title="分布密度", xlabel="X", ylabel="Y", zlabel="", camera=(45, 30), colorbar=false, color=:viridis, grid=:on)
display(p1)

使用蒙特卡洛方法,我们计算分布函数。

In [ ]:
function gmCDF(x, y)
    点数=3*(10^4)
    积分=兰特(gm,积分)
    sum=sum(points[1,:].≤x。&&[2,:]。≤y)
    退货金额/积分
end

function gmCDF_vec(xs, ys)
    n = length(xs)
    Z_cdf = zeros(n, n)
    for i in 1:n
        for j in 1:n
            Z_cdf[i, j] = gmCDF(xs[i], ys[j])
        end
    end
    return Z_cdf
end

Z_cdf = gmCDF_vec(xs, ys)

我们想象她的三维形象。

In [ ]:
p2 = surface(xs, ys, Z_cdf, title="分布函数", xlabel="X", ylabel="Y", zlabel="", camera=(45, 30), colorbar=false, color=:viridis, legend=false)
display(p2)

结论

高斯混合显式赋值的方法演示了从简单分量构建复杂概率模型的原理。 直接参数确定使得设计用于规划实验和测试算法的假设分布成为可能。

申请范围:

*综合测试数据,用于聚类和分类算法的评估

*在贝叶斯分析中设置先验分布

*金融和信号处理中多模态分布的建模

*在真实数据上训练模型的EM算法的初始化

这种方法构成了向数据模型的实际训练过渡和使用信息标准优化组件数量的基础。