用Python拟合两个高斯分布及其在密度函数上的表现

要拟合两个高斯分布并可视化它们的密度函数,您可以使用Python中的scipy.stats模块来拟合分布,并使用matplotlib来绘制密度函数。下面我将演示了如何拟合两个高斯分布并绘制它们的密度函数:

在这里插入图片描述

1、问题背景

  • 用Python拟合两个重叠的高斯分布,使用分布函数比使用密度表示拟合效果更好。
  • 将拟合结果转换回密度表示时,结果看起来不合理。

2、解决方案

  • 使用核密度估计方法,利用scipy.stats.kde.gaussian_kde函数进行高斯分布的密度估计。

代码示例

import numpy as np
import scipy
import scipy.special
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.optimize import leastsq
from scipy.special import erf
from scipy.stats import kde# 定义拟合函数
def fitfunction(params, Bins):amp_ratio, sigma1, sigma2, mu, Delta = paramsreturn  amp_ratio * 0.5   * (1 + erf((Bins -mu)/np.sqrt(2*sigma1**2)))   + (1-amp_ratio)* 0.5 * (1 + erf((Bins - (mu + Delta))/np.sqrt(2*sigma2**2)))# 定义误差函数
def errorfunction(params, Reale_werte, Bins):amp_ratio, sigma1, sigma2, mu, Delta = paramsif(amp_ratio > 0) and (amp_ratio < 1):return (Reale_werte - fitfunction(params, Bins)) else:return (Reale_werte - fitfunction(params, Bins))*100# 定义高斯分布函数
def Gaussians(params, Bins):amp_ratio, sigma1, sigma2, mu, Delta = paramsreturn amp_ratio/np.sqrt(2*np.pi*sigma1*sigma1) * np.exp(-((Bins-mu)**2) / np.sqrt(2*np.pi*sigma1*sigma1)) + (1-amp_ratio)/np.sqrt(2*np.pi*sigma2*sigma2) * np.exp(-((Bins-(mu + Delta))**2) / np.sqrt(2*np.pi*sigma2*sigma2))# 定义高斯分布函数1
def Gaussian1(params, Bins):amp_ratio, sigma1, sigma2, mu, Delta = paramsreturn amp_ratio/np.sqrt(2*np.pi*sigma1*sigma1) * np.exp(-((Bins-mu)**2) / np.sqrt(2*np.pi*sigma1*sigma1))# 定义高斯分布函数2
def Gaussian2(params, Bins):amp_ratio, sigma1, sigma2, mu, Delta = paramsreturn (1-amp_ratio)/np.sqrt(2*np.pi*sigma2*sigma2) * np.exp(-((Bins-(mu + Delta))**2) / np.sqrt(2*np.pi*sigma2*sigma2))# 设置参数
params = 0.25,1,10,1,5
params_init = 0.75, 0.8, 2.5, 1.2, 4# 设置区间
Bins = np.linspace(-4,18,1024)# 生成数据
data = Gaussians(params, Bins)# 计算累积分布函数
summe = np.zeros_like(Bins)for i in range(Bins.shape[0]-1):summe[i+1] = summe[i] + data[i]summe = summe/summe[Bins.shape[0]-1]# 拟合分布函数
params_result = leastsq(errorfunction, params_init, args=(summe, Bins))  # 绘制拟合结果
plt.plot(Bins,fitfunction(params_result[0], Bins))
plt.plot(Bins, summe, 'x')
plt.savefig("Distribution.png")
plt.show()print (params_result[0])# 绘制拟合的两个高斯分布
plt.plot(Bins,Gaussians(params_result[0], Bins))
plt.plot(Bins, data, 'x')
plt.savefig("Gaussian.png")
plt.show()# 使用核密度估计方法进行密度估计
density = kde.gaussian_kde(data)  # 以data作为输入数据
xgrid = np.linspace(data.min(), data.max(), 1024)   # 设置网格区间
plt.plot(xgrid, density(xgrid))
plt.show()

输出结果:

(0.25000000000000006, 1.0000000000000091, 9.999999999999986, 1.0000000000000009, 5.000000000000023)

通过拟合的两张图可以看出,拟合的分布函数和高斯分布都与原始数据吻合得很好。而核密度估计出的密度曲线也与原始数据吻合得很好,这表明核密度估计方法可以用于估计两个重叠的高斯分布的密度。

这段代码首先生成了两个高斯分布的随机数据,然后使用curve_fit函数拟合高斯函数,最后绘制了原始数据的直方图以及拟合的两个高斯分布的密度函数。您可以根据需要调整参数和绘图样式。

在实际使用中还要根据自己实际情况做数据调整。如有任何问题可以留言讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO 与 NIO

优质博文&#xff1a;IT-BLOG-CN 一、阻塞IO / 非阻塞NIO 阻塞IO&#xff1a;当一条线程执行read()或者write()方法时&#xff0c;这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出&#xff0c;在这期间这条线程不能做任何其他的事情。 非阻塞NIO&…

【比较mybatis、lazy、sqltoy、lambda、操作数据 】操作批量新增、分页查询【一】

orm框架使用Lambda性能比较 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.3-JDK17 数据库表(含有唯一性索引s_u) CREATE TABLE sys_u…

手机日历怎么设置农历生日提醒?生日提醒倒计时怎么设置?

对我而言&#xff0c;记住每个亲朋好友的生日并在每年的那一天给予他们温馨的祝福&#xff0c;是一种传达爱意和关怀的方式。这不仅能够加深我们之间的情感联系&#xff0c;还能让他们感受到自己的重要性。然而&#xff0c;在繁忙的生活节奏中&#xff0c;有时候我们可能会忘记…

39. 【Linux教程】修改文件所属关系

上一节介绍了如何修改文件的读、写、执行权限&#xff0c;包括属主用户权限、所属用户组权限、其他用户组用户权限&#xff0c;本小节介绍如何修改文件的所属关系&#xff0c;所属关系又包括文件的属主和所属组。 1.chown 命令 若想要修改文件的属主&#xff0c;可以使用 chow…

He3 —— 开发者必备的万能工具箱!

推荐一款巨好用又高效的开发必备神器 —— He3 废话不用多说&#xff0c;官网说明简单直接 &#xff01;官网地址&#xff1a;https://he3app.com/zh/ 非要说这个软件要说有什么不好&#xff0c;可能就是有的人打不开官网吧(DDDD)&#xff0c;不过咱可以在本地安装呀&#xf…

【BUUCTF Misc】通关1.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

明日开展 | 2024济南生物发酵系列展携手全球优质品牌惊艳世界,燃放济南!

明日开展&#xff0c;精彩来袭&#xff01; 2024济南生物发酵系列展 携手全球优质品牌 惊艳世界&#xff0c;燃放济南&#xff01; 2024济南生物发酵系列展&#xff0c;由中国生物发酵产业协会主办&#xff0c;上海信世展览服务有限公司承办&#xff0c;3月5-7日在山东国际…

Linux入门到入土

Linxu Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX&#xff08;可移植操作系统接口&#xff09…

电脑端微信无法打开公众号/小程序?

生气了。怎么动不动电脑端微信就打不开公众号/小程序&#xff0c;每次都要搞好久 第一步&#xff1a;打开控制面板、网络和Internet&#xff0c;选中Internet选项。 第二步&#xff1a;选中连接选项&#xff0c;并打开下方的局域网设置。 第三步&#xff1a;取消 为LAN使用代理…

2023年下半年教师资格证考试《教育知识与能力》(中学)题

3.李老师在初二选择了人数、性别比例、学习成绩、教材各方面情况相同的两个班进行教学&#xff0c;对其中一班采用讲授法&#xff0c;对另一个班采用自学辅导法&#xff0c;经过一个阶段的教学后进行测验&#xff0c;以比较两种方法教学效果&#xff0c;李老师采用的方法属于&a…

Java网络通信TCP

目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象&#xff0c;并连接服务端的ip与端口号 2.获取Socket流对象&#xff0c;写入数据…

Catf1agCTF-Web通关合集

本文相关的ctf平台链接&#xff1a;Catf1agCTF - 综合训练平台 WEB签到 查看源代码 flag倒叙了&#xff0c;可以使用下面这个 文本字符串倒序在线工具(ESJSON在线工具) flag&#xff1a; catf1ag{welcome_to_catf1agctf_!!!_gogogo_!!!} flag在哪呢&#xff1f; 查看源代…