基于python理解最大似然MLE-(简单正态分布估计、高斯混合模型GMM)

news2024/9/23 19:20:13

最大似然法(Maximum Likelihood Estimation,简称MLE)是一种统计方法,用于估计概率模型的参数。其基本思想是寻找一组参数值,使得在这组参数下,观测数据出现的概率(即似然性)最大。这种方法广泛应用于统计学、机器学习和群体遗传学等领域,因为它提供了一种从数据出发,通过优化目标函数来估计模型参数的有效途径。


原理

最大似然法的原理基于这样一个假设:

给定某个概率分布模型,如果某个参数值能使从该模型中抽取到现有样本的概率最大,那么该参数值就是最合理的估计。换句话说,我们假设数据是由某个概率分布生成的,而我们的目标是找到这个分布的最可能参数。(假设分布,基于数据,寻找参数)那么在机器学习中就是(模型已定,参数未知)。

基本步骤

(1)定义似然函数:首先,根据已知的概率分布形式和数据集,定义似然函数:

L(\theta |x)

其中θ表示待估计的参数向量,x表示观测到的数据。
(2)求解最大似然估计:接下来,通过数学优化方法(如梯度上升、牛顿法等),寻找能够最大化似然函数L(θ|x)的参数值θ^。这通常涉及到对似然函数取对数,转换为对数似然函数,以便于计算和处理。
(3)评估和检验:得到最大似然估计θ^后,可以通过各种统计测试(如AIC、BIC、卡方检验等)来评估模型的拟合优度,以及进行参数的显著性检验。

简单正态分布参数估计:

下面是一个使用Python进行最大似然估计的简单例子,其中我们将对正态分布的参数进行估计:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# 生成模拟数据
np.random.seed(0)  # 设置随机种子以保证结果可复现
true_mean = 0      # 真实均值
true_std = 1       # 真实标准差
data = np.random.normal(true_mean, true_std, size=100)

# 最大似然估计
def mle_normal(data):
    # 对于正态分布,最大似然估计得到的均值为样本均值,方差为样本方差的n/(n-1)倍
    mean = np.mean(data)
    var = np.var(data, ddof=1)
    std = np.sqrt(var)
    return mean, std

# 应用最大似然估计
est_mean, est_std = mle_normal(data)

# 可视化
x = np.linspace(min(data), max(data), 100)
plt.hist(data, bins=30, density=True, alpha=0.5, label='Data Histogram')
plt.plot(x, norm.pdf(x, est_mean, est_std), label='Estimated PDF')
plt.title('Maximum Likelihood Estimation for Normal Distribution')
plt.legend()
plt.show()

高斯混合模型(Gaussian Mixture Model, GMM)最大似然估计

让我们考虑一个更复杂的情况,其中我们将使用最大似然估计来拟合一个高斯混合模型(Gaussian Mixture Model, GMM)。GMM是一种概率模型,它假设所有的数据点都是从有限数量的高斯分布中生成的。每个高斯分布都有自己的均值、方差和权重。

为了简化,我们将使用一个由两个高斯分布组成的GMM,并使用Python的scikit-learn库来执行最大似然估计。

!pip install scikit-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture

接下来,我们将生成两组服从不同正态分布的数据,并将它们混合在一起

# 生成模拟数据
np.random.seed(0)  # 设置随机种子以保证结果可复现
mean1 = [-1, 0]
cov1 = [[1, 0.5], [0.5, 1]]
mean2 = [1, 0]
cov2 = [[1, -0.5], [-0.5, 1]]

# 生成两个高斯分布的数据
data1 = np.random.multivariate_normal(mean1, cov1, size=500)
data2 = np.random.multivariate_normal(mean2, cov2, size=500)

# 混合数据
data = np.vstack([data1, data2])

现在,我们将使用GaussianMixture类来拟合GMM模型,并进行最大似然估计:

# 初始化GMM模型
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=0)

# 使用数据拟合GMM模型
gmm.fit(data)

# 获取估计的参数
weights = gmm.weights_
means = gmm.means_
covariances = gmm.covariances_

print("Estimated Weights:", weights)
print("Estimated Means:", means)
print("Estimated Covariances:", covariances)

# 可视化
plt.scatter(data[:, 0], data[:, 1], alpha=0.5, label='Data')

# 绘制高斯分布的等高线
x, y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
xy = np.column_stack([x.ravel(), y.ravel()])

for i in range(gmm.n_components):
    z = np.exp(gmm.score_samples(xy))
    z = z.reshape(x.shape)
    plt.contour(x, y, z, levels=[0.01, 0.1, 0.5, 1, 2], colors='red' if i == 0 else 'blue', alpha=0.5)

plt.title('Gaussian Mixture Model with Maximum Likelihood Estimation')
plt.legend()
plt.show()

Seaborn高斯混合模型的等高线可视化 

为了创建一个更复杂和精美的可视化,我们可以使用seaborn库来增强我们的图表。seaborn是一个基于matplotlib的高级可视化库,它提供了更多的绘图选项和更美观的默认主题。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
import seaborn as sns

# 生成模拟数据
np.random.seed(0)  # 设置随机种子以保证结果可复现
mean1 = [-1, 0]
cov1 = [[1, 0.5], [0.5, 1]]
mean2 = [1, 0]
cov2 = [[1, -0.5], [-0.5, 1]]

# 生成两个高斯分布的数据
data1 = np.random.multivariate_normal(mean1, cov1, size=500)
data2 = np.random.multivariate_normal(mean2, cov2, size=500)

# 混合数据
data = np.vstack([data1, data2])

# 初始化GMM模型
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=0)

# 使用数据拟合GMM模型
gmm.fit(data)

# 获取估计的参数
weights = gmm.weights_
means = gmm.means_
covariances = gmm.covariances_

# 可视化
sns.set(style="white", color_codes=True)
sns.jointplot(x=data[:, 0], y=data[:, 1], kind="kde", space=0)

# 绘制高斯分布的等高线
x, y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
xy = np.column_stack([x.ravel(), y.ravel()])

for i in range(gmm.n_components):
    z = np.exp(gmm.score_samples(xy))
    z = z.reshape(x.shape)
    plt.contour(x, y, z, levels=[0.01, 0.1, 0.5, 1, 2], colors='red' if i == 0 else 'blue', alpha=0.5)

plt.suptitle('Gaussian Mixture Model with Maximum Likelihood Estimation')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM64 在线仿真器

今天在晚上找到一个简单的ARM64在线仿真器,它非常适合学习ARM64的指令,在教学中应该很好用。网址ARM64 Online Simulatorhttp://163.238.35.161/~zhangs/arm64simulator/ 它是由康涅狄格州立大学的Shuqun Zhang教授开发的。软件基于Alexandro Sanchez开…

评价算法(topsis熵权法)

评价算法 熵权法 上面箭头的一步用到了带权重的距离公式。 上面是某种求权重的方法,合理就行。 但是在使用熵权法的时候,一定要注意用的是规范化矩阵再用熵权法求权重。 规范化之前一定要判断每一列的性质 #熵权法:import xlrd import num…

巴黎奥运会背后的8K国际公用信号制作

北京时间2024年8月12日凌晨3时,举世瞩目的巴黎奥运会闭幕式在法兰西体育场举行,闭幕式演出部分的主题为“记录”。BOSMA博冠首款8K 50P小型化广播级摄像机B1跟随中央广播电视总台“中国红”8K转播车,为田径比赛和闭幕式提供8K国际公用信号制作…

【Ajax使用说明】Ajax、Axios以及跨域

目录 一、原生Ajax 1.1 Ajax简介 1.2 XML简介 1.3 AJAX 的特点 1.3.1 AJAX的优点 1.3.2 AJAX 的缺点 1.4 AJAX 的使用 1.4.1AJAX的基本操作 1.4.2AJAX的传参 1.4.3 AJAX的post请求及设置请求体 1.4.4 AJAX响应json数据 1.4.5 AJAX请求超时与网络异常处理 1.4.5 AJ…

windows 使用Clion开发FreeSWITCH源码

1.准备环境 window安装clion可以编译freeswitch的docker镜像 2.clion配置ssh和Toolchain的配置 去这里看吧 3.makefile配置 Toolchain记得选ssh的 成功之后左下角有这个小锤子,这个小锤子就是生成makefile文件的,记得点击 同时就会出现这个东西 这样…

长文_ZATA

文章目录 环境配置问题miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 环境配置问题 miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因:fbegmm.dll文件出现问题 解决方案: 使用依赖分析工具https:/…

SuccBI+低代码文档中心 —数据(数据连接、调度管理)

连接数据 数据加工和分析需要连接已存在的数据,通常是业务系统的数据或文件数据,业务系统数据一般存储在关系型数据库中。对于存储在json文件中的,也可以通过脚本数据加工的方式获取数据。 在数据模块下,点击新建,可以…

【Python机器学习】无监督学习——K-均值聚类算法

聚类是一种无监督的学习,它将相似的对象归到同一簇中,它有点像全自动分类。聚类方法几乎可以应用于所有的对象,簇内的对象越相似,聚类的效果越好。 K-均值聚类算法就是一种典型的聚类算法,之所以称之为K-均值是因为它…

【qt】QMainWindow下实现一个记事本

之前我们学过QWidget,QMainWindow会在ui界面多一个菜单 先实现ui界面 1.添加文本编辑,实现可以写多行 2.将文本编辑放大,拖动即可 3.编辑菜单栏 4.然后我们要实现对应子列表的功能,但是在这里不能转到槽,所以我们…

【Vue3】Pinia store 组合式写法

【Vue3】Pinia store 组合式写法 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…

Java EE基础知识点

前言👀~ 上一章我们介绍了性能测试工具LoadRunner,今天开启新的篇章Java EE进阶相关的内容 框架 Maven 项目构建 依赖管理 依赖传递 依赖排除 Maven概念 Maven仓库 Maven 设置国内源 创建Spring Boot项目 Web服务器 如果各位对文章的内容感兴…

Flutter 3.24 对普通开发者有哪些影响?

哈喽,我是老刘 Flutter 3.24刚刚发布了。突然觉得时间过得好快。六年前刚开始使用Flutter 1.0的场景还在眼前。 随着Flutter团队老成员的回归和新成员的加入。 前段时间Flutter团队裁员的影响似乎也逐步消退了。 新版本发布的功能逐步回到了该有的状态。 这里盘点…

解决域名加别名后再代理或者映射到fastadmin项目

如果遇到微应用不想再添加或者不方便添加单独的二级域名时,就需要用到代理或者映射来进入到我们的微应用项目中。 可以修改route.php路由文件的下面这个参数 __alias__ > [别名 > 模块/控制器] 如图 然后再修改config.php文件里面的view_replace_str参数…

C++入门基础知识11

C 关键字 下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。 !!!完整关键字介绍 (下一篇博文中将详细罗列介绍)

内网穿透:打破网络边界的神奇钥匙

在数字化时代,我们每天都在使用各种网络设备,但你是否曾想过,家里的智能摄像头、私人服务器或是游戏主机,如何能够在远离家的地方也能轻松访问? 这就需要涉及到内网穿透技术了。今天,我们就用简单的例子来揭…

coze 工作流使用

什么是工作流 工作流就是将一系列的逻辑节点串起来的流程,例如我们做一个爬虫,第一步先爬取网页内容,第二步数据清洗,得到我们想要的数据,第三步存到数据库。这里每步就是一个逻辑节点,她们之间有先后或是…

如何用不到一分钟的时间将Excel电子表格转换为应用程序

我们大多数人对电子表格又爱又恨。当企业需要分析数据、为决策过程提供信息并可视化信息时,Excel和Google Sheets是首选。这些文档非常容易创建,它们帮助我们以直接的方式构建相关的想法和适用的数据。除此之外,事情可能会变得一团糟。 对于…

服务注册中心--Eureka

一.Eureka概述 Eureka是一个基于REST的服务,主要用于AWS(Amazon Web Services 亚马逊云计算服务)云中的定位服务,以实现中间层服务器的负载平衡和故障转移在 Spring Cloud 微服务架构中通常用作注册中心, 我们称这个服务为 Eureka Server,还…

springboot学生作业管理系统---附源码14916

摘 要 在信息化社会中,人们需要针对性的信息获取途径。然而,由于不同角度和偏好的存在,人们经常只能获得特定类型的信息,这也是技术攻克难题之一。为了解决学生作业管理系统等问题,本研究通过分析和研究,设…

汽车免拆诊断案例 | 2011 款进口现代新胜达车智能钥匙系统有时失效

故障现象  一辆2011款进口现代新胜达车,搭载G4KE发动机,累计行驶里程约为26.3万km。车主进厂反映,有时进入车内按下起动按钮,发动机无法起动,且组合仪表黑屏。 故障诊断  接车后试车,车辆使用一切正常。…