卡方分布和 Zipf 分布模仿及 Seaborn 可视化教程

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

卡方分布

简介

卡方分布是一种连续概率分布,常用于统计学中进行假设检验。它描述了在独立抽样中,每个样本的平方偏差之和的分布。卡方分布的外形由其自由度 (df) 参数决定,自由度越大,分布越平缓。
参数

卡方分布用两个参数来定义:
df:自由度,表示卡方分布的外形。自由度必须为正整数。
size:输出数组的外形。
公式

卡方分布的概率密度函数 (PDF) 为:
  1. 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 的卡方分布随机数:
  1. import numpy as np
  2. data = np.random.chisquare(df=5, size=10)
  3. print(data)
复制代码
可视化卡方分布

Seaborn 库提供了便捷的函数来可视化分布,包罗卡方分布。
示例:绘制 1000 个自由度为 5 的卡方分布随机数的分布图:
  1. import seaborn as sns
  2. import numpy as np
  3. data = np.random.chisquare(df=5, size=1000)
  4. sns.distplot(data)
  5. plt.show()
复制代码
训练


  • 模仿 20 个自由度为 10 的卡方分布随机数,并绘制它们的分布图。
  • 比力不同自由度下卡方分布外形的变革。
  • 使用卡方分布来进行卡方检验,假设某枚硬币是公平的,即正面朝上的概率为 0.5。投掷硬币 100 次,并计算正面朝上的次数是否服从二项分布。
解决方案
  1. import seaborn as sns
  2. import numpy as np
  3. from scipy import stats
  4. # 1. 模拟随机数并绘制分布图
  5. data = np.random.chisquare(df=10, size=20)
  6. sns.distplot(data)
  7. plt.show()
  8. # 2. 比较不同自由度下分布形状的变化
  9. df_values = [2, 5, 10, 20]
  10. for df in df_values:
  11.     data = np.random.chisquare(df=df, size=1000)
  12.     sns.distplot(data, label=f"df={df}")
  13. plt.legend()
  14. plt.show()
  15. # 3. 进行卡方检验
  16. heads = np.random.binomial(n=100, p=0.5)
  17. chi2_stat, p_value = stats.chisquare(heads, f_exp=50)
  18. print("卡方统计量:", chi2_stat)
  19. print("p 值:", p_value)
  20. # 由于 p 值大于 0.05,无法拒绝原假设,即可以认为硬币是公平的。
复制代码
瑞利分布

简介

瑞利分布是一种连续概率分布,常用于描述信号处理和雷达系统中的幅度分布。它表示在一个随机变量的平方根服从指数分布时,该随机变量的分布。
参数

瑞利分布用一个参数来定义:
scale:标准参数,控制分布的平坦程度。较大的标准参数使分布更加平坦,两侧尾部更加分散。默以为 1。
公式

瑞利分布的概率密度函数 (PDF) 为:
  1. 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) 为:
  1. P(k) = 1 / (k ^ a)    for k >= 1
复制代码
其中:
P(k):表示第 k 个元素出现的概率。
k:元素的排名,从 1 开始。
a:分布参数。
生成Zipf分布数据

NumPy提供了random.zipf()函数来生成服从Zipf分布的随机数。该函数接受以下参数:
a:分布参数。
size:输出数组的外形。
示例:生成10个服从Zipf分布的随机数,分布参数为2:
  1. import numpy as np
  2. data = np.random.zipf(a=2, size=10)
  3. print(data)
复制代码
可视化Zipf分布

Seaborn库提供了便捷的函数来可视化分布,包罗Zipf分布。
示例:绘制1000个服从Zipf分布的随机数的分布图,分布参数为2:
  1. import seaborn as sns
  2. import numpy as np
  3. data = np.random.zipf(a=2, size=1000)
  4. sns.distplot(data)
  5. plt.show()
复制代码
训练


  • 模仿不同分布参数下Zipf分布外形的变革。
  • 使用Zipf分布来模仿一个城市的规模分布,并计算排名前10的城市人口占总人口的比例。
  • 比力Zipf分布与幂律分布的异同。
解决方案
  1. import seaborn as sns
  2. import numpy as np
  3. # 1. 模拟不同分布参数下Zipf分布形状的变化
  4. a_values = [1.5, 2, 2.5, 3]
  5. for a in a_values:
  6.     data = np.random.zipf(a=a, size=1000)
  7.     sns.distplot(data, label=f"a={a}")
  8. plt.legend()
  9. 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为:
  1. P(k) = 1 / (k ^ a)
复制代码
幂律分布的PMF为:
  1. P(k) = C / k ^ alpha
复制代码
其中,C为归一化常数。
可见,Zipf分布的参数a控制了分布的倾斜程度,而幂律分布的参数alpha则控制了分布的团体外形。
此外,Zipf分布通常用于描述离散数据,而幂律分布则可以用于描述离散和连续数据。
最后

为了方便其他装备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有资助,欢迎点赞、收藏、关注

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表