python+正態分布+蒙特卡洛預測男女身高概率!


python機器學習生物信息學系列課(博主錄制): http://dwz.date/b9vw

機器學習,統計項目聯系QQ:231469242

 

正態分布也稱常態分布或常態分配,是連續隨機變量概率分布的一種,是在數理統計的理論與實際應用中占有重要地位的一種理論分布。自然界人類社會,心理與教育中大量現象均按正態形式分布。例如能力的高低,學生成績的好壞,人們的社會態度,行為表現以及身高、體重等身體狀態。

(高斯Carl Friedrich Gauss)

 

正態分布是由阿伯拉罕·德莫弗爾(Abraham de Moivre)1733年發現的。其他幾位學者如拉普拉斯(Marquis de Laplace)、高斯 (Carl Friedrich Gauss)對正態分布的研究也做出了貢獻,故有時稱正態分布為高斯分布。

正態分布的函數(又稱密度函數)為

 

標准正態分布這兩個參數分別為0與1。

標准正態分布的密度函數可寫作:

 

(正態分布三個標准差的概率分布) 

所有正太分布都可以轉化成標准正態分布。

期望值μ決定了其位置,其標准差σ決定了分布的幅度。

 

正態分布具有很大醫學意義。正態分布的應用某些醫學現象,如同質群體的身高、紅細胞數、血紅蛋白量、膽固醇等,以及實驗中的隨機誤差,呈現為正態或近似正態分布。

我們提出一個常見的身高概率問題:假設男性平均身高175,標准差6;女性平均身高168,  標准差3;隨機抽取一個女性和男性,女性高於男性隨機概率是多少?

我們不需要通過復雜公式來計算。只需讓計算機產生足夠多的隨機值來模擬計算,最后得到答案。

下面我們用Python的蒙特卡洛建模正態分布函數,解決這個男女身高概率問題。

(matplotlib繪制兩個正態分布,紅色表示女性,藍色表示男性)

 

程序模擬10萬個隨機值,最后算出結果0.14727

即女性高於男性隨機概率為0.14727

 

測試環境Anaconda Python2.7

源代碼已經本人測試無問題

# -*- coding: utf-8 -*-

‘’’

By Toby ,Blog:

http://www.cnblogs.com/webRobot/

’’’
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import seaborn as sns
import math,pylab,matplotlib,numpy
from matplotlib.font_manager import FontProperties
#設置中文字體
font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=15)
#測試n次
n=100000
#標准正太分布
normalDistribution=stats.norm(175,6)
#方差較大正態分布
normalDistribution1=stats.norm(168,3)
#一次隨機
def Random_single():
    array_male=normalDistribution.rvs(1)
    array_female=normalDistribution1.rvs(1)
    male=array_male[0]
    female=array_female[0]
    if female>male:
       return True
    else:
       return False
#n次隨機,返回count(女性高於男性的次數)
def Multiple_random(n):
    count=0
    for i in range(n):
       value=Random_single()
       if value==True:
          count+=1
    return count
# 計算女性高於男性概率
def Probability(n):
    count=Multiple_random(n)
    p=count*1.0/n
    return p
probability=Probability(n)
print '隨機次數',n
print '女性高於男性概率:',probability
#繪圖
x=np.arange(60,220)
y=normalDistribution.pdf(x)
y1=normalDistribution1.pdf(x)
plt.plot(x,y,label="male")
plt.plot(x,y1,'r',label="female")
plt.xlabel("x")
plt.ylabel("probability density")
#plt.title("Normal distribution:mean=%.1f,standard deviation=%.1f"%(mean,std))
plt.title("Normal distribution")
plt.legend()
plt.show()

 

python金融風控評分卡模型和數據分析微專業課(博主親自錄制視頻):http://dwz.date/b9vv

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM