需要載入numpy和scipy庫,若需要做可視化還需要matplotlib(附加dateutil,?pytz,?pyparsing,?cycler,?setuptools庫)。不畫圖就只要前兩個(gè)。
創(chuàng)新互聯(lián)專注于榕城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供榕城營(yíng)銷型網(wǎng)站建設(shè),榕城網(wǎng)站制作、榕城網(wǎng)頁設(shè)計(jì)、榕城網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務(wù),打造榕城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供榕城網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
如果沒有這些庫的話去 下載對(duì)應(yīng)版本,之后解壓到 C:\Python27\Lib\site-packages。
import?numpy?as?np??
import?pylab?as?plt??
#import?matplotlib.pyplot?as?plt??
from?scipy.optimize?import?curve_fit??
from?scipy?import?asarray?as?ar,exp??
x?=?ar(range(10))??
y?=?ar([0,1,2,3,4,5,4,3,2,1])??
def?gaussian(x,*param):??
return?param[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])??
print?popt??
print?pcov??
plt.plot(x,y,'b+:',label='data')??
plt.plot(x,gaussian(x,*popt),'ro:',label='fit')??
plt.legend()??
plt.show()
很多業(yè)務(wù)場(chǎng)景中,我們希望通過一個(gè)特定的函數(shù)來擬合業(yè)務(wù)數(shù)據(jù),以此來預(yù)測(cè)未來數(shù)據(jù)的變化趨勢(shì)。(比如用戶的留存變化、付費(fèi)變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項(xiàng)式擬合 和 自定義函數(shù)擬合。
通過多項(xiàng)式擬合,我們只需要指定想要擬合的多項(xiàng)式的最高項(xiàng)次是多少即可。
運(yùn)行結(jié)果:
對(duì)于自定義函數(shù)擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運(yùn)行結(jié)果:
擬合是用高斯函數(shù)系。 使用高斯函數(shù)來進(jìn)行擬合,優(yōu)點(diǎn)在于計(jì)算積分十分簡(jiǎn)單快捷擬合函數(shù):擬合就是把平面上一系列的點(diǎn),用一條光滑的曲線連接起來。因?yàn)檫@條曲線有無數(shù)種可能,從而有各種擬合方法。擬合的曲線一般可以用函數(shù)表示,根據(jù)這個(gè)函數(shù)的不同有不同的擬合名字,這就是擬合函數(shù)。
常用的擬合方法有如最小二乘曲線擬合法等,在MATLAB中也可以用polyfit 來擬合多項(xiàng)式。擬合以及插值還有逼近是數(shù)值分析的三大基礎(chǔ)工具。
通俗意義上它們的區(qū)別在于:擬合是已知點(diǎn)列,從整體上靠近它們;插值是已知點(diǎn)列并且完全經(jīng)過點(diǎn)列;逼近是已知曲線,或者點(diǎn)列,通過逼近使得構(gòu)造的函數(shù)無限靠近它們
本文翻譯自
上一節(jié)中探討的k-means聚類模型簡(jiǎn)單易懂,但其簡(jiǎn)單性導(dǎo)致其應(yīng)用中存在實(shí)際挑戰(zhàn)。具體而言,k-means的非概率特性及簡(jiǎn)單地計(jì)算點(diǎn)與類蔟中心的歐式距離來判定歸屬,會(huì)導(dǎo)致其在許多真實(shí)的場(chǎng)景中性能較差。本節(jié),我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個(gè)強(qiáng)有力的估計(jì)工具,而不僅僅是聚類。
我們將以一個(gè)標(biāo)準(zhǔn)的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節(jié)所示,給定簡(jiǎn)單,易于分類的數(shù)據(jù),k-means能找到合適的聚類結(jié)果。
舉例而言,假設(shè)我們有些簡(jiǎn)單的數(shù)據(jù)點(diǎn),k-means算法能以某種方式很快地將它們聚類,跟我們?nèi)庋鄯直娴慕Y(jié)果很接近:
從直觀的角度來看,我可能期望聚類分配時(shí),某些點(diǎn)比其他的更確定:舉例而言,中間兩個(gè)聚類之間似乎存在非常輕微的重疊,這樣我們可能對(duì)這些數(shù)據(jù)點(diǎn)的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內(nèi)在度量(盡管可能使用bootstrap 的方式來估計(jì)這種不確定性)。為此,我們必須考慮泛化這種模型。
k-means模型的一種理解思路是,它在每個(gè)類蔟的中心放置了一個(gè)圈(或者,更高維度超球面),其半徑由聚類中最遠(yuǎn)的點(diǎn)確定。該半徑充當(dāng)訓(xùn)練集中聚類分配的一個(gè)硬截?cái)啵喝魏稳ν獾臄?shù)據(jù)點(diǎn)不被視為該類的成員。我們可以使用以下函數(shù)可視化這個(gè)聚類模型:
觀察k-means的一個(gè)重要發(fā)現(xiàn),這些聚類模式必須是圓形的。k-means沒有內(nèi)置的方法來計(jì)算橢圓形或橢圓形的簇。因此,舉例而言,假設(shè)我們將相同的數(shù)據(jù)點(diǎn)作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個(gè)多維高斯概率分布的混合,以模擬任何輸入數(shù)據(jù)集。在最簡(jiǎn)單的情況下,GMM可用于以與k-means相同的方式聚類。
但因?yàn)镚MM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調(diào)用predict_proba方法實(shí)現(xiàn)。它將返回一個(gè)大小為[n_samples, n_clusters]的矩陣,用于衡量每個(gè)點(diǎn)屬于給定類別的概率:
我們可以可視化這種不確定性,比如每個(gè)點(diǎn)的大小與預(yù)測(cè)的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點(diǎn)反映了群集分配的不確定性:
本質(zhì)上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執(zhí)行以下操作:
有了這個(gè),我們可以看看四成分的GMM為我們的初始數(shù)據(jù)提供了什么:
同樣,我們可以使用GMM方法來擬合我們的拉伸數(shù)據(jù)集;允許full的協(xié)方差,該模型甚至可以適應(yīng)非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個(gè)主要實(shí)際問題。
如果看了之前擬合的細(xì)節(jié),你將看到covariance_type選項(xiàng)在每個(gè)中都設(shè)置不同。該超參數(shù)控制每個(gè)類簇的形狀的自由度;對(duì)于任意給定的問題,必須仔細(xì)設(shè)置。默認(rèn)值為covariance_type =“diag”,這意味著可以獨(dú)立設(shè)置沿每個(gè)維度的類蔟大小,并將得到的橢圓約束為與軸對(duì)齊。一個(gè)稍微簡(jiǎn)單和快速的模型是covariance_type =“spherical”,它約束了類簇的形狀,使得所有維度都相等。盡管它并不完全等效,其產(chǎn)生的聚類將具有與k均值相似的特征。更復(fù)雜且計(jì)算量更大的模型(特別是隨著維數(shù)的增長(zhǎng))是使用covariance_type =“full”,這允許將每個(gè)簇建模為具有任意方向的橢圓。
對(duì)于一個(gè)類蔟,下圖我們可以看到這三個(gè)選項(xiàng)的可視化表示:
盡管GMM通常被歸類為聚類算法,但從根本上說它是一種密度估算算法。也就是說,GMM適合某些數(shù)據(jù)的結(jié)果在技術(shù)上不是聚類模型,而是描述數(shù)據(jù)分布的生成概率模型。
例如,考慮一下Scikit-Learn的make_moons函數(shù)生成的一些數(shù)據(jù):
如果我們嘗試用視為聚類模型的雙成分的GMM模擬數(shù)據(jù),則結(jié)果不是特別有用:
但是如果我們使用更多成分的GMM模型,并忽視聚類的類別,我們會(huì)發(fā)現(xiàn)更接近輸入數(shù)據(jù)的擬合:
這里,16個(gè)高斯分布的混合不是為了找到分離的數(shù)據(jù)簇,而是為了對(duì)輸入數(shù)據(jù)的整體分布進(jìn)行建模。這是分布的一個(gè)生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機(jī)數(shù)據(jù)的方法。例如,以下是從這個(gè)16分量GMM擬合到我們?cè)紨?shù)據(jù)的400個(gè)新點(diǎn):
GMM非常方便,可以靈活地建模任意多維數(shù)據(jù)分布。
GMM是一種生成模型這一事實(shí)為我們提供了一種確定給定數(shù)據(jù)集的最佳組件數(shù)的自然方法。生成模型本質(zhì)上是數(shù)據(jù)集的概率分布,因此我們可以簡(jiǎn)單地評(píng)估模型下數(shù)據(jù)的可能性,使用交叉驗(yàn)證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標(biāo)準(zhǔn)來調(diào)整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計(jì)器實(shí)際上包含計(jì)算這兩者的內(nèi)置方法,因此在這種方法上操作非常容易。
讓我們看看在moon數(shù)據(jù)集中,使用AIC和BIC函數(shù)確定GMM組件數(shù)量:
最佳的聚類數(shù)目是使得AIC或BIC最小化的值,具體取決于我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個(gè)組件可能太多了:大約8-12個(gè)組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡(jiǎn)單的模型。
注意重點(diǎn):這個(gè)組件數(shù)量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類算法的效果。我鼓勵(lì)您將GMM主要視為密度估算器,并且只有在簡(jiǎn)單數(shù)據(jù)集中保證時(shí)才將其用于聚類。
我們剛剛看到了一個(gè)使用GMM作為數(shù)據(jù)生成模型的簡(jiǎn)單示例,以便根據(jù)輸入數(shù)據(jù)定義的分布創(chuàng)建新樣本。在這里,我們將運(yùn)行這個(gè)想法,并從我們以前使用過的標(biāo)準(zhǔn)數(shù)字語料庫中生成新的手寫數(shù)字。
首先,讓我們使用Scikit-Learn的數(shù)據(jù)工具加載數(shù)字?jǐn)?shù)據(jù):
接下來讓我們繪制前100個(gè),以準(zhǔn)確回憶我們正在看的內(nèi)容:
我們有64個(gè)維度的近1,800位數(shù)字,我們可以在這些位置上構(gòu)建GMM以產(chǎn)生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數(shù)據(jù)上的可逆維數(shù)減少算法開始。在這里,我們將使用一個(gè)簡(jiǎn)單的PCA,要求它保留99%的預(yù)測(cè)數(shù)據(jù)方差:
結(jié)果是41個(gè)維度,減少了近1/3,幾乎沒有信息丟失。根據(jù)這些預(yù)測(cè)數(shù)據(jù),讓我們使用AIC來計(jì)算我們應(yīng)該使用的GMM組件的數(shù)量:
似乎大約110個(gè)components最小化了AIC;我們將使用這個(gè)模型。我們迅速將其與數(shù)據(jù)擬合并確保它已收斂合:
現(xiàn)在我們可以使用GMM作為生成模型在這個(gè)41維投影空間內(nèi)繪制100個(gè)新點(diǎn)的樣本:
最后,我們可以使用PCA對(duì)象的逆變換來構(gòu)造新的數(shù)字:
大部分結(jié)果看起來像數(shù)據(jù)集中合理的數(shù)字!
考慮一下我們?cè)谶@里做了什么:給定一個(gè)手寫數(shù)字的樣本,我們已經(jīng)模擬了數(shù)據(jù)的分布,這樣我們就可以從數(shù)據(jù)中生成全新的數(shù)字樣本:這些是“手寫數(shù)字”,不是單獨(dú)的出現(xiàn)在原始數(shù)據(jù)集中,而是捕獲混合模型建模的輸入數(shù)據(jù)的一般特征。這種數(shù)字生成模型可以證明作為貝葉斯生成分類器的一個(gè)組成部分非常有用,我們將在下一節(jié)中看到。
高斯擬合(Gaussian Fitting)即使用形如:
Gi(x)=Ai*exp((x-Bi)^2/Ci^2)
的高斯函數(shù)對(duì)數(shù)據(jù)點(diǎn)集進(jìn)行函數(shù)逼近的擬合方法。
其實(shí)可以跟多項(xiàng)式擬合類比起來,不同的是多項(xiàng)式擬合是用冪函數(shù)系,
而高斯擬合是用高斯函數(shù)系。
使用高斯函數(shù)來進(jìn)行擬合,優(yōu)點(diǎn)在于計(jì)算積分十分簡(jiǎn)單快捷。這一點(diǎn)
在很多領(lǐng)域都有應(yīng)用,特別是計(jì)算化學(xué)。著名的化學(xué)軟件Gaussian98
就是建立在高斯基函數(shù)擬合的數(shù)學(xué)基礎(chǔ)上的。
具體算法樓主可以去幾大論壇上問問。現(xiàn)在沒時(shí)間了。bbs.matwav.com
GAN本身是一種生成式模型,所以在數(shù)據(jù)生成上用的是最普遍的,最常見的是圖片生成,常用的有DCGAN WGAN,BEGAN。目前比較有意思的應(yīng)用就是GAN用在圖像風(fēng)格遷移,圖像降噪修復(fù),圖像超分辨率了,都有比較好的結(jié)果。目前也有研究者將GAN用在對(duì)抗性攻擊上,具體就是訓(xùn)練GAN生成對(duì)抗文本,有針對(duì)或者無針對(duì)的欺騙分類器或者檢測(cè)系統(tǒng)等等,但是目前沒有見到很典范的文章。好吧,筆者有一個(gè)項(xiàng)目和對(duì)抗性攻擊有關(guān),所以要學(xué)習(xí)一下GAN。
GANs組成:生成器和判別器。結(jié)構(gòu)如圖1所示
針對(duì)問題: 給定一批樣本,訓(xùn)練一個(gè)系統(tǒng)能夠生成類似的新樣本
核心思想:博弈論中的納什均衡,
判別器D 的目的是判斷數(shù)據(jù)來自生成器還是訓(xùn)練集,
生成器G 的目的是學(xué)習(xí)真實(shí)數(shù)據(jù)的分布,使得生成的數(shù)據(jù)更接近真實(shí)數(shù)據(jù),
兩者不斷學(xué)習(xí)優(yōu)化最后得到納什平衡點(diǎn)。
D( x) 表示真實(shí)數(shù)據(jù)的概率分布,
G( z) 表示輸入噪聲z 產(chǎn)生的生成數(shù)據(jù)的概率分布
訓(xùn)練目標(biāo):G( Z)在判別器上的分布D( G( Z) ) 更接近真實(shí)數(shù)據(jù)在判別器上的分布D( X)
接下來就來實(shí)現(xiàn)我們的例子把,目標(biāo)是把標(biāo)準(zhǔn)正態(tài)分布的數(shù)據(jù),通過訓(xùn)練的Gan 網(wǎng)絡(luò)之后,得到的數(shù)據(jù)x_fake能盡量擬合均值為3方差為1的高斯分布N(3,1)的數(shù)據(jù)。
可以看出生成器其實(shí)就是簡(jiǎn)單的全連接網(wǎng)絡(luò),當(dāng)然CNN,RNN等網(wǎng)絡(luò)都是適合GAN的,根據(jù)需要選擇。
可以看出判別器其實(shí)也是簡(jiǎn)單的全連接網(wǎng)絡(luò),當(dāng)然CNN,RNN等網(wǎng)絡(luò)都是適合GAN的,根據(jù)需要選擇。
在這里想說的是對(duì)于判別器和生成器的訓(xùn)練是分開的,訓(xùn)練判別器的時(shí)候固定生成器,訓(xùn)練生成器的時(shí)候固定判別器,如此循環(huán)。本例子中先訓(xùn)練三次判別器,接著訓(xùn)練一次生成器。
為了便于理解具體訓(xùn)練過程,圖2 、圖3展示了判別器和生成器訓(xùn)練時(shí)的數(shù)據(jù)流向,具體就不展開了,參考注釋。
畫圖函數(shù)敬上
然后調(diào)用main()函數(shù)就好了
紅色是目標(biāo)分布,藍(lán)色是生成分布,還是有一定效果的額。
感受到是在調(diào)參了,請(qǐng)教我如何學(xué)習(xí)生成(xie)對(duì)抗(lun)網(wǎng)絡(luò)(wen)。
分享文章:關(guān)于python高斯函數(shù)擬合的信息
本文來源:http://www.sd-ha.com/article22/docjjjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、網(wǎng)站維護(hù)、服務(wù)器托管、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)