菜鳥入門_Python_機器學習(2)_最基本統計特性的證明


@sprt
*寫在開頭:博主在開始學習機器學習和Python之前從未有過任何編程經驗,這個系列寫在學習這個領域一個月之後,完全從一個入門級菜鳥的角度記錄我的學習歷程,代碼未經優化,僅供參考。有錯誤之處歡迎大家指正。
系統:win7-CPU;
編程環境:Anaconda2-Python2.7,IDE:pycharm5;
參考書籍:
《Neural Networks and Learning Machines(Third Edition)》- Simon Haykin;
《Machine Learning in Action》- Peter Harrington;
《Building Machine Learning Systems with Python》- Wili Richert;
C站裏都有資源,也有中文譯本。
我很慶幸能跟隨老師從最基礎的東西學起,進入機器學習的世界。*


我們老師有句名言:統計,說白了就是在‘湊’。我學的不好,理解不了這話高深的意境……還是從最基本的做起,就是那幾個統計領域基石一般定理的證明。包括切比雪夫大數定律、中心極限定理、最大似然定理、貝葉斯定理。

先來看我們的任務:

隨機樣本生成:針對以下3種不同的分佈函數分別生成隨機樣本各N個,計算並畫出直方圖(用一幅圖展示)。設置5個不同的N=10,30,100,300,1000。
•均勻分佈[-1,1]
•正態分佈N(0,1)
•伯努利分佈p=0.3
•用模擬的方法驗證大數定律:對以上不同分佈生成的隨機樣本分別求平均E(N),畫出E(N)(用一幅圖)
•用模擬的方法驗證中心極限定律

幾個基本定理的證明我手推了一遍,但實在懶得再敲,大家可以上網查一下,也可以參考下面這個手推的筆記(妹子的筆記,徵得同意),寫的有點繁瑣(覺得枯燥的自行解決),但勝在詳細,比網上大部分生搬硬套公式來的實在的多,方便輔助理解,另外貝葉斯定理手打,應該看得清楚:










當用數學語言完全推導完一遍之後,已經有了個大體的印象了,然後進行編程模擬就會順利很多(我突然覺得,編程真的是比這些證明要容易有意思的多啊[笑哭])。廢話不多說直接上代碼,先是生成三種隨機分佈圖,並驗證大數定律:

import numpy as np
import matplotlib.pylab as plb

number=[10,30,100,300,1000]

def uniform_dis():
    ave_uniform=[]
    for i in range(len(number)):
        data=np.random.uniform(-1,1,number[i])
        summer=sum(data)
        ave_uniform.append(summer/number[i])
        plb.subplot(230+i+1)
        plb.hist(data)
        plb.xlabel('data{}'.format(i+1))
    plb.subplot(236)
    plb.plot(number,ave_uniform,'b*-')
    plb.xlabel('large_law')
    plb.show()

def bernoulli_dis():
    ave_bernoulli=[]
    for i in range(len(number)):
        data=np.random.binomial(1,0.3,number[i])
        summer=sum(data)
        ave_bernoulli.append(summer*1.0/number[i])
        plb.subplot(230+i+1)
        plb.hist(data)
        plb.xlabel('data{}'.format(i+1))
    plb.subplot(236)
    plb.plot(number,ave_bernoulli,'b*-')
    plb.xlabel('large_law')
    plb.show()

def normal_dis():
    ave_normal=[]
    for i in range(len(number)):
        data=np.random.normal(0,1,number[i])
        summer=sum(data)
        ave_normal.append(summer/number[i])
        plb.subplot(230+i+1)
        plb.hist(data)
        plb.xlabel('data{}'.format(i+1))
    plb.subplot(236)
    plb.plot(number,ave_normal,'b*-')
    plb.xlabel('large_law')
    plb.show()

uniform_dis()
bernoulli_dis()
normal_dis()

覺得numpy庫實在是太方便了,這裏直接調用庫中的分佈函數就可以,當然各位有興趣的也可以自己試一下。運行結果如下:

伯努利分佈:

均勻分佈:

正態分佈:

按照之前任務書中列表給出的樣本數,分別生成各自的頻數直方圖,這裏將它們畫到一副圖中(畫圖技巧參考我上一篇博文中的連接),可以看出隨着樣本數的增加逐步體現出各自的分佈趨勢。右下角的折線圖是用來驗證大數定律,及隨着樣本數的增加,樣本的算術平均值逐步趨近與分佈函數的期望值。當然,這個方法存在很多缺陷,例如我的樣本點太少;這種方法只是反應了大數定律的部分特性,不足以證明等等,有興趣的話可以嘗試下別的方法。

接下來是中心極限定理的證明(這個定理真是驕傲到不講道理,真是奇妙),直接上代碼:

中心極限定理:

import numpy as np
import matplotlib.pylab as plb
from scipy import stats
import math

number=[30,100,300,1000,5000,30000]
y=[]
for i in range(len(number)):
    ave_uniform=[]
    for j in range(1000):
        data=np.random.uniform(-1,1,number[i])
        variance=(1.0/3.0)/(1.0*number[i])
        summer=sum(data)
        ave_uniform.append(summer/(1.0*number[i]))
        Range=np.arange(-0.5,0.5,0.001)
    plb.subplot(230+i+1)
    plb.plot(Range,stats.norm.pdf(Range,0,math.sqrt(variance)))
    plb.hist(ave_uniform,bins=100)
plb.show()

就是證明過程的重現,這裏將不同樣本數下正態分佈的均值求平均,每種樣本數下重複1000次畫線,與一個滿足同樣參數的正態分佈樣本集作比較,結果很明顯。這裏用正態分佈是因爲它的期望和方差很好手算,在用pdf函數的時候可以直接帶入,也算偷懶。結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章