scipy安装_4. Python--Scipy库(下/13-17)
本文非常全面的介紹了Scipy庫(kù),希望大家有耐心的看下去。參考鏈接在最后。
目錄:
1. Scipy簡(jiǎn)介
1.1 子包
1.2 數(shù)據(jù)結(jié)構(gòu)
2. Scipy開(kāi)發(fā)環(huán)境安裝
2.1 Windows
2.2 Linux
3. Scipy基本功能
3.1 內(nèi)在Numpy數(shù)組創(chuàng)建
3.2 矩陣
4. Scipy簇聚
4.1 Scipy中實(shí)現(xiàn)K-Means
4.2 三個(gè)集群計(jì)算K均值
5. Scipy常量
5.1 Scipy常量包
5.2 可用常量列表
6. FFTpack
6.1 快速傅立葉變換
6.2 離散余弦變換
7. 積分
7.1 單積分
7.2 多重積分
7.3 雙重積分
8. 插值
8.1 插值是什么
8.2 一線插值
8.3 樣條曲線
9. 輸入/輸出
10. Linalg
10.1 線性方程組
10.2 查找行列式
10.3 特征向量與特征值
11. Ndimage
11.1 打開(kāi)與寫(xiě)入圖像文件
11.2 濾鏡
11.3 邊緣檢測(cè)
12. 優(yōu)化算法
12.1 Nelder-Mead單純形算法
12.2 最小二乘
13. 統(tǒng)計(jì)函數(shù)
13.1 正太連續(xù)隨機(jī)變量
13.2 均勻分布
14. CSGraph
14.1 圖表示
14.2 獲取單詞列表
15. Scipy空間
15.1 Delaunay三角
15.2 共面點(diǎn)
15.3 凸殼
16. Scipy ODR
17. Scipy特殊包
----------------------------------------------------------------------------------
13. 統(tǒng)計(jì)函數(shù)
所有的統(tǒng)計(jì)函數(shù)都位于子包scipy.stats中,并且可以使用info(stats)函數(shù)獲得這些函數(shù)的完整列表。隨機(jī)變量列表也可以從stats子包的docstring中獲得。 該模塊包含大量的概率分布以及不斷增長(zhǎng)的統(tǒng)計(jì)函數(shù)庫(kù)。
每個(gè)單變量分布都有其自己的子類(lèi),如下表所述。
13.1 正態(tài)連續(xù)隨機(jī)變量
隨機(jī)變量X可以取任何值的概率分布是連續(xù)的隨機(jī)變量。 位置(loc)關(guān)鍵字指定平均值。 比例(scale)關(guān)鍵字指定標(biāo)準(zhǔn)偏差。
作為rv_continuous類(lèi)的一個(gè)實(shí)例,規(guī)范對(duì)象從中繼承了一系列泛型方法,并通過(guò)特定于此特定分發(fā)的細(xì)節(jié)完成它們。
要計(jì)算多個(gè)點(diǎn)的CDF,可以傳遞一個(gè)列表或一個(gè)NumPy數(shù)組。 看看下面的一個(gè)例子。
from scipy.stats import norm
import numpy as np
cdfarr=norm.cdf(np.array([1,-1.,0,1,3,4,-2,6]))
print(cdfarr)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([ 0.84134475, 0.15865525, 0.5 , 0.84134475, 0.9986501 ,
0.99996833, 0.02275013, 1. ])
要查找分布的中位數(shù),可以使用百分點(diǎn)函數(shù)(PPF),它是CDF的倒數(shù)。 可通過(guò)使用下面的例子來(lái)理解。
from scipy.stats import norm
ppfvar=norm.ppf(0.5)
print(ppfvar)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
0.0
要生成隨機(jī)變量序列,應(yīng)該使用size參數(shù),如下例所示。
from scipy.stats import norm
rvsvar=norm.rvs(size=5)
print(rvsvar)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[-0.25993892 1.46653546 -0.53932984 -1.22796601 0.06542478]
上述輸出不可重現(xiàn)。 要生成相同的隨機(jī)數(shù),請(qǐng)使用seed()函數(shù)。
13.2 均勻分布
使用統(tǒng)一函數(shù)可以生成均勻分布。 參考下面的一個(gè)例子。
from scipy.stats import uniform
cvar=uniform.cdf([0,1,2,3,4,5],loc=1,scale=4)
print(cvar)
上述程序?qū)⑸梢韵螺敵?-
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
構(gòu)建離散分布
生成隨機(jī)樣本,并將觀察到的頻率與概率進(jìn)行比較。
二項(xiàng)分布
作為rv_discrete類(lèi)的一個(gè)實(shí)例,binom對(duì)象從它繼承了一個(gè)泛型方法的集合,并通過(guò)特定于這個(gè)特定分布的細(xì)節(jié)完成它們。 參考下面的例子。
from scipy.stats import uniform
cvar=uniform.cdf([0,1,2,3,4,5],loc=1,scale=4)
print(cvar)
上述程序?qū)⑸梢韵螺敵?-
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
13.3 描述性統(tǒng)計(jì)
如Min,Max,Mean和Variance等基本統(tǒng)計(jì)數(shù)據(jù)將NumPy數(shù)組作為輸入并返回相應(yīng)的結(jié)果。 下表描述了scipy.stats包中的一些基本統(tǒng)計(jì)函數(shù)。
其中幾個(gè)函數(shù)在scipy.stats.mstats中有一個(gè)類(lèi)似的版本,它們用于掩碼數(shù)組。 參考下面給出的例子來(lái)理解這一點(diǎn)。
from scipy import stats
import numpy as np
x=np.array([1,2,3,4,5,6,7,8,9])
print(x.max(),x.min(),x.mean(),x.var())
上述程序?qū)⑸梢韵螺敵?-
(9, 1, 5.0, 6.666666666666667)
T-檢驗(yàn)
下面了解T檢驗(yàn)在SciPy中是如何有用的。
ttest_1samp
計(jì)算一組分?jǐn)?shù)平均值的T檢驗(yàn)。 這是對(duì)零假設(shè)的雙面檢驗(yàn),即獨(dú)立觀測(cè)值'a'樣本的期望值(平均值)等于給定總體均值popmean,考慮下面的例子。
from scipy import stats
rvs=stats.norm.rvs(loc=5,scale=10,size=(50,2))
sta=stats.ttest_1samp(rvs,5.0)
print(sta)
上述程序?qū)⑸梢韵螺敵?-
Ttest_1sampResult(statistic = array([-1.40184894, 2.70158009]),
pvalue = array([ 0.16726344, 0.00945234]))
比較兩個(gè)樣本
在下面的例子中,有兩個(gè)樣本可以來(lái)自相同或不同的分布,想要測(cè)試這些樣本是否具有相同的統(tǒng)計(jì)特性。
ttest_ind- 計(jì)算兩個(gè)獨(dú)立樣本得分的T檢驗(yàn)。 對(duì)于兩個(gè)獨(dú)立樣本具有相同平均(預(yù)期)值的零假設(shè),這是一個(gè)雙側(cè)檢驗(yàn)。 該測(cè)試假設(shè)人口默認(rèn)具有相同的差異。
如果觀察到來(lái)自相同或不同人群的兩個(gè)獨(dú)立樣本,可以使用這個(gè)測(cè)試。參考下面的例子。
from scipy import stats
rvs1=stats.norm.rvs(loc=5,scale=10,size=500)
rvs2=stats.norm.rvs(loc=5,scale=10,size=500)
print(stats.ttest_ind(rvs1,rvs2))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Ttest_indResult(statistic = -0.67406312233650278, pvalue = 0.50042727502272966)
可以使用相同長(zhǎng)度的新數(shù)組進(jìn)行測(cè)試,但具有不同的含義。 在loc中使用不同的值并測(cè)試相同的值。
14. Scipy CSGraph
14.1 圖表示
首先,讓我們了解一個(gè)稀疏圖是什么以及它在圖表示中的作用。
稀疏圖是什么?
圖只是節(jié)點(diǎn)的集合,它們之間有鏈接。 圖幾乎可以代表任何事物 - 社交網(wǎng)絡(luò)連接,每個(gè)節(jié)點(diǎn)都是一個(gè)人,并且與熟人相連; 圖像,其中每個(gè)節(jié)點(diǎn)是像素并連接到相鄰像素; 指向一個(gè)高維分布,其中每個(gè)節(jié)點(diǎn)連接到最近的鄰居; 實(shí)際上你可以想象的任何其他東西。
表示圖形數(shù)據(jù)的一種非常有效的方式是在一個(gè)稀疏矩陣中: 假設(shè)名稱(chēng)為G。矩陣G的大小為N×N,并且G[i,j]給出節(jié)點(diǎn)'i'和節(jié)點(diǎn)之間的連接的值'J'。 稀疏圖形包含大部分零 - 也就是說(shuō),大多數(shù)節(jié)點(diǎn)只有幾個(gè)連接。
在scikit-learn中使用的幾種算法激發(fā)了稀疏圖子模塊的創(chuàng)建,其中包括以下內(nèi)容 -
Isomap - 流形學(xué)習(xí)算法,需要在圖中找到最短路徑。
分層聚類(lèi) - 基于最小生成樹(shù)的聚類(lèi)算法。
譜分解 - 基于稀疏圖拉普拉斯算子的投影算法。
作為一個(gè)具體的例子,假設(shè)想要表示以下無(wú)向圖 -
該圖有三個(gè)節(jié)點(diǎn),其中節(jié)點(diǎn)0和1通過(guò)權(quán)重2的邊連接,節(jié)點(diǎn)0和2通過(guò)權(quán)重1的邊連接。可以構(gòu)造如下例所示的稠密,蒙板和稀疏表示,無(wú)向圖由對(duì)稱(chēng)矩陣表示。
G_dense=np.array([[0,2,1],[2,0,0],[1,0,0]])
G_masked=np.ma.masked_values(G_dense,0)
from scipy.sparse import csr_matrix
G_sparse=csr_matrix(G_dense)
print(G_sparse.data)
上述程序?qū)⑸梢韵螺敵?-
array([2, 1, 2, 1])
這與前面的圖相同,只是節(jié)點(diǎn)0和2通過(guò)零權(quán)重的邊連接。 在這種情況下,上面的稠密表示會(huì)導(dǎo)致含糊不清 - 如果零是一個(gè)有意義的值,那么如何表示非邊緣。 在這種情況下,必須使用蒙版或稀疏表示來(lái)消除歧義。
from scipy.sparse.csgraph import csgraph_from_dense
G2_data=np.array([[np.inf,2,0],[2,np.inf,np.inf],[0,np.inf,np.inf]])
G2_sparse=csgraph_from_dense(G2_data,null_value=np.inf)
print(G2_sparse.data)
上述程序?qū)⑸梢韵螺敵?-
array([ 2., 0., 2., 0.])
使用稀疏圖的詞梯子
詞梯是劉易斯卡羅爾發(fā)明的游戲,其中單詞通過(guò)在每一步更改單個(gè)字母而鏈接在一起。 例如 -
APE → APT → AIT → BIT → BIG → BAG → MAG → MAN
在這里,分七步從“APE”到“MAN”,每次更換一個(gè)字母。 問(wèn)題是 - 我們能否使用相同的規(guī)則在這些詞之間找到更短的路徑? 這個(gè)問(wèn)題自然表示為一個(gè)稀疏圖形問(wèn)題。 節(jié)點(diǎn)將對(duì)應(yīng)于單個(gè)單詞,并且將創(chuàng)建最多不超過(guò)一個(gè)字母的單詞之間的連接。
14.2 獲取單詞列表
首先,當(dāng)然,我們必須獲得有效的單詞列表。如果使用Mac,并且Mac在以下代碼塊中給出的位置具有單詞字典。 如果在其它的架構(gòu)上,可能需要搜索一下才能找到你的系統(tǒng)字典。
wordlist=open('/usr/share/dict/words').read().split()
print(len(wordlist))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
205882
現(xiàn)在想看長(zhǎng)度為3的單詞,選擇正確長(zhǎng)度的單詞。 還將消除以大寫(xiě)字母(專(zhuān)有名詞)開(kāi)頭的單詞或包含撇號(hào)和連字符等非字母數(shù)字字符的單詞。 最后,確保一切都是小寫(xiě)的,以便稍后進(jìn)行比較。
word_list=[word for word in word_list if len(word)==3]
word_list=[word for word in word_list if word[0].islower()]
word_list=[word for word in word_list if word.isalpha()]
word_list=map(str.lower,word_list)
print(len(word_list))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
1185
現(xiàn)在,列出了1185個(gè)有效的三個(gè)字母的單詞(確切的數(shù)字可能會(huì)根據(jù)所使用的特定列表而變化)。 這些單詞中的每一個(gè)都將成為圖中的一個(gè)節(jié)點(diǎn),我們將創(chuàng)建連接與每對(duì)單詞關(guān)聯(lián)的節(jié)點(diǎn)的邊,這些節(jié)點(diǎn)之間的差異只有一個(gè)字母。
import numpy as np
word_list=np.asarray(word_list)
word_list.dtype
word_list.sort()
word_bytes=np.ndarray((word_list.size,word_list.itemsize),
dtype='int8',
buffer=word_list.data)
print(word_bytes.shape)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
(1185,3)
我們將使用每個(gè)點(diǎn)之間的漢明距離來(lái)確定連接哪些單詞對(duì)。 漢明距離度量?jī)蓚€(gè)向量之間的條目分?jǐn)?shù),它們不同:漢明距離等于1/N1/N的任何兩個(gè)單詞,其中NN是單詞階梯中連接的字母數(shù)。
from scipy.spatial.distance import pdist,squareform
from scipy.sparse import csr_matrix
hamming_dist=pdist(word_bytes,metric='hamming')
graph=csr_matrix(squareform(hamming_dist<1.5/word_list.itemsize))
比較距離時(shí),不使用相等性,因?yàn)檫@對(duì)于浮點(diǎn)值可能不穩(wěn)定。 只要字表中沒(méi)有兩個(gè)條目是相同的,不平等就會(huì)產(chǎn)生所需的結(jié)果。 現(xiàn)在,圖形已經(jīng)建立,我們將使用最短路徑搜索來(lái)查找圖形中任何兩個(gè)單詞之間的路徑。
i1=word_list.searchsorted('ape')
i2=word_list.searchsorted('man')
print(word_list[i1],word_list[i2])
執(zhí)行上面示例代碼,得到以下結(jié)果 -
ape, man
我們需要檢查它們是否匹配,因?yàn)槿绻麊卧~不在列表中,輸出中會(huì)有錯(cuò)誤。 現(xiàn)在,需要在圖中找到這兩個(gè)索引之間的最短路徑。使用dijkstra算法,因?yàn)樗軌驗(yàn)橐粋€(gè)節(jié)點(diǎn)找到路徑。
from scipy.sparse.csgraph import dijkstra
distances,predecessors=dijkstra(graph,indices=i1,return_predecessors=True)
print(distances[i2])
執(zhí)行上面示例代碼,得到以下結(jié)果 -
5.0
因此,我們看到ape和man之間的最短路徑只包含五個(gè)步驟。可以使用算法返回的前輩來(lái)重構(gòu)這條路徑。
path=[]
i=i2
whilei!=i1:
path.append(word_list[i])
i=predecessors[i]
path.append(word_list[i1])
print(path[::-1]i2])
上述程序?qū)⑸梢韵螺敵?-
['ape', 'ope', 'opt', 'oat', 'mat', 'man']
15. Scipy空間
scipy.spatial包可以通過(guò)利用Qhull庫(kù)來(lái)計(jì)算一組點(diǎn)的三角剖分,Voronoi圖和凸殼。 此外,它包含用于最近鄰點(diǎn)查詢的KDTree實(shí)現(xiàn)以及用于各種度量中的距離計(jì)算的實(shí)用程序。
15.1 Delaunay三角
下面來(lái)了解Delaunay Triangulations是什么以及如何在SciPy中使用。
什么是Delaunay三角?
在數(shù)學(xué)和計(jì)算幾何中,對(duì)于平面中離散點(diǎn)的給定集合P的Delaunay三角剖分是三角形DT(P),使得P中的任何點(diǎn)都不在DT(P)中的任何三角形的外接圓內(nèi)。
可以通過(guò)SciPy進(jìn)行相同的計(jì)算。 參考下面的一個(gè)例子。
from scipy.spatial import Delaunay
points=np.array([[0,4],[2,1.1],[1,3],[1,2]])
tri=Delaunay(points)
import matplotlib.pyplot as plt
plt.triplot(points[:,0],points[:,1],tri.simplices.copy())
plt.plot(points[:,0],points[:,1],'o')
plt.show()
上述程序?qū)⑸梢韵螺敵?-
15.2 共面點(diǎn)
下面了解共面點(diǎn)是什么以及它們?nèi)绾卧赟ciPy中使用。
什么是共面點(diǎn)?
共平面點(diǎn)是三個(gè)或更多點(diǎn)位于同一平面上。 回想一下,一個(gè)平面是平坦的表面,其在所有方向端延伸沒(méi)有終點(diǎn)。 它通常在數(shù)學(xué)教科書(shū)中顯示為四面體。
下面來(lái)看看如何在SciPy中使用它,參考下面的例子。
from scipy.spatial import Delaunay
points=np.array([[0,0],[0,1],[1,0],[1,1],[1,1]])
tri=Delaunay(points)
print(tri.coplanar)
上述程序?qū)⑸梢韵螺敵?-
array([[4, 0, 3]], dtype = int32)
這意味著頂點(diǎn)4位于三角形頂點(diǎn)0和頂點(diǎn)3附近,但不包含在三角中。
15.3 凸殼
下面來(lái)了解什么是凸殼,以及它們?nèi)绾卧赟ciPy中使用。
什么是凸殼?
在數(shù)學(xué)中,歐幾里德平面或歐幾里德空間(或更一般地說(shuō),在實(shí)數(shù)上的仿射空間中)中的一組點(diǎn)X的凸包或凸包是包含X的最小凸集。
參考下面的例子來(lái)詳細(xì)了解它 -
from scipy.spatial import ConvexHull
points=np.random.rand(10,2) # 30 random points in 2-D
hull=ConvexHull(points)
import matplotlib.pyplot as plt
plt.plot(points[:,0],points[:,1],'o')
for simplex in hull.simplices:
plt.plot(points[simplex,0],points[simplex,1],'k-')
plt.show()
參考:https://docs.python.org/3/
https://www.yiibai.com/scipy/scipy_introduction.html
總結(jié)
以上是生活随笔為你收集整理的scipy安装_4. Python--Scipy库(下/13-17)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c 语言车牌识别系统课题设计,基于图像的
- 下一篇: QR码与DM码的区别