2017-12-20 4 views
0

나는 초기 매개 변수에 대해 이미 꽤 잘 알고있는 가우시안 (gaussians)을 맞추려고한다. (이 경우 배포본을 생성하기 때문에 항상 이것들을 적용 할 수 있어야한다.) 그러나, 나는 평균을 강요하는 방법을 알아낼 수 없다. 두 가우시안 모두 0. 가능한가? m.means_ = ...가 작동하지 않습니다.Sklearn Gaussian 혼합 잠금 매개 변수?

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() 

답변

0

(당신이 싶지 않아 가정 만 제공 초기 추측을. 고정의 경우는 아마 전체 코드를 만지지 필요하고 전체 EM-접근 방식 인 경우 매우 의심의 아마도 scipy의 최적화 모듈에 접근 할 수있는 최적화 문제가 발생할 것입니다.)

docs을 따르십시오. GaussianMixture-creation 시점에 지원됩니다.

weights_init : 어레이 형 모양 (n_components),

선택적 상기 사용자 제공 초기 가중치 없음 디폴트. None 인 경우, 가중치는 init_params 메소드를 사용하여 초기화됩니다.

means_init : 어레이 형 모양 (n_components, n_features)

옵션은 사용자가 제공하는 초기 방법은, 디폴트는 none,이 없음하면 수단은 init_params 방법을 이용하여 초기화된다.

+0

초기 추측 대신 특정 범위의 매개 변수를 강제 적용하거나 제한 할 수 있습니까? –

+0

코드를 변경하지 않아도됩니다. 이것이 내 의견으로는 전체 EM 접근법을 무효로! (그러나 나는 나 자신을 전문가라고 생각하지 않을 것이다). – sascha

0

나는 실제로 하나는 mean_priormean_prior_precision

과 함께 피팅 설정할 수있는 BayesianGaussianMixture 장착되어야 함을 의미한다, 실제로 이후 전과 알려져 있었다 그래서

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

하나라도이 문제를 해결할 수 있습니다. enter image description here

+0

이전은 그 값을 수정하는 데는 효과가 없습니다 (허용되지 않는'''mean_precision_prior = 0'''을 제외하고). – sascha

+0

정확합니다. 값을 완전히 수정하지는 않지만 사전 배포를하지 않는 이상 사전 분포도에 훨씬 더 많이 올릴 수 있습니다 (예 : 넓은 분포의 경우 5의 시그마, 평균은 0.07로 추측). 적어도 내 테스트부터. 고급 사례는 원하는 방향으로 조종하기가 더 어려울 수 있습니다. –