极大似然估计详解

下面用MATLAB实现正态分布的ML估计

% 二维正态分布的两分类问题 (ML估计)

clc;

clear;

% 两个类别数据的均值向量

Mu = [0 0; 3 3]';

% 协方差矩阵

S1 = 0.8 * eye(2);

S(:, :, 1) = S1;

S(:, :, 2) = S1;

% 先验概率(类别分布)

P = [1/3 2/3]';

% 样本数据规模

% 收敛性:无偏或者渐进无偏,当样本数目增加时,收敛性质会更好

N = 500;

% 1.生成训练和测试数据

%{

生成训练样本

N = 500, c = 2, d = 2

μ1=[0, 0]' μ2=[3, 3]'

S1=S2=[0.8, 0; 0.8, 0]

p(w1)=1/3 p(w2)=2/3

%}

randn('seed', 0);

[X_train, Y_train] = generate_gauss_classes(Mu, S, P, N);

figure();

hold on;

class1_data = X_train(:, Y_train==1);

class2_data = X_train(:, Y_train==2);

plot(class1_data(1, :), class1_data(2, :), 'r.');

plot(class2_data(1, :), class2_data(2, :), 'g.');

grid on;

title('训练样本');

xlabel('N=500');

%{

用同样的方法生成测试样本

N = 500, c = 2, d = 2

μ1=[0, 0]' μ2=[3, 3]'

S1=S2=[0.8, 0; 0.8, 0]

p(w1)=1/3 p(w2)=2/3

%}

randn('seed', 100);

[X_test, Y_test] = generate_gauss_classes(Mu, S, P, N);

figure();

hold on;

test1_data = X_test(:, Y_test==1);

test2_data = X_test(:, Y_test==2);

plot(test1_data(1, :), test1_data(2, :), 'r.');

plot(test2_data(1, :), test2_data(2, :), 'g.');

grid on;

title('测试样本');

xlabel('N=500');

% 2.用训练样本采用ML方法估计参数

% 各类样本只包含本类分布的信息,也就是说不同类别的参数在函数上是独立的

[mu1_hat, s1_hat] = gaussian_ML_estimate(class1_data);

[mu2_hat, s2_hat] = gaussian_ML_estimate(class2_data);

mu_hat = [mu1_hat, mu2_hat];

s_hat = (1/2) * (s1_hat + s2_hat);

% 3.用测试样本和估计出的参数进行分类

% 使用欧式距离进行分类

z_euclidean = euclidean_classifier(mu_hat, X_test);

% 使用贝叶斯方法进行分类

z_bayesian = bayes_classifier(Mu, S, P, X_test);

% 4.计算不同方法分类的误差

err_euclidean = ( 1-length(find(Y_test == z_euclidean')) / length(Y_test) );

err_bayesian = ( 1-length(find(Y_test == z_bayesian')) / length(Y_test) );

% 输出信息

disp(['基于欧式距离分类的误分率:', num2str(err_euclidean)]);

disp(['基于最小错误率贝叶斯分类的误分率:', num2str(err_bayesian)]);

% 画图展示

figure();

hold on;

z_euclidean = transpose(z_euclidean);

o = 1;

q = 1;

for i = 1:size(X_test, 2)

if Y_test(i) ~= z_euclidean(i)

plot(X_test(1,i), X_test(2,i), 'bo');

elseif z_euclidean(i)==1

euclidean_classifier_results1(:, o) = X_test(:, i);

o = o+1;

elseif z_euclidean(i)==2

euclidean_classifier_results2(:, q) = X_test(:, i);

q = q+1;

end

end

plot(euclidean_classifier_results1(1, :), euclidean_classifier_results1(2, :), 'r.');

plot(euclidean_classifier_results2(1, :), euclidean_classifier_results2(2, :), 'g.');

title(['基于欧式距离分类,误分率为:', num2str(err_euclidean)]);

grid on;

figure();

hold on;

z_bayesian = transpose(z_bayesian);

o = 1;

q = 1;

for i = 1:size(X_test, 2)

if Y_test(i) ~= z_bayesian(i)

plot(X_test(1,i), X_test(2,i), 'bo');

elseif z_bayesian(i)==1

bayesian_classifier_results1(:, o) = X_test(:, i);

o = o+1;

elseif z_bayesian(i)==2

bayesian_classifier_results2(:, q) = X_test(:, i);

q = q+1;

end

end

plot(bayesian_classifier_results1(1, :), bayesian_classifier_results1(2, :), 'r.');

plot(bayesian_classifier_results2(1, :), bayesian_classifier_results2(2, :), 'g.');

title(['基于最小错误率的贝叶斯决策分类,误分率为:', num2str(err_bayesian)]);

grid on;

生成数据的函数:

function [ data, C ] = generate_gauss_classes( M, S, P, N )

%{

函数功能:

生成样本数据,符合正态分布

参数说明:

M:数据的均值向量

S:数据的协方差矩阵

P:各类样本的先验概率,即类别分布

N:样本规模

函数返回

data:样本数据(2*N维矩阵)

C:样本数据的类别信息

%}

[~, c] = size(M);

data = [];

C = [];

for j = 1:c

% z = mvnrnd(mu,sigma,n);

% 产生多维正态随机数,mu为期望向量,sigma为协方差矩阵,n为规模。

% fix 函数向零方向取整

t = mvnrnd(M(:,j), S(:,:,j), fix(P(j)*N))';

data = [data t];

C = [C ones(1, fix(P(j) * N)) * j];

end

end

正态分布的ML估计(对训练样本):

function [ m_hat, s_hat ] = gaussian_ML_estimate( X )

%{

函数功能:

样本正态分布的最大似然估计

参数说明:

X:训练样本

函数返回:

m_hat:样本由极大似然估计得出的正态分布参数,均值

s_hat:样本由极大似然估计得出的正态分布参数,方差

%}

% 样本规模

[~, N] = size(X);

% 正态分布样本总体的未知均值μ的极大似然估计就是训练样本的算术平均

m_hat = (1/N) * sum(transpose(X))';

% 正态分布中的协方差阵Σ的最大似然估计量等于N个矩阵的算术平均值

s_hat = zeros(1);

for k = 1:N

s_hat = s_hat + (X(:, k)-m_hat) * (X(:, k)-m_hat)';

end

s_hat = (1/N)*s_hat;

end

% 详细的计算过程推导可以参考前一篇博客:极大似然估计详解。

有了估计参数,对测试数据进行分类:

基于欧式距离的分类:

function [ z ] = euclidean_classifier( m, X )

%{

函数功能:

利用欧式距离对测试数据进行分类

参数说明:

m:数据的均值,由ML对训练数据,参数估计得到

X:我们需要测试的数据

函数返回:

z:数据所属的分类

%}

[~, c] = size(m);

[~, n] = size(X);

z = zeros(n, 1);

de = zeros(c, 1);

for i = 1:n

for j = 1:c

de(j) = sqrt( (X(:,i)-m(:,j))' * (X(:,i)-m(:,j)) );

end

[~, z(i)] = min(de);

end

end

基于最小错误率的贝叶斯估计:

function [ z ] = bayes_classifier( m, S, P, X )

%{

函数功能:

利用基于最小错误率的贝叶斯对测试数据进行分类

参数说明:

m:数据的均值

S:数据的协方差

P:数据类别分布概率

X:我们需要测试的数据

函数返回:

z:数据所属的分类

%}

[~, c] = size(m);

[~, n] = size(X);

z = zeros(n, 1);

t = zeros(c, 1);

for i = 1:n

for j = 1:c

t(j) = P(j) * comp_gauss_dens_val( m(:,j), S(:,:,j), X(:,i) );

end

[~, z(i)] = max(t);

end

end

function [ z ] = comp_gauss_dens_val( m, s, x )

%{

函数功能:

计算高斯分布N(m, s),在某一个特定点的值

参数说明:

m:数据的均值

s:数据的协方差

x:我们需要计算的数据点

函数返回:

z:高斯分布在x出的值

%}

z = ( 1/( (2*pi)^(1/2)*det(s)^0.5 ) ) * exp( -0.5*(x-m)'*inv(s)*(x-m) );

end

本文源代码下载

matlab 正态分布期望,MATLAB实现正态分布ML(极大似然)估计相关推荐

  1. 基于接收信号强度(RSS)的室内定位/无线传感器网络定位——极大似然估计ML/最小二乘估计WLS

    基于接收信号强度(RSS)的室内定位/无线传感器网络定位--极大似然估计ML/最小二乘估计WLS 原创不易,路过的各位大佬请点个赞 针对AOA,TOA,TDOA,RSS等室内定位.导航的探讨.技术支持 ...

  2. 基于到达时间(TOA)的室内定位(/无线传感器网络定位)——极大似然估计ML

    基于到达时间(TOA)的室内定位(/无线传感器网络定位)--极大似然估计ML 原创不易,路过的各位大佬请点个赞 针对AOA,TOA,TDOA,RSS等室内定位.导航的探讨.技术支持.==代码(有偿)= ...

  3. 【转载】极大似然估计

    原文链接:知行流浪 https://blog.csdn.net/zengxiantao1994/article/details/72787849 以前多次接触过极大似然估计,但一直都不太明白到底什么原 ...

  4. 一文看懂 “极大似然估计” 与 “最大后验估计” —— 极大似然估计篇

    参考: 唐宇迪<人工智能数学基础>第8章 Richard O. Duda <模式分类>第三章 白板机器学习 P2 - 频率派 vs 贝叶斯派 频率学派还是贝叶斯学派?聊一聊机器 ...

  5. 干货 | 一文搞懂极大似然估计

    极大似然估计,通俗理解来说,就是在假定整体模型分布已知,利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值! 换句话说,极大似然估计提供了一种给定观察数据来评估模型参数 ...

  6. 零基础掌握极大似然估计

    零基础掌握极大似然估计 https://mp.weixin.qq.com/s/v98qGCz_qN_73hnYKrCQFw 1极大似然估计 极大似然估计,通俗理解来说,就是在假定整体模型分布已知,利用 ...

  7. 极大似然估计_计量经济学 | 极大似然估计

    写在前面:本文写作于被新冠病毒 (COVID-19) 笼罩下的英国.前段时间本人的恩师.苏格兰老爷爷.英国伯明翰大学Emeritus讲席教授Peter Sinclair确诊新冠病毒,实乃不幸.在此祝P ...

  8. Python实现极大似然估计

    概念 现实中任何随机变量的概率分布函数都是未知的. 如果假定随机变量服从某种分布(如正态分布),可以通过统计手段来计算该分布的参数,这种方法称为参数估计. 极大似然估计(Maximum Likelih ...

  9. 千字讲解极大似然估计

    上周有读者私信我说,面试被问到了极大似然估计没回答出来,虽然网上有很多讲解,但是不大能看得懂,而且有一些疑问没有解释清楚.经过一周的撰写,今天困哥就专门整理了一篇数千字的文章,来详细介绍一下极大似然估 ...

  10. 一文搞懂极大似然估计

    极大似然估计,通俗理解来说,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值! 换句话说,极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:" ...

最新文章

  1. web.config文件
  2. word中将半角标点符号(如双引号等)转换为全角
  3. sqlserver 把SELECT结果集中一列的所有的值 用逗号隔开放进一个字段内
  4. [转载]带你玩转Visual Studio——带你高效开发
  5. 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组
  6. 计算机网络课设-小型校园网,计算机网络课设 小型校园网
  7. bgll算法 matlab,一种复杂网络社区检测的方法与流程
  8. java 实现WebService 以及不同的调用方式
  9. python练习题及答案-听说你python基础入门了?100个经典练习题送给你(附完整答案)...
  10. vs2015编译ffmpeg
  11. svchost 100%怎么办==》win
  12. 计算机网络原理最详细解说
  13. 0002计算机组成原理与体系结构02
  14. 微信小程序修改顶部通知栏字体颜色,手机电量时间.....。
  15. 股利折现模型详解-股票定价-财务管理(七)
  16. Java奠基】Java经典案例讲解
  17. 三网运营商移动联通电信话费余额查询接口-携号转网识别查询/号码归属地查询-携号转网API接口
  18. 记录自己的成长--个人日记1
  19. 微信开发生成带参数的二维码的讲解
  20. 寒假中前端学习归档html/css

热门文章

  1. 陕西菜的风格和特色小吃
  2. 【Java基础法语】前言、JDK安装、入门程序、常量、变量
  3. AndroidStudio学习(一)--区分版本
  4. kmdf驱动教程1——从Hello World开始
  5. 群晖搭建个人网站,内网穿透实现公网访问 1/3
  6. 离线缓存html5,HTML5新技术 离线缓存
  7. 如何解决0xc000007b错误
  8. 一种基于倏逝波的离子浓度测试芯片
  9. 怎样去设计一个音乐网站
  10. 笔记本无线网通过网线共享给没有无线网卡的台式机