重新研讀fish千聊課04

import scipy.stats
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%config InlindomneBackend.figure_format ='retina'

計算機模擬

生成隨機數

np.random.seed(5)

疑惑: 為什么要有種子呢?

np.random.random(5)
array([ 0.22199317,  0.87073231,  0.20671916,  0.91861091,  0.48841119])
np.random.randint(0,9,10)
array([0, 4, 4, 3, 2, 4, 6, 3, 3, 2])
num =10000
x = np.random.random(num)
y = np.random.random(num)

pi = np.sum(x**2+y**2<1)/num*4
print ("π=",pi)
  π= 3.1756
  • 小疑惑,random()生成的隨機數,是默認為0-1之間的嗎?
    -- 剛才試著將結果打印出來了,確實是0-1之間的數字,沒有大于1的隨機數

我將num設置到1億,結果電腦直接卡機了,強制關機后才緩過來。

  • 疑問。x2+y2< 1,這個結果是數量嗎?總覺得應該用counts()方法,而非sum()方法啊

--原來x2+y2< 1結果是一堆布爾型的結果,而sum是不是只是把為true的結果進行相加了,ture又是1的意思。

x**2+y**2<1


array([ True,  True,  True, ...,  True,  True,  True], dtype=bool)
num*4
4000000

接下來,還可以畫圖,我們來試試吧

plt.figure(figsize=(9,9))

plt.scatter(x,y,alpha=0.45)

x2 = np.arange(0,1.01,0.01)
y2 = np.sqrt(1-x2**2)
plt.plot(x2,y2,'r',lw=2)
#plt.plot(x2, y2, 'm', lw=3)
plt.show()


新增知識點:

  1. 圓半徑為1的情況下,如何計算另外兩條直角邊。 1-x2=y2。y=sqrt(1-x2)
  2. sum()一個過濾函數,是將布爾型結果中的true,計數求和。如:np.sum(x2+y2<1)

錯誤記錄:

  • . 拼寫錯誤,arange,我多寫了一個r,arrange。
output_10_0.png
np.arange(0, 1.01, 0.01)

array([ 0.  ,  0.01,  0.02,  0.03,  0.04,  0.05,  0.06,  0.07,  0.08,
        0.09,  0.1 ,  0.11,  0.12,  0.13,  0.14,  0.15,  0.16,  0.17,
        0.18,  0.19,  0.2 ,  0.21,  0.22,  0.23,  0.24,  0.25,  0.26,
        0.27,  0.28,  0.29,  0.3 ,  0.31,  0.32,  0.33,  0.34,  0.35,
        0.36,  0.37,  0.38,  0.39,  0.4 ,  0.41,  0.42,  0.43,  0.44,
        0.45,  0.46,  0.47,  0.48,  0.49,  0.5 ,  0.51,  0.52,  0.53,
        0.54,  0.55,  0.56,  0.57,  0.58,  0.59,  0.6 ,  0.61,  0.62,
        0.63,  0.64,  0.65,  0.66,  0.67,  0.68,  0.69,  0.7 ,  0.71,
        0.72,  0.73,  0.74,  0.75,  0.76,  0.77,  0.78,  0.79,  0.8 ,
        0.81,  0.82,  0.83,  0.84,  0.85,  0.86,  0.87,  0.88,  0.89,
        0.9 ,  0.91,  0.92,  0.93,  0.94,  0.95,  0.96,  0.97,  0.98,
        0.99,  1.  ])

個人理解:測試一下arange方法的作用。np.arange(x,y,d)是按照順序生成x-y區間的數字,單位是d,也稱作間隔為d。

連續分布--正態分布

模擬面包重量的分布

mean = 950
std = 50

# 生成滿足正態分布的隨機數,并繪制直方圖
sample = np.random.normal(mean, std, size=365)
plt.hist(sample, bins=30, alpha=0.7, rwidth=0.9, normed=True)

plt.show()
output_14_0.png
mean= 950
std = 50

sample = np.random.normal(mean,std,size=365)
plt.hist(sample,bins = 30,rwidth=0.9,normed=True)
plt.show()


錯誤記錄:

  • (mean,std,size=365)中的逗號,我寫作了.。一直報錯,都沒發現原因,有點傻啊
output_15_0.png

用scipy.stats也可以生成正太分布哦

mean = 950
std = 50

bom =scipy.stats.norm(mean,std)

錯誤記錄

  • scipy中正態分布方法,只是簡寫成norm。 scipy.stats.norm 而我寫成額normal
x = np.arange(700,1200,1)
y = bom.pdf(x)
plt.plot(x,y)
plt.show()
output_19_0.png

我在這里嘗試在notebook中安裝seaborn,然后成功了。哈哈哈

!pip install seaborn
Requirement already satisfied: seaborn in d:\programdata\anaconda3\lib\site-packages
import seaborn as sns
sns.boxplot(x,y)
sns.plt.show()


output_21_0.png
  • 自己強行胡亂嘗試用seaborn畫圖,結果搗鼓出來一個。
# 接下來畫概率累計函數
x = np.arange(700,1200,1)
#y = np.norm.cdf(x)
y = bom.cdf(x)
plt.plot(x,y)
plt.show()

錯誤記錄:

  • norm.cdf被我寫作為np.norm.cdf。 其實這個norm是個自定義變量啊
output_23_0.png

計算買到的面包小于1000克的概率

這個該怎么計算呢?有套路嗎?

先畫出概率密度函數的曲線
x = np.arange(700,1200,1)
y = bom.pdf(x)
plt.plot(x,y)


plt.vlines =(1000,0,bom.pdf(1000))

>  ???我的這段代碼里,為什么plt.vlines()方法沒有反應呢?
 
x2 = np.arange(700,1000,1)
y2 = bom.pdf(x2)
plt.plot(x2,y2)

plt.fill_between(x2,y2,color= 'red',alpha=0.2)


plt.show()

錯誤記錄:
1.plt.fill_between()我寫的是fillbetween,竟然沒有加下劃線。

  1. plt.fill_between()內部的參數,不僅僅應該是x軸,應該xy軸,而我的參數設定只有700,1000,這是只基于x軸的思路。
  2. plt中的顏色設定都是color=“”的形式,而是采用的簡寫實在不科學。
  1. 概念混淆。 pdf和cdf完全混淆了。 所以我的顯示完全是兩張圖。 我x,y的函數用的是pdf,而x2,y2,用的是cdf函數,所以總共覺得圖形不對。
    疑惑,為甚么我的圖形,沒有完整顯示呢?-- 因為plt.vilines沒起作用
output_25_0.png

紅色區域的面積,就是700-1000g的概率和。 那么概率和,就應該用概率累計函數。

print("面包等于1000g的概率是:",bom.pdf(1000))
print("小于1000g的概率是:",bom.cdf(1000))

面包等于1000g的概率是: 0.00483941449038
小于1000g的概率是: 0.841344746069

回到剛才的自我提問,小于1000g的概率,有套路嗎?
有!
小于1000g的概率,就是求700g的概率+701g的概率+.......+999g的概率,也就是概率累計和嘛。直接求cdf(1000)即可。

求面包大于1000g的概率

這下簡單了,就是求1000g的概率加到1200g的概率嘛,用整體減去700到1000g的概率和,就可以了呀。
整體等于1,那就好辦啦。

print('面包大于1000g的概率是:',1-bom.cdf(1000))
面包大于1000g的概率是: 0.158655253931
print('面包大于1000g的概率是:',bom.sf(1000))
##錯誤記錄:計劃求反函數,誰知記錯了方法名,應該用sf,而非isf
面包大于1000g的概率是: 0.158655253931
剛才搜到了幾個方法的解釋,常用的概率函數主要可以概括為以下幾類:
  • 根據變量求小于變量的概率(cdf)
  • 根據變量求大于變量的概率(sf)
  • 根據概率求相應的小于變量(ppf)
  • 根據概率求相應的大于變量(isf)
接著做題

計算買到的面包處于950到1050范圍內的概率

## 這種情況下,直接用cdf(1050)-cdf(950)就可以啊
#繪制PDF曲線
x = np.arange(700, 1200, 1)
y = norm.pdf(x)
plt.plot(x, y)

#繪制豎線
#plt.vlines(950, 0, norm.pdf(950))
#plt.vlines(1050, 0, norm.pdf(1050))

#填充顏色
x2 = np.arange(950, 1050, 1)
y2 = norm.pdf(x2)
plt.fill_between(x2, y2, color='blue', alpha=0.1)

#設置y軸范圍
plt.ylim(0,0.0085)

plt.show()
print('面包950-1000g之間的概率是:',bom.cdf(1050)-bom.cdf(950))
output_34_0.png
面包950-1000g之間的概率是: 0.477249868052
90%的情況下,買到的面包是小于多少克的?
  • 根據概率求相應的小于變量(ppf)

這就是典型的用概率求變量。已知概率,求小于變量,該怎么算呢。 小于1000g的概率,是用概率累計函數cdf,即cdf(1000)

已知概率,求變量則應該是cdf的反函數ppf.

先看看概率累計函數吧

x = np.arange(700, 1200, 1)
y = norm.cdf(x)
plt.plot(x, y)
plt.show()
output_36_0.png
print('90%的時候面包小于:',bom.ppf(0.9))
90%的時候面包小于: 1014.07757828
80%的情況下,買到的面包是大于多少克的?
  • 根據概率求相應的大于變量(isf)

這種時候,就該用sf(survival function)的反函數isf(inverse survival function)。

print ('80%的時候面包大于:',bom.isf(0.8),'g')
80%的時候面包大于: 907.918938321 g

離散分布 - 二項分布

投硬幣問題模擬

outcome =np.random.randint(0,2,10)
#outcome= list(outcome)
np.sum(outcome)


  • 哦哦,明白啦,布爾型數據是0和1,然后用sum求和方式來計算,能夠參與計算的只有1啊,就變相的數了有多少個1,好高明啊
3
sample=[np.sum(np.random.randint(0,2,10))for i in range(1000)]
# 隨機生成10個,0-2之間的整數(其實就是0,1),然后重復這個動作1000次,則會生成1000組10個數組

sample= pd.Series(sample)
sample
0      7
1      4
2      4
3      6
4      6
5      5
6      6
7      4
8      5
9      4
10     4
11     4
12     7
13     5
14     4
15     6
16     1
17     6
18     4
19     8
20     6
21     3
22     6
23     7
24     7
25     7
26     2
27     4
28     2
29     4
      ..
970    5
971    4
972    6
973    4
974    5
975    5
976    4
977    4
978    7
979    1
980    3
981    4
982    4
983    7
984    6
985    3
986    5
987    4
988    5
989    4
990    6
991    3
992    4
993    5
994    3
995    6
996    5
997    9
998    3
999    4
Length: 1000, dtype: int64
#sample.value_counts().plot.bar()
#sample.value_counts().sort_index().plot.bar()
#plt.show()
##錯誤記錄,sample還需要數組化(相當于列表化),但我沒數組化后賦值給sample,使得已知報錯,無法運算

sample.value_counts().sort_index().plot.bar()
plt.show()
output_46_0.png

投硬幣問題的二項分布

n = 10
p = 0.4

mean_bionom = n*p
std_bionom =n*p*(1-p)
print(n*p,n*p*(1-p))

binomial = scipy.stats.binom(n,p)
print (binomial)
4.0 2.4
<scipy.stats._distn_infrastructure.rv_frozen object at 0x0000000009FCFE80>
x = np.arange(0,11,1)
y = binomial.pmf(x)
plt.plot(x,y)
plt.vlines(x,0,y,colors='b')
##疑惑:為什么這里要寫0
plt.show()
 

錯誤記錄: 1.寫y值時,我總是要用np.binom.pmf(x),要加上np前綴,但實際上上,data.pmf(x)就可以啦。
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-32-4c130d5dd029> in <module>()
      3 plt.plot(x,y)
      4 #plt.vlines(x,0,y,colors='b')
----> 5 plt.vlines(x, 0, binomial.pmf(x), colors='b')
      6 ##疑惑:為什么這里要寫0
      7 plt.show()


TypeError: 'tuple' object is not callable
x = np.arange(0,11)
plt.plot(x, binomial.pmf(x), 'bo')
plt.vlines(x, 0, binomial.pmf(x), colors='b')
plt.ylim(0,0.3)
plt.show()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-35-466792604d85> in <module>()
      1 x = np.arange(0,11)
      2 plt.plot(x, binomial.pmf(x), 'bo')
----> 3 plt.vlines(x, 0, binomial.pmf(x), colors='b')
      4 plt.ylim(0,0.3)
      5 plt.show()


TypeError: 'tuple' object is not callable
mean,var =binomial.stats()
print(binomial.stats())
(array(4.0), array(2.4))

應用

某家風投企業,投資成功的概率是5%,如果它投了100個項目,恰好有5個成功的概率是多少?

n = 100
p = 0.05
binom = scipy.stats.binom(n,p)
print(binom)

<scipy.stats._distn_infrastructure.rv_frozen object at 0x000000000B69F668>
##恰好成功5個,就是求5的對應概率,就是pmf
binom.pmf(5)
0.18001782727043672

投資至少成功了5個的概率?

#至少成功5個,就是大于等于5
1-binom.cdf(4)
0.56401869931428927
binom.sf(4)
0.56401869931429105

10%的情況下,至少能成功幾個?

#這也是一個大于等于的情況,用生存函數
binom.isf(0.1)
8.0

離散分布 - 泊松分布

有一家便利店使用泊松分布來估計周五晚上到店買東西的顧客數,根據以往數據,周五晚上平均每個小時的顧客數是20。

lmd = 20
poisson = scipy.stats.poisson(lmd)
#錯誤記錄: poisson 被我拼寫為poission。 讀了個i
x = np.arange(0,40)
plt.plot(x, poisson.pmf(x), 'bo')
#plt.vlines(x, 0, poisson.pmf(x), colors='b')
#plt.ylim(0,0.1)
plt.show()

output_63_0.png
mean,var= poisson.stats()
print('mean=',mean,'var=',var)
mean= 20.0 var= 20.0
#顧客數恰好為20的概率
poisson.pmf(20)
0.088835317392084806
#顧客數小于等于15
poisson.cdf(15)
0.1565131346397429
#顧客數大于等于20
poisson.sf(19)


錯誤記錄:

  • 大于等于20,就是包含20,那么久該從19之后算起,如果我輸入20,則是從20之后開始計算。 應該是19

疑惑

  • 不過什么時候該用20,什么時候該用19呢,難道是大于的時候嗎? 為什么小于等于15,就使用cdf(15),而大于等于20就使用sf(19)呢?
0.44090741576867482
poisson.ppf(0.9)
26.0

基本作業

機票超賣現象

假設某國際航班有300個座位,乘客平均誤機率是2%。

1、如果一共賣出305張機票,那么登機時人數超額的概率是多少?

n = 305
p=0.98
binomial = scipy.stats.binom(n,p)

plt.plot(np.arange(290,310,1),binomial.pmf(np.arange(290,310,1)))
plt.show()
output_70_0.png
## 超額的概率,就是實際人數超過300的概率. 此時n=305
#應該計算大于等于301的情況,sf函數
print ('超員的概率為:',binomial.sf(300))

超員的概率為: 0.269150138198

2、如果一共賣出305張機票,登機時最多只超額1人的概率是多少?

#只超額1人,就是小于等于301嘛。 應該使用cdf

print ('只超額1人的概率:',binomial.cdf(301))
只超額1人的概率: 0.860144501066

3、一共賣幾張票,可以保證不超額的概率至少是90%。

n1 = 309
bm1=scipy.stats.binom(n1,p)
x*0.9<300
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True], dtype=bool)
bm1.isf(0.9)
300.0

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 來源: http://www.douban.com/group/topic/14820131/ 調整變量格式: f...
    MC1229閱讀 6,932評論 0 5
  • 本系列第三篇,承接前面的《淺談機器學習基礎》和《淺談深度學習基礎》。 自然語言處理緒論 什么是自然語言處理? 自然...
    我偏笑_NSNirvana閱讀 17,663評論 2 68
  • 隨機變量是根據偶然性取值的變量。我們在談到隨機變量時,通常是以“概率分布”的形式來描述他們。也即:隨機變量落在每一...
    小貍投資閱讀 5,441評論 1 7
  • 你讓我想到一切冷峭的事物 冰凌 峰頂 利刃寒光的閃爍 你讓我想到一切慨然的事物 雷霆 風暴 浪尖盛大的花朵 你讓我...
    芳草依依閱讀 276評論 0 2
  • 16軌道 植物生長不錯!小草長高了,有些多,要留意清楚哈,梔子花葉子有些枯。 蔬菜生長很好,番茄苗長高了,菜苗身姿...
    JuN_78b0閱讀 463評論 0 1