『壹』 如何用python寫 數據分析工具
數據導入
導入本地的或者web端的CSV文件;
數據變換;
數據統計描述;
假設檢驗
單樣本t檢驗;
可視化;
創建自定義函數。
數據導入
這是很關鍵的一步,為了後續的分析我們首先需要導入數據。通常來說,數據是CSV格式,就算不是,至少也可以轉換成CSV格式。在Python中,我們的操作如下:
Python
1
2
3
4
5
6
7
8
import pandas as pd
# Reading data locally
df = pd.read_csv('/Users/al-ahmadgaidasaad/Documents/d.csv')
# Reading data from web
data_url = "t/Analysis-with-Programming/master/2014/Python/Numerical-Descriptions-of-the-Data/data.csv"
df = pd.read_csv(data_url)
為了讀取本地CSV文件,我們需要pandas這個數據分析庫中的相應模塊。其中的read_csv函數能夠讀取本地和web數據。
數據變換
既然在工作空間有了數據,接下來就是數據變換。統計學家和科學家們通常會在這一步移除分析中的非必要數據。我們先看看數據:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Head of the data
print df.head()
# OUTPUT
0 12432934148330010553
1 41589235 4287806335257
2 17871922 19551074 4544
317152 14501 3536 1960731687
4 12662385 25303315 8520
# Tail of the data
print df.tail()
# OUTPUT
74 2505 20878 3519 1973716513
7560303 40065 7062 1942261808
76 63116756 3561 1591023349
7713345 38902 2583 1109668663
78 2623 18264 3745 1678716900
對R語言程序員來說,上述操作等價於通過print(head(df))來列印數據的前6行,以及通過print(tail(df))來列印數據的後6行。當然Python中,默認列印是5行,而R則是6行。因此R的代碼head(df, n = 10),在Python中就是df.head(n = 10),列印數據尾部也是同樣道理。
在R語言中,數據列和行的名字通過colnames和rownames來分別進行提取。在Python中,我們則使用columns和index屬性來提取,如下:
Python
1
2
3
4
5
6
7
8
9
10
11
# Extracting column names
print df.columns
# OUTPUT
Index([u'Abra', u'Apayao', u'Benguet', u'Ifugao', u'Kalinga'], dtype='object')
# Extracting row names or the index
print df.index
# OUTPUT
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78], dtype='int64')
數據轉置使用T方法,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Transpose data
print df.T
# OUTPUT
01 23 45 67 89
Abra1243 41581787171521266 5576 927215401039 5424
Apayao2934 92351922145012385 7452109917038138210588
Benguet148 42871955 353625307712796 24632592 1064
Ifugao3300
... 69 70 71 72 73 74 75 76 77
Abra ...12763 247059094 620913316 250560303 631113345
Apayao ...376251953235126 6335386132087840065 675638902
Benguet... 2354 4045 5987 3530 2585 3519 7062 3561 2583
Ifugao ... 9838171251894015560 774619737194221591011096
Kalinga...
78
Abra2623
Apayao 18264
Benguet 3745
Ifugao 16787
Kalinga16900
Other transformations such as sort can be done using<code>sort</code>attribute. Now let's extract a specific column. In Python, we do it using either<code>iloc</code>or<code>ix</code>attributes, but<code>ix</code>is more robust and thus I prefer it. Assuming we want the head of the first column of the data, we have
其他變換,例如排序就是用sort屬性。現在我們提取特定的某列數據。Python中,可以使用iloc或者ix屬性。但是我更喜歡用ix,因為它更穩定一些。假設我們需數據第一列的前5行,我們有:
Python
1
2
3
4
5
6
7
8
9
print df.ix[:, 0].head()
# OUTPUT
0 1243
1 4158
2 1787
317152
4 1266
Name: Abra, dtype: int64
順便提一下,Python的索引是從0開始而非1。為了取出從11到20行的前3列數據,我們有:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print df.ix[10:20, 0:3]
# OUTPUT
AbraApayaoBenguet
109811311 2560
1127366 15093 3039
12 11001701 2382
13 7212 11001 1088
14 10481427 2847
1525679 15661 2942
16 10552191 2119
17 54376461734
18 10291183 2302
1923710 12222 2598
20 10912343 2654
上述命令相當於df.ix[10:20, ['Abra', 'Apayao', 'Benguet']]。
為了舍棄數據中的列,這里是列1(Apayao)和列2(Benguet),我們使用drop屬性,如下:
Python
1
2
3
4
5
6
7
8
9
print df.drop(df.columns[[1, 2]], axis = 1).head()
# OUTPUT
AbraIfugaoKalinga
0 1243330010553
1 4158806335257
2 17871074 4544
317152 1960731687
4 12663315 8520
axis參數告訴函數到底舍棄列還是行。如果axis等於0,那麼就舍棄行。
統計描述
下一步就是通過describe屬性,對數據的統計特性進行描述:
Python
1
2
3
4
5
6
7
8
9
10
11
12
print df.describe()
# OUTPUT
AbraApayaoBenguetIfugao Kalinga
count 79.000000 79.00000079.000000 79.000000 79.000000
mean 12874.37974716860.6455703237.39240512414.62025330446.417722
std16746.46694515448.1537941588.536429 5034.28201922245.707692
min927.000000401.000000 148.000000 1074.000000 2346.000000
25% 1524.000000 3435.5000002328.000000 8205.000000 8601.500000
50% 5790.00000010588.0000003202.00000013044.00000024494.000000
75%13330.50000033289.0000003918.50000016099.50000052510.500000
max60303.00000054625.0000008813.00000021031.00000068663.000000
假設檢驗
Python有一個很好的統計推斷包。那就是scipy裡面的stats。ttest_1samp實現了單樣本t檢驗。因此,如果我們想檢驗數據Abra列的稻穀產量均值,通過零假設,這里我們假定總體稻穀產量均值為15000,我們有:
Python
1
2
3
4
5
6
7
from scipy import stats as ss
# Perform one sample t-test using 1500 as the true mean
print ss.ttest_1samp(a = df.ix[:, 'Abra'], popmean = 15000)
# OUTPUT
(-1.1281738488299586, 0.26270472069109496)
返回下述值組成的元祖:
t : 浮點或數組類型
t統計量
prob : 浮點或數組類型
two-tailed p-value 雙側概率值
通過上面的輸出,看到p值是0.267遠大於α等於0.05,因此沒有充分的證據說平均稻穀產量不是150000。將這個檢驗應用到所有的變數,同樣假設均值為15000,我們有:
Python
1
2
3
4
5
6
print ss.ttest_1samp(a = df, popmean = 15000)
# OUTPUT
(array([ -1.12817385, 1.07053437, -65.81425599,-4.564575, 6.17156198]),
array([2.62704721e-01, 2.87680340e-01, 4.15643528e-70,
1.83764399e-05, 2.82461897e-08]))
第一個數組是t統計量,第二個數組則是相應的p值。
可視化
Python中有許多可視化模塊,最流行的當屬matpalotlib庫。稍加提及,我們也可選擇bokeh和seaborn模塊。之前的博文中,我已經說明了matplotlib庫中的盒須圖模塊功能。
;
重復100次; 然後
計算出置信區間包含真實均值的百分比
Python中,程序如下:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import scipy.stats as ss
def case(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
m = np.zeros((rep, 4))
for i in range(rep):
norm = np.random.normal(loc = mu, scale = sigma, size = n)
xbar = np.mean(norm)
low = xbar - ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
up = xbar + ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
if (mu > low) & (mu < up):
rem = 1
else:
rem = 0
m[i, :] = [xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are " + str(inside) + " confidence intervals that contain "
"the true mean (" + str(mu) + "), that is " + str(per) + " percent of the total CIs"
return {"Matrix": m, "Decision": desc}
上述代碼讀起來很簡單,但是循環的時候就很慢了。下面針對上述代碼進行了改進,這多虧了Python專家,看我上篇博文的15條意見吧。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import scipy.stats as ss
def case2(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
scaled_crit = ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
norm = np.random.normal(loc = mu, scale = sigma, size = (rep, n))
xbar = norm.mean(1)
low = xbar - scaled_crit
up = xbar + scaled_crit
rem = (mu > low) & (mu < up)
m = np.c_[xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are " + str(inside) + " confidence intervals that contain "
"the true mean (" + str(mu) + "), that is " + str(per) + " percent of the total CIs"
return {"Matrix": m, "Decision": desc}
更新
那些對於本文ipython notebook版本感興趣的,請點擊這里。這篇文章由Nuttens Claude負責轉換成ipython notebook 。
『貳』 python可視化界面怎麼做
本文所演示的的可視化方法
散點圖(Scatterplot)
直方圖(Histogram)
小提琴圖(Violinplot)
特徵兩兩對比圖(Pairplot)
安德魯斯曲線(Andrewscurves)
核密度圖(Kerneldensityestimationplot)
平行坐標圖(Parallelcoordinates)
Radviz(力矩圖?)
熱力圖(Heatmap)
氣泡圖(Bubbleplot)
這里主要使用Python一個流行的作圖工具:Seabornlibrary,同時Pandas和bubbly輔助。為什麼Seaborn比較好?
因為很多時候數據分析,建模前,都要清洗數據,清洗後數據的結果總要有個格式,我知道的最容易使用,最方便輸入模型,最好畫圖的格式叫做"TidyData"(WickhamH.Tidydata[J].JournalofStatisticalSoftware,2014,59(10):1-23.)其實很簡單,TidyData格式就是:
每條觀察(記錄)自己佔一行
觀察(記錄)的每個特徵自己佔一列
舉個例子,我們即將作圖的數據集IRIS就是TidyData(IRIS(IRIS數據集)_網路):
Iris數據集是常用的分類實驗數據集,由Fisher,1936收集整理。Iris也稱鳶尾花卉數據集,是一類多重變數分析的數據集。數據集包含150個數據集,分為3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。
該數據集包含了5個屬性:
Sepal.Length(花萼長度),單位是cm;
Sepal.Width(花萼寬度),單位是cm;
Petal.Length(花瓣長度),單位是cm;
Petal.Width(花瓣寬度),單位是cm;
種類:IrisSetosa(山鳶尾)、IrisVersicolour(雜色鳶尾),以及IrisVirginica(維吉尼亞鳶尾)。
IRIS數據可以看到,每條觀察(ID=0,1,2...)自己佔一行,每個特徵(四個部位長/寬度,種類)自己佔一列。Seaborn就是為TidyData設計的,所以方便使用。
所以這個數據集有6列,6個特徵,很多時候做可視化就是為了更好的了解數據,比如這里就是想看每個種類的花有什麼特點,怎麼樣根據其他特徵把花分為三類。我個人的喜好是首先一張圖盡量多的包含數據點,展示數據信息,從中發現規律。我們可以利用以下代碼完全展示全部維度和數據這里用的bubbly:
三維圖,全局觀察Python做出來,其實是一張可以拖動角度,放大縮小的圖,拖一拖看各角度視圖會發現三類還是分的挺明顯的。Github上這個bubbly還是很厲害的,方便。
接下來開始做一些基礎的可視化,沒有用任何修飾,代碼只有最關鍵的畫圖部分,可視化作賣敬悄為比賽的一個基礎和開端,個人理解做出的圖能看就行,美不美無所謂,不美也不扣分。因為
散點圖,可以得到相關性等信息,比如基本上SepalLengthCm越大,SepalWidthCm越大
散點圖使用Jointplot,看兩個變數的分布,KDE圖,同時展示對應的數據點
就像上一篇說的,比賽中的每個環節都稿則至關重要,很有必要看下這些分布直方圖,kde圖,根據這些來處理異常值等,這里請教,為什麼畫了直方圖還要畫KDE??我理解說的都是差不多的東西。
關於KDE:"由於核密度估計方法不利用有關數據分布的先驗知識,對數據分布不附加任何假定,是一種從數據樣本本身出發研究數據分布特徵的方法,因而,在統計學理論和應用領域均受到高度的重視。"
無論如何,我們先畫直方圖,再畫KDE
直方圖KDE圖這里通過KDE可以說,由於Setosa的KDE與其他兩種沒有交集,直接可以用Petailength線性區分Setosa與其他兩個物種。
Pairplot箱線圖,顯示一組數據分散情況的統計圖。形狀如箱子。主要用於反映原始數據分布的特徵,關鍵的5個黑線是最中渣大值、最小值、中位數和兩個四分位數。在判斷異常值,處理異常值時候有用。
BoxPlot小提琴圖
Violinplot這個Andrewscurves很有趣,它是把所有特徵組合起來,計算個值,展示該值,可以用來確認這三個物種到底好不好區分,維基網路的說法是「Ifthereisstructureinthedata,itmaybevisibleintheAndrews'curvesofthedata.」(Andrewsplot-Wikipedia)
Andrews&amp;#39;curvesradvizRadviz可視化原理是將一系列多維空間的點通過非線性方法映射到二維空間的可視化技術,是基於圓形平行坐標系的設計思想而提出的多維可視化方法。圓形的m條半徑表示m維空間,使用坐標系中的一點代表多為信息對象,其實現原理參照物理學中物體受力平衡定理。多維空間的點映射到二維可視空間的位置由彈簧引力分析模型確定。(Radviz可視化原理-CSDN博客),能展示一些數據的可區分規律。
數值是皮爾森相關系數,淺顏色表示相關性高,比如Petal.Length(花瓣長度)與Petal.Width(花瓣寬度)相關性0.96,也就是花瓣長的花,花瓣寬度也大,也就是個大花。
不過,現在做可視化基本上不用python了,具體為什麼可以去看我的寫的文章,我拿python做了爬蟲,BI做了可視化,效果和速度都很好。
finereport
可視化的一大應用就是數據報表,而FineReport可以自由編寫整合所需要的報表欄位進行報表輸出,支持定時刷新和監控郵件提醒,是大部分互聯網公司會用到的日常報表平台。
尤其是公司體系內經營報表,我們用的是商業報表工具,就是finereport。推薦他是因為有兩個高效率的點:①可以完成從資料庫取數(有整合數據功能)—設計報表模板—數據展示的過程。②類似excel做報表,一張模板配合參數查詢可以代替幾十張報表。
FineBI
簡潔明了的數據分析工具,也是我個人最喜歡的可視化工具,優點是零代碼可視化、可視化圖表豐富,只需要拖拖拽拽就可以完成十分炫酷的可視化效果,擁有數據整合、可視化數據處理、探索性分析、數據挖掘、可視化分析報告等功能,更重要的是個人版免費。
主要優點是可以實現自助式分析,而且學習成本極低,幾乎不需要太深奧的編程基礎,比起很多國外的工具都比較易用上手,非常適合經常業務人員和運營人員。在綜合性方面,FineBI的表現比較突出,不需要編程而且簡單易做,能夠實現平台展示,比較適合企業用戶和個人用戶,在數據可視化方面是一個不錯的選擇;
這些是我見過比較常用的,對數據探索有幫助的可視化方法。
這個非常簡單,PyQt就可以輕松實現,一個基於Qt的介麵包,可以直接拖拽控制項設計UI界面,下面我簡單介紹一下這個包的安裝和使用,感興趣的朋友可以自己嘗試一下:
1.首先,安裝PyQt模塊,這個直接在cmd窗口輸入命令「pipinstallpyqt5」就行,如下,整個模塊比較大,下載過程需要等待一會兒,保持聯網:
2.安裝完成後,我們就可以直接打開Qt自帶的QtDesigner設計師設計界面了,這里默認會安裝到site-packages->PyQt5->Qt->bin目錄,打開後的界面如下,可以直接新建對話框等窗口,所有的控制項都可以直接拖拽,編輯屬性,非常方便:
3.這里我簡單的設計了一個登錄窗口,2個輸入框和2個按鈕,如下,這里可以直接使用QSS對界面進行美化(設置styleSheet屬性即可),類似網頁的CSS,如果你有一定的前端基礎,那麼美化起來會非常容易:
設計完成後,還只是一個ui文件,不是現成的Python代碼,還需要藉助pyuic5工具(也在bin目錄下)才能將ui文件轉化為Python代碼,切換到ui文件所在目錄,輸入命令「pyuic5-ologin.pylogin.ui」即可(這里替換成你的ui文件),轉化成功後的Python代碼如下(部分截圖):
還需要在最下面添加一個main函數,創建上面Ui_Form類對象顯示窗口即可,如下:
最後點擊運行程序,效果如下,和剛才設計的界面效果一模一樣:
至此,我們就完成了利用Python的PyQt模塊直接拖拽控制項來設計UI界面。總的來說,整個過程非常簡單,只要你有一定的Python基礎,熟悉一下操作過程,很快就能掌握的,當然,還有許多其他UI開發模塊,像tkinter,wxPython,Eric6等,也都非常不錯,網上也有相關教程和資料,介紹的非常詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。
首先,如果沒有安裝python和PyQt軟體的請先直接搜索下載並安裝。python是一個開源軟體,因此都是可以在網上免費下載的,最新版本即可。下載完成後,我們先打開PyQtdesigner。
2
打開後,首先是一個默認的新建窗口界面,在這里我們就選擇默認的窗口即可。
3
現在是一個完全空白的窗口。第一步我們要先把所有的設計元素都拖進這個窗口。我們先拖入一個「Label」,就是一個不可編輯的標簽。
隨後我們再拖入一個可以編輯的「LineEdit」
最後我們拖入最後一個元素:「PushButton」按鈕,也就是平時我們所點的確定。
目前我們已經把所有所需要的元素都拖入了新建的窗口。對於每一個元素,我們都可以雙擊進行屬性值的修改,此時我們僅需要雙擊改個名字即可
此時我們已經完成了一半,接下來需要對動作信號進行操作。我們需要先切入編輯信號的模式
此時把滑鼠移動到任意元素,都會發現其變成紅色,代表其被選中。
當我們選中pushbutton後,繼續拖動滑鼠指向上面的lineedit,會發現由pushbutton出現一個箭頭指向了lineedit,代表pushbutton的動作會對lineedit進行操作。
隨即會彈出一個配置連接窗口。左邊的是pushbutton的操作,我們選擇clicked(),即點擊pushbutton。
右邊是對lineedit的操作,我們選擇clear(),即清楚lineedit中的內容。
最後我們點擊確定。
保存完成後,我們在PyQt中的操作就已經完成了。保存的文件名我們命名為test,PyQt生成的設計文件後綴是.ui。
『叄』 python的seaborn.kdeplot有什麼用
kde(kernel density estimation)是核密度估計。核的作用是根據離散采樣,估計連續密度分布。
如果原始采樣是《陰陽師》里的式神,那麼kernel(核函數)就相當於御魂。
假設現在有一系列離散變數X = [4, 5, 5, 6, 12, 14, 15, 15, 16, 17],可見5和15的概率密度應該要高一些,但具體有多高呢?有沒有三四層樓那麼高,有沒有華萊士高?如果要估計的是沒有出現過的3呢?這就要自己判斷了。
核函數就是給空間的每個離散點都套上一個連續分布。最簡單的核函數是Parzen窗,類似一個方波:
這時候單個離散點就可以變成區間,空間或者高維空間下的超立方,實質上是進行了升維。
設h=4,則3的概率密度為:
(只有4對應的核函數為1,其他皆為0)
kernel是非負實值對稱可積函數,表示為K,且一本滿足:
這樣才能保證cdf仍為1。
實際上應用最多的是高斯核函數(Gaussian Kernel),也就是標准正態分布。所謂核密度估計就是把所有離散點的核函數加起來,得到整體的概率密度分布。核密度估計在很多機器學習演算法中都有應用,比如K近鄰、K平均等。
在支持向量機里,也有「核」的概念,同樣也是給數據升維,最常用的還是高斯核函數,也叫徑向基函數(Radial Basis Funtion)。
seaborn.kdeplot內置了多種kerne,總有一款適合你。
『肆』 如何用python實現圖像的一維高斯濾波器
如何用python實現圖像的一維高斯濾波器
現在把卷積模板中的值換一下,不是全1了,換成一組符合高斯分布的數值放在模板裡面,比如這時中間的數值最大,往兩邊走越來越小,構造一個小的高斯包。實現的函數為cv2.GaussianBlur()。對於高斯模板,我們需要制定的是高斯核的高和寬(奇數),沿x與y方向的標准差(如果只給x,y=x,如果都給0,那麼函數會自己計算)。高斯核可以有效的出去圖像的高斯雜訊。當然也可以自己構造高斯核,相關函數:cv2.GaussianKernel().
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(『flower.jpg『,0) #直接讀為灰度圖像
for i in range(2000): #添加點雜訊
temp_x = np.random.randint(0,img.shape[0])
temp_y = np.random.randint(0,img.shape[1])
img[temp_x][temp_y] = 255
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(1,2,1),plt.imshow(img,『gray『)#默認彩色,另一種彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,『gray『)
『伍』 [譯] 高斯混合模型 --- python教程
本文翻譯自 https://jakevdp.github.io/PythonDataScienceHandbook/05.12-gaussian-mixtures.html
上一節中探討的k-means聚類模型簡單易懂,但其簡單性導致其應用中存在實際挑戰。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節,我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。
我們將以一個標準的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節所示,給定簡單,易於分類的數據,k-means能找到合適的聚類結果。
舉例而言,假設我們有些簡單的數據點,k-means演算法能以某種方式很快地將它們聚類,跟我們肉眼分辨的結果很接近:
從直觀的角度來看,我可能期望聚類分配時,某些點比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數據點的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內在度量(盡管可能使用bootstrap 的方式來估計這種不確定性)。為此,我們必須考慮泛化這種模型。
k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠的點確定。該半徑充當訓練集中聚類分配的一個硬截斷:任何圈外的數據點不被視為該類的成員。我們可以使用以下函數可視化這個聚類模型:
觀察k-means的一個重要發現,這些聚類模式必須是圓形的。k-means沒有內置的方法來計算橢圓形或橢圓形的簇。因此,舉例而言,假設我們將相同的數據點作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數據集。在最簡單的情況下,GMM可用於以與k-means相同的方式聚類。
但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調用predict_proba方法實現。它將返回一個大小為[n_samples, n_clusters]的矩陣,用於衡量每個點屬於給定類別的概率:
我們可以可視化這種不確定性,比如每個點的大小與預測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:
本質上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執行以下操作:
有了這個,我們可以看看四成分的GMM為我們的初始數據提供了什麼:
同樣,我們可以使用GMM方法來擬合我們的拉伸數據集;允許full的協方差,該模型甚至可以適應非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。
如果看了之前擬合的細節,你將看到covariance_type選項在每個中都設置不同。該超參數控制每個類簇的形狀的自由度;對於任意給定的問題,必須仔細設置。默認值為covariance_type =「diag」,這意味著可以獨立設置沿每個維度的類蔟大小,並將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =「spherical」,它約束了類簇的形狀,使得所有維度都相等。盡管它並不完全等效,其產生的聚類將具有與k均值相似的特徵。更復雜且計算量更大的模型(特別是隨著維數的增長)是使用covariance_type =「full」,這允許將每個簇建模為具有任意方向的橢圓。
對於一個類蔟,下圖我們可以看到這三個選項的可視化表示:
盡管GMM通常被歸類為聚類演算法,但從根本上說它是一種密度估算演算法。也就是說,GMM適合某些數據的結果在技術上不是聚類模型,而是描述數據分布的生成概率模型。
例如,考慮一下Scikit-Learn的make_moons函數生成的一些數據:
如果我們嘗試用視為聚類模型的雙成分的GMM模擬數據,則結果不是特別有用:
但是如果我們使用更多成分的GMM模型,並忽視聚類的類別,我們會發現更接近輸入數據的擬合:
這里,16個高斯分布的混合不是為了找到分離的數據簇,而是為了對輸入數據的整體分布進行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機數據的方法。例如,以下是從這個16分量GMM擬合到我們原始數據的400個新點:
GMM非常方便,可以靈活地建模任意多維數據分布。
GMM是一種生成模型這一事實為我們提供了一種確定給定數據集的最佳組件數的自然方法。生成模型本質上是數據集的概率分布,因此我們可以簡單地評估模型下數據的可能性,使用交叉驗證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標准來調整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計器實際上包含計算這兩者的內置方法,因此在這種方法上操作非常容易。
讓我們看看在moon數據集中,使用AIC和BIC函數確定GMM組件數量:
最佳的聚類數目是使得AIC或BIC最小化的值,具體取決於我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。
注意重點:這個組件數量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類演算法的效果。我鼓勵您將GMM主要視為密度估算器,並且只有在簡單數據集中保證時才將其用於聚類。
我們剛剛看到了一個使用GMM作為數據生成模型的簡單示例,以便根據輸入數據定義的分布創建新樣本。在這里,我們將運行這個想法,並從我們以前使用過的標准數字語料庫中生成新的手寫數字。
首先,讓我們使用Scikit-Learn的數據工具載入數字數據:
接下來讓我們繪制前100個,以准確回憶我們正在看的內容:
我們有64個維度的近1,800位數字,我們可以在這些位置上構建GMM以產生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數據上的可逆維數減少演算法開始。在這里,我們將使用一個簡單的PCA,要求它保留99%的預測數據方差:
結果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據這些預測數據,讓我們使用AIC來計算我們應該使用的GMM組件的數量:
似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數據擬合並確保它已收斂合:
現在我們可以使用GMM作為生成模型在這個41維投影空間內繪制100個新點的樣本:
最後,我們可以使用PCA對象的逆變換來構造新的數字:
大部分結果看起來像數據集中合理的數字!
考慮一下我們在這里做了什麼:給定一個手寫數字的樣本,我們已經模擬了數據的分布,這樣我們就可以從數據中生成全新的數字樣本:這些是「手寫數字」,不是單獨的出現在原始數據集中,而是捕獲混合模型建模的輸入數據的一般特徵。這種數字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節中看到。
『陸』 常用的生物信息學python庫有哪些
常用的生物信息學python庫:
Tkinter
Python默認的圖形界面介面。Tkinter是一個和Tk介面的Python模塊,Tkinter庫提供了對Tk API的介面,它屬於Tcl/Tk的GUI工具組。
PyGTK
用於python GUI程序開發的GTK+庫。GTK就是用來實現GIMP和Gnome的庫。
PyQt
用於python的Qt開發庫。QT就是實現了KDE環境的那個庫,由一系列的模塊組成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300個類和超過5750個的函數和方法。PyQt還支持一個叫qtext的模塊,它包含一個QScintilla庫。該庫是Scintillar編輯器類的Qt介面。
wxPython
GUI編程框架,熟悉MFC的人會非常喜歡,簡直是同一架構(對於初學者或者對設計要求不高的用戶來說,使用Boa Constructor可以方便迅速的進行wxPython的開發)
PIL
python提供強大的圖形處理的能力,並提供廣泛的圖形文件格式支持,該庫能進行圖形格式的轉換、列印和顯示。還能進行一些圖形效果的處理,如圖形的放大、縮小和旋轉等。是Python用戶進行圖象處理的強有力工具。
Psyco
一個Python代碼加速度器,可使Python代碼的執行速度提高到與編譯語言一樣的水平。
xmpppy
Jabber伺服器採用開發的XMPP協議,Google Talk也是採用XMPP協議的IM系統。在Python中有一個xmpppy模塊支持該協議。也就是說,我們可以通過該模塊與Jabber伺服器通信,是不是很Cool。
PyMedia
用於多媒體操作的python模塊。它提供了豐富而簡單的介面用於多媒體處理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。
Pmw
Python megawidgets,Python超級GUI組件集,一個在python中利用Tkinter模塊構建的高級GUI組件,每個Pmw都合並了一個或多個Tkinter組件,以實現更有用和更復雜的功能。
PyXML
用Python解析和處理XML文檔的工具包,包中的4DOM是完全相容於W3C DOM規范的。它包含以下內容:
xmlproc: 一個符合規范的XML解析器。Expat: 一個快速的,非驗證的XML解析器。還有其他和他同級別的還有 PyHtml PySGML。
PyGame
用於多媒體開發和游戲軟體開發的模塊。
PyOpenGL
模塊封裝了「OpenGL應用程序編程介面」,通過該模塊python程序員可在程序中集成2D和3D的圖形。
NumPy、NumArray、SAGE
NumArray是Python的一個擴展庫,主要用於處理任意維數的固定類型數組,簡單說就是一個矩陣庫。它的底層代碼使用C來編寫,所以速度的優勢很明顯。SAGE是基於NumPy和其他幾個工具所整合成的數學軟體包,目標是取代Magma, Maple, Mathematica和Matlab 這類工具。
MySQLdb
用於連接MySQL資料庫。還有用於zope的ZMySQLDA模塊,通過它就可在zope中連接mysql資料庫。
Sqlite3
用於連接sqlite資料庫。
Python-ldap
提供一組面向對象的API,可方便地在python中訪問ldap目錄服務,它基於OpenLDAP2.x。
smtplib
發送電子郵件。
ftplib
定義了FTP類和一些方法,用以進行客戶端的ftp編程。如果想了解ftp協議的詳細內容,請參考RFC959。
PyOpenCL
OpenCL的Python介面,通過該模塊可以使用GPU實現並行計算。
『柒』 python怎樣做高斯擬合
需要載入numpy和scipy庫,若需要做可視化還需要matplotlib(附加dateutil,pytz,pyparsing,cycler,setuptools庫)。不畫圖就只要前兩個。
如果沒有這些庫的話去 http://www.lfd.uci.e/~gohlke/pythonlibs/ 下載對應版本,之後解壓到 C:Python27Libsite-packages。
importnumpyasnp
importpylabasplt
#importmatplotlib.pyplotasplt
fromscipy.optimizeimportcurve_fit
fromscipyimportasarrayasar,exp
x=ar(range(10))
y=ar([0,1,2,3,4,5,4,3,2,1])
defgaussian(x,*param):
returnparam[0]*np.exp(-np.power(x-param[2],2.)/(2*np.power(param[4],2.)))+param[1]*np.exp(-np.power(x-param[3],2.)/(2*np.power(param[5],2.)))
popt,pcov=curve_fit(gaussian,x,y,p0=[3,4,3,6,1,1])
printpopt
printpcov
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaussian(x,*popt),'ro:',label='fit')
plt.legend()
plt.show()