使用最大後驗概率學習正態分佈的參數

最近在看計算機視覺:模型學習與推理,第四章將了使用最大後驗概率來學習正態分佈的參數。

1維正態分佈的先驗概率是正態逆伽馬分佈,N維正態分佈的先驗概率是正態逆維繫特分佈。這裏生成的數據是滿足1維正態分佈。

1維正態分佈先驗概率公式如下:
Pr(μ,σ2)=γσ2πβαΓ(α)(1σ2)α+1exp[2β+γ(δμ)22σ2]\operatorname{Pr}\left(\mu, \sigma^{2}\right)=\frac{\sqrt{\gamma}}{\sigma \sqrt{2 \pi}} \frac{\beta^{\alpha}}{\Gamma(\alpha)}\left(\frac{1}{\sigma^{2}}\right)^{\alpha+1} \exp \left[-\frac{2 \beta+\gamma(\delta-\mu)^{2}}{2 \sigma^{2}}\right]

最大後驗概率實際上試求
μ^,σ^2=argmaxμ,σ2[i=1IPr(xiμ,σ2)Pr(μ,σ2)]=argmaxμ,σ2[i=1INormxi[μ,σ2]NormInvGamμ,σ2[α,β,γ,δ]]\begin{aligned} \hat{\mu}, \hat{\sigma}^{2} &=\underset{\mu, \sigma^{2}}{\operatorname{argmax}}\left[\prod_{i=1}^{I} \operatorname{Pr}\left(x_{i} | \mu, \sigma^{2}\right) \operatorname{Pr}\left(\mu, \sigma^{2}\right)\right] \\ &=\underset{\mu, \sigma^{2}}{\operatorname{argmax}}\left[\prod_{i=1}^{I} \operatorname{Norm}_{x_{i}}\left[\mu, \sigma^{2}\right] \operatorname{NormInvGam}_{\mu, \sigma^{2}}[\alpha, \beta, \gamma, \delta]\right] \end{aligned}
的最大值。跟上文一樣的方法,但是這個公式的形式稍微複雜。

μ^,σ^2=argmaxμ,σ2[i=1Ilog[Normxi[μ,σ2]]+log[ NormInvGam μ,σ2[α,β,γ,δ]]]\hat{\mu}, \hat{\sigma}^{2}=\underset{\mu, \sigma^{2}}{\operatorname{argmax}}\left[\sum_{i=1}^{I} \log \left[\operatorname{Norm}_{x_{i}}\left[\mu, \sigma^{2}\right]\right]+\log \left[\text { NormInvGam }_{\mu, \sigma^{2}}[\alpha, \beta, \gamma, \delta]\right]\right]

最終結果如下:

μ^=i=1Ixi+γδI+γ\hat{\mu}=\frac{\sum_{i=1}^{I} x_{i}+\gamma \delta}{I+\gamma}

σ^2=i=1I(xiμ^)2+2β+γ(δμ^)2I+3+2α\hat{\sigma}^{2}=\frac{\sum_{i=1}^{I}\left(x_{i}-\hat{\mu}\right)^{2}+2 \beta+\gamma(\delta-\hat{\mu})^{2}}{I+3+2 \alpha}

所以正態分佈的參數依賴於超參數α,β,γ,δ\alpha,\beta,\gamma,\delta

算法流程如下:
 Input : Training data {xi}i=1I, Hyperparameters α,β,γ,δ Output: MAP estimates of parameters θ={μ,σ2} begin // Set mean parameter μ=(i=1xi+γδ)/(I+γ)// Set variance σ2=(i=1I(xiμ)2+2β+γ(δμ)2)/(I+3+2α) end \begin{array}{l}{\text { Input : Training data }\left\{x_{i}\right\}_{i=1}^{I}, \text { Hyperparameters } \alpha, \beta, \gamma, \delta} \\ {\text { Output: MAP estimates of parameters } \theta=\left\{\mu, \sigma^{2}\right\}} \\ {\text { begin }} \\ {/ / \text { Set mean parameter }} \\ {\mu=\left(\sum_{i=1} x_{i}+\gamma \delta\right) /(I+\gamma)} \\ {/ / \text { Set variance }} \\ {\sigma^{2}=\left(\sum_{i=1}^{I}\left(x_{i}-\mu\right)^{2}+2 \beta+\gamma(\delta-\mu)^{2}\right) /(I+3+2 \alpha)} \\ {\text { end }}\end{array}

生成數據的代碼在
:代碼鏈接點擊這裏.
實現代碼如下:

void MAP_learning_univariate_normal_parameters() 
{

	double alpha, beta, gamma, delta; //hyperparameters α, β, γ > 0 and δ ∈ [−∞, ∞].

	//setting hyperparameters

	alpha = 1;
	beta = 1;
	gamma = 1;
	delta = -1;


	vector<double> data = generate_normal_distribution_data<double>(0, 1, 100000);

	double sum=0.0,sum_der_2=0.0;
	double mu_map, var_map;

	for (int i = 0; i < data.size(); i++)
	{
		sum += data[i];
	}

	mu_map = (sum + gamma * delta) / (data.size() + gamma);

	for (int i = 0; i < data.size(); i++)
	{
		sum_der_2 += ((data[i] - mu_map)*(data[i] - mu_map));
	}

	var_map = (sum_der_2 + 2 * beta + gamma * (delta - mu_map)*(delta - mu_map))/(data.size()+3+2*alpha);

	cout << "mu:" << mu_map << endl;
	cout << "var: " << var_map << endl;
}

決定精度的是超參數,我覺得有點玄學!!!
一般來講先驗概率準確率較低,加入數據之後計算的後驗概率有明顯的精度提升。而且數據量如果比較大
書中的一個事例圖,講的很清楚
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章