真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

pythonbic函數(shù) python bif函數(shù)

[譯] 高斯混合模型 --- python教程

本文翻譯自

沙河網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

上一節(jié)中探討的k-means聚類模型簡單易懂,但其簡單性導致其應(yīng)用中存在實際挑戰(zhàn)。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節(jié),我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。

我們將以一個標準的import開始

我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節(jié)所示,給定簡單,易于分類的數(shù)據(jù),k-means能找到合適的聚類結(jié)果。

舉例而言,假設(shè)我們有些簡單的數(shù)據(jù)點,k-means算法能以某種方式很快地將它們聚類,跟我們?nèi)庋鄯直娴慕Y(jié)果很接近:

從直觀的角度來看,我可能期望聚類分配時,某些點比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數(shù)據(jù)點的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內(nèi)在度量(盡管可能使用bootstrap 的方式來估計這種不確定性)。為此,我們必須考慮泛化這種模型。

k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠的點確定。該半徑充當訓練集中聚類分配的一個硬截斷:任何圈外的數(shù)據(jù)點不被視為該類的成員。我們可以使用以下函數(shù)可視化這個聚類模型:

觀察k-means的一個重要發(fā)現(xiàn),這些聚類模式必須是圓形的。k-means沒有內(nèi)置的方法來計算橢圓形或橢圓形的簇。因此,舉例而言,假設(shè)我們將相同的數(shù)據(jù)點作變換,這種聚類分配方式最終變得混亂:

高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數(shù)據(jù)集。在最簡單的情況下,GMM可用于以與k-means相同的方式聚類。

但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調(diào)用predict_proba方法實現(xiàn)。它將返回一個大小為[n_samples, n_clusters]的矩陣,用于衡量每個點屬于給定類別的概率:

我們可以可視化這種不確定性,比如每個點的大小與預(yù)測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:

本質(zhì)上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執(zhí)行以下操作:

有了這個,我們可以看看四成分的GMM為我們的初始數(shù)據(jù)提供了什么:

同樣,我們可以使用GMM方法來擬合我們的拉伸數(shù)據(jù)集;允許full的協(xié)方差,該模型甚至可以適應(yīng)非常橢圓形,伸展的聚類模式:

這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。

如果看了之前擬合的細節(jié),你將看到covariance_type選項在每個中都設(shè)置不同。該超參數(shù)控制每個類簇的形狀的自由度;對于任意給定的問題,必須仔細設(shè)置。默認值為covariance_type =“diag”,這意味著可以獨立設(shè)置沿每個維度的類蔟大小,并將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =“spherical”,它約束了類簇的形狀,使得所有維度都相等。盡管它并不完全等效,其產(chǎn)生的聚類將具有與k均值相似的特征。更復雜且計算量更大的模型(特別是隨著維數(shù)的增長)是使用covariance_type =“full”,這允許將每個簇建模為具有任意方向的橢圓。

對于一個類蔟,下圖我們可以看到這三個選項的可視化表示:

盡管GMM通常被歸類為聚類算法,但從根本上說它是一種密度估算算法。也就是說,GMM適合某些數(shù)據(jù)的結(jié)果在技術(shù)上不是聚類模型,而是描述數(shù)據(jù)分布的生成概率模型。

例如,考慮一下Scikit-Learn的make_moons函數(shù)生成的一些數(shù)據(jù):

如果我們嘗試用視為聚類模型的雙成分的GMM模擬數(shù)據(jù),則結(jié)果不是特別有用:

但是如果我們使用更多成分的GMM模型,并忽視聚類的類別,我們會發(fā)現(xiàn)更接近輸入數(shù)據(jù)的擬合:

這里,16個高斯分布的混合不是為了找到分離的數(shù)據(jù)簇,而是為了對輸入數(shù)據(jù)的整體分布進行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機數(shù)據(jù)的方法。例如,以下是從這個16分量GMM擬合到我們原始數(shù)據(jù)的400個新點:

GMM非常方便,可以靈活地建模任意多維數(shù)據(jù)分布。

GMM是一種生成模型這一事實為我們提供了一種確定給定數(shù)據(jù)集的最佳組件數(shù)的自然方法。生成模型本質(zhì)上是數(shù)據(jù)集的概率分布,因此我們可以簡單地評估模型下數(shù)據(jù)的可能性,使用交叉驗證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標準來調(diào)整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計器實際上包含計算這兩者的內(nèi)置方法,因此在這種方法上操作非常容易。

讓我們看看在moon數(shù)據(jù)集中,使用AIC和BIC函數(shù)確定GMM組件數(shù)量:

最佳的聚類數(shù)目是使得AIC或BIC最小化的值,具體取決于我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。

注意重點:這個組件數(shù)量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類算法的效果。我鼓勵您將GMM主要視為密度估算器,并且只有在簡單數(shù)據(jù)集中保證時才將其用于聚類。

我們剛剛看到了一個使用GMM作為數(shù)據(jù)生成模型的簡單示例,以便根據(jù)輸入數(shù)據(jù)定義的分布創(chuàng)建新樣本。在這里,我們將運行這個想法,并從我們以前使用過的標準數(shù)字語料庫中生成新的手寫數(shù)字。

首先,讓我們使用Scikit-Learn的數(shù)據(jù)工具加載數(shù)字數(shù)據(jù):

接下來讓我們繪制前100個,以準確回憶我們正在看的內(nèi)容:

我們有64個維度的近1,800位數(shù)字,我們可以在這些位置上構(gòu)建GMM以產(chǎn)生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數(shù)據(jù)上的可逆維數(shù)減少算法開始。在這里,我們將使用一個簡單的PCA,要求它保留99%的預(yù)測數(shù)據(jù)方差:

結(jié)果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據(jù)這些預(yù)測數(shù)據(jù),讓我們使用AIC來計算我們應(yīng)該使用的GMM組件的數(shù)量:

似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數(shù)據(jù)擬合并確保它已收斂合:

現(xiàn)在我們可以使用GMM作為生成模型在這個41維投影空間內(nèi)繪制100個新點的樣本:

最后,我們可以使用PCA對象的逆變換來構(gòu)造新的數(shù)字:

大部分結(jié)果看起來像數(shù)據(jù)集中合理的數(shù)字!

考慮一下我們在這里做了什么:給定一個手寫數(shù)字的樣本,我們已經(jīng)模擬了數(shù)據(jù)的分布,這樣我們就可以從數(shù)據(jù)中生成全新的數(shù)字樣本:這些是“手寫數(shù)字”,不是單獨的出現(xiàn)在原始數(shù)據(jù)集中,而是捕獲混合模型建模的輸入數(shù)據(jù)的一般特征。這種數(shù)字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節(jié)中看到。

Python中幾個特殊的函數(shù)

1、 定義一個特殊的 __slots__ 變量,來限制該class實例能添加的屬性

2、 內(nèi)置的 @property(關(guān)鍵字) 裝飾器就是負責把一個方法變成屬性調(diào)用的。@property.setter(這里的property是類里面的屬性名)負責把一個setter方法變成屬性賦值。

3、 __str__(),__repr__(),__iter__(),__next__(),__getitem__(),__setitem__(),__delitem__(),__getattr__(),__call__()

Python基礎(chǔ)之常見內(nèi)建函數(shù)

map() 函數(shù)接受兩個參數(shù),一個是函數(shù),一個是可迭代對象(Iterable), map 將傳入的函數(shù)依次作用到可迭代對象的每一個元素,并把結(jié)果作為迭代器(Iterator)返回。

舉例說明,有一個函數(shù) f(x)=x^2 ,要把這個函數(shù)作用到一個list [1,2,3,4,5,6,7,8,9] 上:

運用簡單的循環(huán)可以實現(xiàn):

運用高階函數(shù) map() :

結(jié)果 r 是一個迭代器,迭代器是惰性序列,通過 list() 函數(shù)讓它把整個序列都計算出來并返回一個 list 。

如果要把這個list所有數(shù)字轉(zhuǎn)為字符串利用 map() 就簡單了:

小練習:利用 map() 函數(shù),把用戶輸入的不規(guī)范的英文名字變?yōu)槭鬃帜复髮懫渌懙囊?guī)范名字。輸入 ['adam', 'LISA', 'barT'] ,輸出 ['Adam', 'Lisa', 'Bart']

reduce() 函數(shù)也是接受兩個參數(shù),一個是函數(shù),一個是可迭代對象, reduce 將傳入的函數(shù)作用到可迭代對象的每個元素的結(jié)果做累計計算。然后將最終結(jié)果返回。

效果就是: reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

舉例說明,將序列 [1,2,3,4,5] 變換成整數(shù) 12345 :

小練習:編寫一個 prod() 函數(shù),可以接受一個 list 并利用 reduce 求積:

map() 和 reduce() 綜合練習:編寫 str2float 函數(shù),把字符串 '123.456' 轉(zhuǎn)換成浮點型 123.456

filter() 函數(shù)用于過濾序列, filter() 也接受一個函數(shù)和一個序列, filter() 把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是 True 還是 False 決定保留還是丟棄該元素。

舉例說明,刪除list中的偶數(shù):

小練習:用 filter() 求素數(shù)

定義一個篩選函數(shù):

定義一個生成器不斷返回下一個素數(shù):

打印100以內(nèi)素數(shù):

python內(nèi)置的 sorted() 函數(shù)可以對list進行排序:

sorted() 函數(shù)也是一個高階函數(shù),還可以接受一個 key 函數(shù)來實現(xiàn)自定義排序:

key 指定的函數(shù)將作用于list的每一個元素上,并根據(jù) key 函數(shù)返回的結(jié)果進行排序.

默認情況下,對字符串排序,是按照ASCII的大小比較的,由于'Z' 'a',結(jié)果,大寫字母Z會排在小寫字母a的前面。如果想忽略大小寫可都轉(zhuǎn)換成小寫來比較:

要進行反向排序,不必改動key函數(shù),可以傳入第三個參數(shù) reverse=True :

小練習:假設(shè)我們用一組tuple表示學生名字和成績: L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] 。用sorted()對上述列表分別按c成績從高到低排序:

運用匿名函數(shù)更簡潔:


網(wǎng)站欄目:pythonbic函數(shù) python bif函數(shù)
鏈接地址:http://weahome.cn/article/doggosd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部