【问题标题】:Sklearn Gaussian Mixture lock parameters?Sklearn高斯混合锁参数?
【发布时间】:2018-06-03 06:34:42
【问题描述】:

我正在尝试拟合一些高斯,我已经对初始参数有了一个很好的了解(在这种情况下,我正在生成分布,所以我应该总是能够拟合这些)。但是,我似乎无法弄清楚如何强制平均值为例如0 对于两个高斯。可能吗? m.means_ = ... 不起作用。

from sklearn import mixture
import numpy as np
import math
import matplotlib.pyplot as plt
from scipy import stats

a = np.random.normal(0, 0.2, 500)
b = np.random.normal(0, 2, 800)

obs = np.concatenate([a,b]).reshape(-1,1)
plt.hist(obs, bins = 100, normed = True, color = "lightgrey")

min_range = -8
max_range = 8

n_gaussians = 2

m = mixture.GaussianMixture(n_components = n_gaussians)
m.fit(obs)

# # Get the gaussian parameters
weights = m.weights_
means = m.means_
covars = m.covariances_

# Plot all gaussians

n_gaussians = 2

gaussian_sum = []
for i in range(n_gaussians):
    mean = means[i]
    sigma = math.sqrt(covars[i])

    plotpoints = np.linspace(min_range,max_range, 1000)

    gaussian_points = weights[i] * stats.norm.pdf(plotpoints, mean, sigma)
    gaussian_points = np.array(gaussian_points)

    gaussian_sum.append(gaussian_points)

    plt.plot(plotpoints,
             weights[i] * stats.norm.pdf(plotpoints, mean, sigma))

sum_gaussian = np.sum(gaussian_sum, axis=0)
plt.plot(plotpoints, sum_gaussian, color = "black", linestyle = "--")
plt.xlim(min_range, max_range)

plt.show()

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    所以我实际上所追求的是已知的priors,这意味着它实际上应该配备BayesianGaussianMixture,它允许设置mean_priormean_prior_precision

    适合

    m = mixture.BayesianGaussianMixture(n_components = n_gaussians, mean_prior = np.array([0]), mean_precision_prior = np.array([1]))
    

    甚至可以强制它解决这个问题:

    【讨论】:

    • 先验不会影响修复这些值(可能mean_precision_prior=0 除外,这是不允许的)。
    • 正确,它并不能完全修复这些值,但它使它们更有可能落在先验中(例如,对于广泛分布的 sigma 为 5,猜测平均值为0.07),除非它完全关闭。至少从我的测试来看。更高级的案例可能更难朝着期望的方向发展。
    • docs 对mean_precision_prior 说:“较大的值将集群的意思集中在 mean_prior 周围。”,这意味着如果您在高值(而不是 0)之前设置精度,它会强制执行更多的先验.所以只要把它设置得高,它就应该固定手段。
    【解决方案2】:

    (假设您不想强制,而是给出一个initial-guess。固定大小写可能需要触及整个代码,如果那时整个 EM 方法就派上用场了。它可能会分解为 scipy 的优化模块可以解决的一些优化问题。)

    只需关注docs。在创建 GaussianMixture 时支持它。

    weights_init:类数组,形状(n_components,),可选

    用户提供的初始权重,默认为无。如果为 None,则使用 init_params 方法初始化权重。

    means_init:类数组,形状(n_components,n_features),可选

    用户提供的初始均值,默认为None,如果为None,则使用init_params方法初始化均值。

    【讨论】:

    • 所以不能强制或限制特定范围内的参数,而不仅仅是最初的猜测?
    • 不改代码就不行。因为这在我看来打败了整个 EM 方法! (但我不认为自己是那里的专家)。
    猜你喜欢
    • 2017-03-22
    • 2017-03-04
    • 2023-03-23
    • 2021-10-12
    • 1970-01-01
    • 2019-11-21
    • 2021-09-30
    • 2017-04-21
    • 2019-08-06
    相关资源
    最近更新 更多