SciPy是世界著名的Python開源科學計算庫,建立在NumPy之上。它增加
的功能包括數值積分、最優化、統計和一些專用函數。
MATLAB 和 Octave
MATLAB以及其開源替代品Octave都是流行的數學工具。scipy.io包的函數可以在Python
中加載或保存MATLAB和Octave的矩陣和數組。loadmat函數可以加載.mat文件。savemat函
數可以將數組和指定的變量名字典保存為.mat文件。
動手實踐:保存和加載.mat 文件
如果我們一開始使用了NumPy數組,隨後希望在MATLAB或Octave環境中使用這些數組,那
麼最簡單的辦法就是創建一個.mat文件,然後在MATLAB或Octave中加載這個文件。請完成如
下步驟。
(1) 創建NumPy數組並調用savemat創建一個.mat文件。該函數有兩個參數——一個文件名
和一個包含變量名和取值的字典。
a = np.arange(7)
io.savemat("a.mat", {"array": a})
(2) 在MATLAB或Octave環境中加載.mat文件,並檢查數組中存儲的元素。
octave-3.4.0:7> load a.mat
octave-3.4.0:8> a
octave-3.4.0:8> array
array =
0
1
2
3
4
5
6
我們使用NumPy代碼創建了一個.mat文件並在Octave中成功加載。我們檢查了之前創建的
NumPy數組的元素。示例代碼見scipyio.py文件。
import numpy as np
from scipy import io
a = np.arange(7)
io.savemat("a.mat", {"array": a})
統計
SciPy的統計模塊是scipy.stats,其中有一個類是連續分佈的實現,一個類是離散分佈的
實現。此外,該模塊中還有很多用於統計檢驗的函數。
分析隨機數
我們將按正態分佈生成隨機數,並使用scipy.stats包中的統計函數分析生成的數據。請
完成如下步驟。
(1) 使用scipy.stats包按正態分佈生成隨機數。
generated = stats.norm.rvs(size=900)
(2) 用正態分佈去擬合生成的數據,得到其均值和標準差:
print "Mean", "Std", stats.norm.fit(generated)
均值和標準差如下所示:
Mean Std (0.0071293257063200707, 0.95537708218972528)
(3) 偏度(skewness)描述的是概率分佈的偏斜(非對稱)程度。我們來做一個偏度檢驗。
該檢驗有兩個返回值,其中第二個返回值為p-value,即觀察到的數據集服從正態分佈的概率,取
值範圍為0~1。
print "Skewtest", "pvalue", stats.skewtest(generated)
偏度檢驗返回的結果如下:
Skewtest pvalue (-0.62120640688766893, 0.5344638245033837)
因此,該數據集有53%的概率服從正態分佈。
(4) 峰度(kurtosis)描述的是概率分佈曲線的陡峭程度。我們來做一個峰度檢驗。該檢驗與
偏度檢驗類似,當然這裡是針對峰度。
print "Kurtosistest", "pvalue", stats.kurtosistest(generated)
峰度檢驗返回的結果如下:
Kurtosistest pvalue (1.306538101953 6981, 0.19136963054975586)
(5) 正態性檢驗(normality test)可以檢查數據集服從正態分佈的程度。我們來做一個正態性
檢驗。該檢驗同樣有兩個返回值,其中第二個返回值為p-value。
print "Normaltest", "pvalue", stats.normaltest(generated)
正態性檢驗返回的結果如下:
Normaltest pvalue (2.09293921181506, 0.35117535059841687)
(6) 使用SciPy我們可以很方便地得到數據所在的區段中某一百分比處的數值:
print "95 percentile", stats.scoreatpercentile(generated, 95)
得到95%處的數值如下:
95 percentile 1.54048860252
(7) 將前一步反過來,我們也可以從數值1出發找到對應的百分比:
print "Percentile at 1", stats.percentileofscore(generated, 1)
得到對應的百分比如下:
Percentile at 1 85.5555555556
(8) 使用Matplotlib繪製生成數據的分佈直方圖。有關Matplotlib的詳細介紹可以在前一章中
找到。
plt.hist(generated)
plt.show()
我們按正態分佈生成了一個隨機數據集,並使用scipy.stats模塊分析了該數據集。示例
代碼見statistics.py文件。
from scipy import stats
import matplotlib.pyplot as plt
generated = stats.norm.rvs(size=900)
print "Mean", "Std", stats.norm.fit(generated)
print "Skewtest", "pvalue", stats.skewtest(generated)
print "Kurtosistest", "pvalue", stats.kurtosistest(generated)
print "Normaltest", "pvalue", stats.normaltest(generated)
print "95 percentile", stats.scoreatpercentile(generated, 95)
print "Percentile at 1", stats.percentileofscore(generated, 1)
plt.hist(generated)
plt.show()
閱讀更多 自嗨編程土法量投 的文章