概率演算法_二項分佈和泊松分佈

咻_python發表於2018-08-24

本次函式有

1、階乘

2、計算組合數C(n,x)

3、二項概率分佈

4、泊松分佈

 

以下是歷史函式

create_rand_list() #建立一個含有指定數量元素的list
sum_fun() #累加
len_fun() #統計個數
multiply_fun() #累乘
sum_mean_fun() #算數平均數
sum_mean_rate() #算數平均數計算回報
median_fun() #中位數
modes_fun() #眾數
ext_minus_fun() #極差
geom_mean_fun() #幾何平均數
geom_mean_rate() #幾何平均回報

var_fun() #方差-樣本S^2
covar_fun() #協方差(標準差)-樣本S
trans_coef_fun() #變異係數CV
pearson_fun() #相關係數-樣本r

 

unite_rate_fun #聯合概率
condition_rate_fun #條件概率
e_x #隨機變數期望值
var_rand_fun #隨機變數方差
covar_rand_fun #隨機變數協方差
covar_rand_xy_fun #聯合協方差
e_p #組合期望回報
var_p_fun #投資組合風險
bayes #貝葉斯

—————以上是舊的————————————————————————
—————以下是新的————————————————————————

繼續概率,本次是二項分佈和泊松分佈,這個兩個還是挺好玩的,可以作為預測函式用,因為函式比較少,本次就不給例子了,但是會對函式做逐一說明

1、階乘n!
就是每次-1乘,直到*1,例如5! = 5 * 4 * 3 * 2 * 1 = 120,這個是正常的,但是在寫函式的時候這樣演算法效率會低些,因此直接反過來,1*2*3…這種,那麼函式就是

 

def fact_fun(n):
  if n == 0:
    return 1
  n += 1
  fact_list = [i for i in range(1,n)]
  fact_num = multiply_fun(fact_list)
  return fact_num

2、計算組合數C(n,x)
C(n,x) = n! / (x! * (n – x)!)
表示從n個樣本中抽取x個樣本單元,可能出現結果的組合數,例如從5個物品中抽取3個物品,這三個物品的組合數就是10種

def c_n_x(case_count,real_count):
  fact_n = fact_fun(case_count)
  fact_x = fact_fun(real_count)
  fact_n_x = fact_fun(case_count - real_count)
  c_n_x_num = fact_n / (fact_x * fact_n_x)
  return c_n_x_num

3、二項概率分佈
執行n次伯努利試驗,伯努利試驗就是執行一次只有兩種可能且兩種可能互斥的事件,比如丟硬幣實驗,執行n次,成功k次的概率
P(ξ=K) = C(n,k) * p^k * (1-p)^(n-k)
n=5 k=3 P(ξ>=K) = p(K = 3) + p(K = 4) + p(K = 5)
p表示一個事件的成功概率,失敗則是1 – p

def binomial_fun(case_count,real_count,p):
  c_n_k_num = c_n_x(case_count,real_count)
  pi = (p ** real_count) * ((1 - p) ** (case_count - real_count))
  binomial_num = c_n_k_num * pi
  return binomial_num

4、泊松分佈
給定的一個機會域中,機會域可以是一個範圍,也可以是一段時間,在這個機會域中可能發生某個統計事件的概率,舉個例子,比有個商店,每小時平均有10位顧客光顧,那麼一個小時有13位顧客光顧的概率,就是泊松分佈,13位顧客光顧就是統計事件
P(X) = (e^-λ*λ^X)/X! = (2.7182818^-10*10^13)/13! = 0.0729
這裡的λ是指平均值,可以使用算數平均數得到,e是自然常數~=2.7182818,有函式

def poisson_fun(chance_x, case_list = [0],mean_num = 0):
  chance_x_fact = fact_fun(chance_x)
  e = 2.7182818
  if len_fun(case_list) == 1 and case_list[0] == 0:
    poisson_num = ((e ** (0-mean_num)) * mean_num ** chance_x) / chance_x_fact
  else:
    mean_num = sum_mean_fun(case_list)
    poisson_num = ((e ** (0-mean_num)) * mean_num ** chance_x) / chance_x_fact
  return poisson_num

這個函式需要說明下,實際需要的是兩個引數,一個平均值另一個是期望統計量,之所以指定了3個函式是因為可能輸入的不一定是一個數字,也可能是個list,那麼會有兩種計算方式,這個已在if中體現,引用方法有兩種,例如

if __name__ == `__main__`:
  # 第一種
  poisson_rate = poisson_fun(mean_num = 10,chance_x = 13)
  print poisson_rate 
  # 第二種
  case_list = [8,9,10,11,12]
  poisson_rate = poisson_fun(case_list = case_list ,chance_x = 13)
  print poisson_rate 

 

相關文章