【问题标题】:How to fit mixture of gaussian with custom made function?如何将高斯与定制函数混合?
【发布时间】:2023-04-04 01:52:01
【问题描述】:

我熟悉 MATLAB,曾经用自己的函数进行混合分布拟合。我想用 python 学习同样的东西,但很难做到。我不确定如何定义参数常量并获取拟合参数的值,即 mu1、sigma1、mu2、sigma2 和概率。任何帮助将不胜感激。

import scipy.stats as stats
import numpy as np


class gaussian_mixture(stats.rv_continuous):
    def _pdf(self,x):
        disA=np.exp(-0.5*(x-mu1)**2 / s1**2.) / (s1*np.sqrt(2.0 * np.pi))
        disB=np.exp(-0.5*(x-mu2)**2 / s2**2.) / (s2*np.sqrt(2.0 * np.pi))
        return p1*disA+(1-p)*disB


mu=6
sigma=2
data1=mu+sigma*np.random.randn(10000)
mu=1
sigma=1
data2=mu+sigma*np.random.randn(10000)
data=np.hstack((data1,data2))
print(data2.shape,data.shape)
height,xrange,patches=plt.hist(data,bins=50,density=True,facecolor='g',alpha=0.75)
gaussian = gaussian_mixture(name='gaussianmix')

【问题讨论】:

    标签: python statsmodels


    【解决方案1】:

    以下解决方案对我有用。

    from scipy.optimize import curve_fit
    def bimodal(x,mu1,mu2,s1,s2,p1):
        disA=np.exp(-0.5*(x-mu1)**2 / s1**2.) / (s1*np.sqrt(2.0 * np.pi))
        disB=np.exp(-0.5*(x-mu2)**2 / s2**2.) / (s2*np.sqrt(2.0 * np.pi))
        return p1*disA+(1-p1)*disB
    
    mu=6
    sigma=2
    data1=mu+sigma*np.random.randn(10000,1)
    
    mu=1
    sigma=1
    data2=mu+sigma*np.random.randn(10000,1)
    
    data=np.vstack((data1,data2))
    print(data2.shape,data.shape)
    
    hist=plt.hist(data,bins=30,density=True,facecolor='g',alpha=0.75)
    x = [hist[0], 0.5*(hist[1][1:]+hist[1][:-1])]
    xdata=x[1]
    ydata=x[0]
    
    popt, pcov = curve_fit(bimodal, xdata, ydata)
    print('point',popt)
    plt.plot(xdata, bimodal(xdata, *popt), 'k-', label='fit: mu1=%5.3f, 
       mu2=%5.3f, s1=%5.3f,s2=%5.3f,p=%5.3f' % tuple(popt))
    
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 2021-09-30
      • 2017-04-21
      • 1970-01-01
      • 2014-06-29
      • 2017-02-26
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多