新聞中心
[譯] 高斯混合模型 --- python教程
本文翻譯自
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序設計、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了囊謙免費建站歡迎大家使用!
上一節(jié)中探討的k-means聚類模型簡單易懂,但其簡單性導致其應用中存在實際挑戰(zhàn)。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節(jié),我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。
我們將以一個標準的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節(jié)所示,給定簡單,易于分類的數(shù)據(jù),k-means能找到合適的聚類結(jié)果。
舉例而言,假設我們有些簡單的數(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ù)據(jù)點作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數(shù)據(jù)集。在最簡單的情況下,GMM可用于以與k-means相同的方式聚類。
但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調(diào)用predict_proba方法實現(xiàn)。它將返回一個大小為[n_samples, n_clusters]的矩陣,用于衡量每個點屬于給定類別的概率:
我們可以可視化這種不確定性,比如每個點的大小與預測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:
本質(zhì)上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執(zhí)行以下操作:
有了這個,我們可以看看四成分的GMM為我們的初始數(shù)據(jù)提供了什么:
同樣,我們可以使用GMM方法來擬合我們的拉伸數(shù)據(jù)集;允許full的協(xié)方差,該模型甚至可以適應非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。
如果看了之前擬合的細節(jié),你將看到covariance_type選項在每個中都設置不同。該超參數(shù)控制每個類簇的形狀的自由度;對于任意給定的問題,必須仔細設置。默認值為covariance_type =“diag”,這意味著可以獨立設置沿每個維度的類蔟大小,并將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是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%的預測數(shù)據(jù)方差:
結(jié)果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據(jù)這些預測數(shù)據(jù),讓我們使用AIC來計算我們應該使用的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ù),mu表示均值,sigma表示協(xié)方差矩陣,x表示數(shù)據(jù)點
clear?
close?all
%%%%%%%%%%%%%%%%%%%%%%%%%生成實驗數(shù)據(jù)集
rand('state',0)
sigma_matrix1=eye(2);
sigma_matrix2=50*eye(2);
u1=[0,0];
u2=[30,30];
m1=100;
m2=300;%樣本數(shù)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1數(shù)據(jù)集
Y1=multivrandn(u1,m1,sigma_matrix1);
Y2=multivrandn(u2,m2,sigma_matrix2);
scatter(Y1(:,1),Y1(:,2),'bo')
hold?on
scatter(Y2(:,1),Y2(:,2),'r*')
title('SM1數(shù)據(jù)集')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2數(shù)據(jù)集
u11=[0,0];
u22=[5,5];
u33=[10,10];
u44=[15,15];
m=600;
sigma_matrix3=2*eye(2);
Y11=multivrandn(u11,m,sigma_matrix3);
Y22=multivrandn(u22,m,sigma_matrix3);
Y33=multivrandn(u33,m,sigma_matrix3);
Y44=multivrandn(u44,m,sigma_matrix3);
figure(2)
scatter(Y11(:,1),Y11(:,2),'bo')
hold?on
scatter(Y22(:,1),Y22(:,2),'r*')
scatter(Y33(:,1),Y33(:,2),'go')
scatter(Y44(:,1),Y44(:,2),'c*')
title('SM2數(shù)據(jù)集')
end
function?Y?=?multivrandn(u,m,sigma_matrix)
%%生成指定均值和協(xié)方差矩陣的高斯數(shù)據(jù)
n=length(u);
c?=?chol(sigma_matrix);
X=randn(m,n);
Y=X*c+ones(m,1)*u;
end
2021-02-08 Python OpenCV GaussianBlur()函數(shù)
borderType= None)函數(shù)
此函數(shù)利用高斯濾波器平滑一張圖像。該函數(shù)將源圖像與指定的高斯核進行卷積。
src:輸入圖像
ksize:(核的寬度,核的高度),輸入高斯核的尺寸,核的寬高都必須是正奇數(shù)。否則,將會從參數(shù)sigma中計算得到。
dst:輸出圖像,尺寸與輸入圖像一致。
sigmaX:高斯核在X方向上的標準差。
sigmaY:高斯核在Y方向上的標準差。默認為None,如果sigmaY=0,則它將被設置為與sigmaX相等的值。如果這兩者都為0,則它們的值會從ksize中計算得到。計算公式為:
borderType:像素外推法,默認為None(參考官方文檔 BorderTypes
)
在圖像處理中,高斯濾波主要有兩種方式:
1.窗口滑動卷積
2.傅里葉變換
在此主要利用窗口滑動卷積。其中二維高斯函數(shù)公式為:
根據(jù)上述公式,生成一個3x3的高斯核,其中最重要的參數(shù)就是標準差 ,標準差 越大,核中心的值與周圍的值差距越小,曲線越平滑。標準差 越小,核中心的值與周圍的值差距越大,曲線越陡峭。
從圖像的角度來說,高斯核的標準差 越大,平滑效果越不明顯。高斯核的標準差 越小,平滑效果越明顯。
可見,標準差 越大,圖像平滑程度越大
參考博客1:關(guān)于GaussianBlur函數(shù)
參考博客2:關(guān)于高斯核運算
加性高斯白噪聲及維納濾波的基本原理與Python實現(xiàn)
加性高斯白噪聲屬于白噪聲的一種,有如下兩個特點:
random.gauss(mu, sigma) 其值即服從高斯分布,若想要是實現(xiàn)加性高斯白噪聲,循環(huán)作加即可
實際上逆濾波是維納濾波的一種理想情況,當不存在加性噪聲時,維納濾波與逆濾波等同。
在時域內(nèi)有
根據(jù)時域卷積定理,我們知道 時域卷積等于頻域乘積
則有
這意味著,當我們已知系統(tǒng)函數(shù)時,我們可以很簡單的完成濾波。
理解了逆濾波的基本過程之后,實際上維納濾波就不是太大問題了。實際上,逆濾波對于絕大多數(shù)情況濾波效果都不好,因為逆濾波是通過傅里葉變換將信號由時域轉(zhuǎn)換到頻域,再根據(jù) 時域卷積定理 ,在頻域作除法。對于乘性干擾這當然是沒問題的,甚至是完美的。而如果存在加性噪聲,例如:加性高斯白噪聲。逆濾波效果就不好了,某些情況下幾乎無法完成濾波情況。
輸入信號經(jīng)過系統(tǒng)函數(shù)后
時域上
頻域上
若存在加性噪聲則為
時域上
頻域上
則
于是,從上面對輸入信號的估計表達式可以看出,多出了一項加性噪聲的傅里葉變換與系統(tǒng)函數(shù)的比值。尤其當 相對于 很小時,濾波后的信號差距十分嚴重。
而我們又知道: 白噪聲的白為噪聲的功率譜為常數(shù) ,即 為常數(shù),于是,從直觀上看,當 相對于 較大時,則 較小,上式第一項則較小,而第二項較大從而保持相對平穩(wěn)。
click me!
當前文章:包含python實現(xiàn)高斯函數(shù)的詞條
文章起源:http://fisionsoft.com.cn/article/dodphoh.html