卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程
卡方分布
简介
卡方分布是一种连续概率分布,常用于统计学中进行假设检验。它描述了在独立抽样中,每个样本的平方偏差之和的分布。卡方分布的形状由其自由度 (df) 参数决定,自由度越大,分布越平缓。
参数
卡方分布用两个参数来定义:
df:自由度,表示卡方分布的形状。自由度必须为正整数。
size:输出数组的形状。
公式
卡方分布的概率密度函数 (PDF) 为:
f(x) = (x^(df/2 - 1) * np.exp(-x/2)) / (2^(df/2) * Gamma(df/2)) for x >= 0
其中:
f(x):表示在 x 点的概率密度。
x:非负实数。
df:自由度。
np.exp(-x/2):指数函数。
Gamma(df/2):伽马函数。
生成卡方分布数据
NumPy 提供了 random.chisquare() 函数来生成服从卡方分布的随机数。该函数接受以下参数:
df:自由度。
size:输出数组的形状。
示例:生成 10 个自由度为 5 的卡方分布随机数:
import numpy as np
data = np.random.chisquare(df=5, size=10)
print(data)
可视化卡方分布
Seaborn 库提供了便捷的函数来可视化分布,包括卡方分布。
示例:绘制 1000 个自由度为 5 的卡方分布随机数的分布图:
import seaborn as sns
import numpy as np
data = np.random.chisquare(df=5, size=1000)
sns.distplot(data)
plt.show()
练习
- 模拟 20 个自由度为 10 的卡方分布随机数,并绘制它们的分布图。
- 比较不同自由度下卡方分布形状的变化。
- 利用卡方分布来进行卡方检验,假设某枚硬币是公平的,即正面朝上的概率为 0.5。抛掷硬币 100 次,并计算正面朝上的次数是否服从二项分布。
解决方案
import seaborn as sns
import numpy as np
from scipy import stats
# 1. 模拟随机数并绘制分布图
data = np.random.chisquare(df=10, size=20)
sns.distplot(data)
plt.show()
# 2. 比较不同自由度下分布形状的变化
df_values = [2, 5, 10, 20]
for df in df_values:
data = np.random.chisquare(df=df, size=1000)
sns.distplot(data, label=f"df={df}")
plt.legend()
plt.show()
# 3. 进行卡方检验
heads = np.random.binomial(n=100, p=0.5)
chi2_stat, p_value = stats.chisquare(heads, f_exp=50)
print("卡方统计量:", chi2_stat)
print("p 值:", p_value)
# 由于 p 值大于 0.05,无法拒绝原假设,即可以认为硬币是公平的。
瑞利分布
简介
瑞利分布是一种连续概率分布,常用于描述信号处理和雷达系统中的幅度分布。它表示在一个随机变量的平方根服从指数分布时,该随机变量的分布。
参数
瑞利分布用一个参数来定义:
scale:尺度参数,控制分布的平坦程度。较大的尺度参数使分布更加平坦,两侧尾部更加分散。默认为 1。
公式
瑞利分布的概率密度函数 (PDF) 为:
f(x) = (x scale) / (scale^2 np.exp(-x^2 / (2 scale^2))) for x >= 0
其中:
f(x):表示在 x 点的概率密度。
x:非负实数。
scale:尺
Zipf分布
简介
Zipf分布,又称为Zeta分布,是一种离散概率分布,常用于描述自然语言、人口统计学、城市规模等领域中具有幂律特征的数据分布。它体现了“少数服从多数”的现象,即排名越靠前的元素出现的频率越高。
参数
Zipf分布用一个参数来定义:
a:分布参数,控制分布的形状。a越小,分布越偏向于少数元素,越接近幂律分布。默认为 2。
公式
Zipf分布的概率质量函数 (PMF) 为:
P(k) = 1 / (k ^ a) for k >= 1
其中:
P(k):表示第 k 个元素出现的概率。
k:元素的排名,从 1 开始。
a:分布参数。
生成Zipf分布数据
NumPy提供了random.zipf()函数来生成服从Zipf分布的随机数。该函数接受以下参数:
a:分布参数。
size:输出数组的形状。
示例:生成10个服从Zipf分布的随机数,分布参数为2:
import numpy as np
data = np.random.zipf(a=2, size=10)
print(data)
可视化Zipf分布
Seaborn库提供了便捷的函数来可视化分布,包括Zipf分布。
示例:绘制1000个服从Zipf分布的随机数的分布图,分布参数为2:
import seaborn as sns
import numpy as np
data = np.random.zipf(a=2, size=1000)
sns.distplot(data)
plt.show()
练习
- 模拟不同分布参数下Zipf分布形状的变化。
- 利用Zipf分布来模拟一个城市的规模分布,并计算排名前10的城市人口占总人口的比例。
- 比较Zipf分布与幂律分布的异同。
解决方案
import seaborn as sns
import numpy as np
# 1. 模拟不同分布参数下Zipf分布形状的变化
a_values = [1.5, 2, 2.5, 3]
for a in a_values:
data = np.random.zipf(a=a, size=1000)
sns.distplot(data, label=f"a={a}")
plt.legend()
plt.show()
2. 模拟城市规模分布并计算人口比例
population = np.random.zipf(a=2, size=100)
top10_population = population[:10].sum()
total_population = population.sum()
print("排名前10的城市人口:", top10_population)
print("排名前10的城市人口比例:", top10_population / total_population)
3. Zipf分布与幂律分布的比较
Zipf分布和幂律分布都描述了“少数服从多数”的现象,即排名越靠前的元素出现的频率越高。
但是,Zipf分布的参数化程度更高,可以更精确地描述不同领域的幂律现象。幂律分布则更通用,但缺乏Zipf分布对参数的控制能力。
具体来说,Zipf分布的PMF为:
P(k) = 1 / (k ^ a)
幂律分布的PMF为:
P(k) = C / k ^ alpha
其中,C为归一化常数。
可见,Zipf分布的参数a控制了分布的倾斜程度,而幂律分布的参数alpha则控制了分布的整体形状。
此外,Zipf分布通常用于描述离散数据,而幂律分布则可以用于描述离散和连续数据。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程的更多相关文章
- Python - Seaborn可视化:图形个性化设置的几个小技巧
1 概述 在可视化过程中,经常会对默认的制图效果不满意,希望能个性化进行各种设置. 本文通过一个简单的示例,来介绍seaborn可视化过程中的个性化设置.包括常用的设置,如: 设置图表显示颜色 设置图 ...
- 国外大神制作的一个很棒的matplotlib 可视化教程
国外大神制作的一个很棒的matplotlib 可视化教程 参考:https://www.machinelearningplus.com/plots/top-50-matplotlib-visualiz ...
- PJ可能会考的模拟与枚举-自学教程
PJ可能会考的模拟与枚举-自学教程 文/Pleiades_Antares 之前学校里看一个小可爱复习的时候偷偷听来着XD 简单记了一下重点吧,希望能对看官您有所帮助XD 以下⬇️是几个复习时讲过的题, ...
- Darknet卷基层浅层特征可视化教程
目录 Darknet浅层可视化教程 说明 处理步骤 使用python可视化txt文件 Darknet浅层可视化教程 说明 针对YOLO官方提供的c语言版的darknet进行了修改,添加了一些函数,进行 ...
- Java生成-zipf分布的数据集(自定义倾斜度,用作spark data skew测试)
1.代码 import java.io.Serializable; import java.util.NavigableMap; import java.util.Random; import jav ...
- 用 IQ分布模拟图来测试浏览器的性能
今天天气太凉快,跟这个日历上属于夏天的那一页显得格格不入!就连我我床下那台废弃的ThinkPad,居然也十分透凉气,那外壳连我的体温高都没有,于是,我就开始想一个方法,让我那个废弃的电脑发热,顺便用它 ...
- seaborn可视化特征的相关性
import seaborn as sn sn.heatmap(trainX.corr(),vmax=1,square=True)
- seaborn可视化
文章来自https://blog.csdn.net/qq_33120943/article/details/76569756 详细教程可以查看官方额示例:http://seaborn.pydata.o ...
- Levenberg-Marquardt优化和zipf分布
最近审论文和看报告中遇到LM优化和齐普夫分布,于是查了一下. LM方法是高斯牛顿迭代方法的改进,下面分别是高斯牛顿.齐普夫方法的公式: Δ=−(JfTJf)−1JfTf,Δ=−(JfTJf+λI)−1 ...
- T分布、卡方分布、F分布
请参考: https://www.cnblogs.com/think-and-do/p/6509239.html
随机推荐
- MMDeploy部署实战系列【第五章】:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理
MMDeploy部署实战系列[第五章]:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善 ...
- 记一次 Go 调用系统命令出现的问题分析
首先在程序中封装了下面一个函数用来执行系统命令: // 执行系统命令 func executeCommand(command string, output, outerr io.Writer) err ...
- Java面试题:为什么HashMap不建议使用对象作为Key?
HashMap 是一种基于哈希表的动态数据结构,它允许使用任意不可变对象作为键(key)来存储和检索数据.然而,在某些情况下,使用对象作为 HashMap 的键可能会遇到一些问题. 首先,我们需要明确 ...
- 【Oracle】在PL/SQL中使用sql实现选择排序
[Oracle]在PL/SQL中使用sql实现选择排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础 使用SQL实现排序系列: 使用S ...
- 融合数据库生态:利用 EventBridge 构建 CDC 应用
简介: 近期,EventBridge 事件流已经支持了基于阿里云 DTS服务的 CDC 能力.本文将从 CDC.CDC 在 EventBridge 上的应用以及若干最佳实践场景等方面,为大家介绍如何利 ...
- 日志服务SLS 助力识货 APP,解决业务数据采集查询监控问题
简介: 日志服务SLS 助力识货 APP,解决业务数据采集查询监控问题 更多存储标杆案例欢迎点击下方链接查看 阿里云存储标杆案例样板间 公司介绍识货APP是虎扑体育旗下的导购应用,致力于为广大年轻用户 ...
- KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪
简介:欢迎更多的用户试用 KubeDL,并向我们提出宝贵的意见,也期待有更多的开发者关注以及参与 KubeDL 社区的建设! 作者:陈裘凯( 求索) 前言 KubeDL 是阿里开源的基于 Kuber ...
- OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力
简介: 阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 m ...
- 从 Uno Platform 4 更新 Uno Platform 5 的迁移方法
本文记录我的一个小项目从 Uno Platform 4 更新 Uno Platform 5 的一些变更和迁移方法,由于项目太小,可能踩到的坑不多 官方文档: Migrating to Uno Plat ...
- 2019-8-31-PowerShell-使用-WMI-获取信息
title author date CreateTime categories PowerShell 使用 WMI 获取信息 lindexi 2019-08-31 16:55:58 +0800 201 ...