Python math 庫提供許多對浮點(diǎn)數(shù)的數(shù)學(xué)運(yùn)算函數(shù),math模塊不支持復(fù)數(shù)運(yùn)算,若需計(jì)算復(fù)數(shù),可使用cmath模塊(本文不贅述)。
創(chuàng)新互聯(lián)2013年至今,先為荊州等服務(wù)建站,荊州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為荊州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
使用dir函數(shù),查看math庫中包含的所有內(nèi)容:
1) math.pi????# 圓周率π
2) math.e????#自然對數(shù)底數(shù)
3) math.inf? ? #正無窮大∞,-math.inf? ? #負(fù)無窮大-∞
4) math.nan? ? #非浮點(diǎn)數(shù)標(biāo)記,NaN(not a number)
1) math.fabs(x)? ? #表示X值的絕對值
2) math.fmod(x,y)? ? #表示x/y的余數(shù),結(jié)果為浮點(diǎn)數(shù)
3) math.fsum([x,y,z])? ? #對括號內(nèi)每個元素求和,其值為浮點(diǎn)數(shù)
4) math.ceil(x)? ? #向上取整,返回不小于x的最小整數(shù)
5)math.floor(x)? ? #向下取整,返回不大于x的最大整數(shù)
6) math.factorial(x)? ? #表示X的階乘,其中X值必須為整型,否則報(bào)錯
7) math.gcd(a,b)? ? #表示a,b的最大公約數(shù)
8)? math.frexp(x)? ? ? #x = i *2^j,返回(i,j)
9) math.ldexp(x,i)? ? #返回x*2^i的運(yùn)算值,為math.frexp(x)函數(shù)的反運(yùn)算
10) math.modf(x)? ? #表示x的小數(shù)和整數(shù)部分
11) math.trunc(x)? ? #表示x值的整數(shù)部分
12) math.copysign(x,y)? ? #表示用數(shù)值y的正負(fù)號,替換x值的正負(fù)號
13) math.isclose(a,b,rel_tol =x,abs_tol = y)? ? #表示a,b的相似性,真值返回True,否則False;rel_tol是相對公差:表示a,b之間允許的最大差值,abs_tol是最小絕對公差,對比較接近于0有用,abs_tol必須至少為0。
14) math.isfinite(x)? ? #表示當(dāng)x不為無窮大時(shí),返回True,否則返回False
15) math.isinf(x)? ? #當(dāng)x為±∞時(shí),返回True,否則返回False
16) math.isnan(x)? ? #當(dāng)x是NaN,返回True,否則返回False
1) math.pow(x,y)? ? #表示x的y次冪
2) math.exp(x)? ? #表示e的x次冪
3) math.expm1(x)? ? #表示e的x次冪減1
4) math.sqrt(x)? ? #表示x的平方根
5) math.log(x,base)? ? #表示x的對數(shù)值,僅輸入x值時(shí),表示ln(x)函數(shù)
6) math.log1p(x)? ? #表示1+x的自然對數(shù)值
7) math.log2(x)? ? #表示以2為底的x對數(shù)值
8) math.log10(x)? ? #表示以10為底的x的對數(shù)值
1) math.degrees(x)? ? #表示弧度值轉(zhuǎn)角度值
2) math.radians(x)? ? #表示角度值轉(zhuǎn)弧度值
3) math.hypot(x,y)? ? #表示(x,y)坐標(biāo)到原點(diǎn)(0,0)的距離
4) math.sin(x)? ? #表示x的正弦函數(shù)值
5) math.cos(x)? ? #表示x的余弦函數(shù)值
6) math.tan(x)? ? #表示x的正切函數(shù)值
7)math.asin(x)? ? #表示x的反正弦函數(shù)值
8)?math.acos(x)? ? #表示x的反余弦函數(shù)值
9)?math.atan(x)? ? #表示x的反正切函數(shù)值
10) math.atan2(y,x)? ? #表示y/x的反正切函數(shù)值
11) math.sinh(x)? ? #表示x的雙曲正弦函數(shù)值
12) math.cosh(x)? ? #表示x的雙曲余弦函數(shù)值
13) math.tanh(x)? ? #表示x的雙曲正切函數(shù)值
14) math.asinh(x)? ? #表示x的反雙曲正弦函數(shù)值
15) math.acosh(x)? ? #表示x的反雙曲余弦函數(shù)值
16) math.atanh(x)? ? #表示x的反雙曲正切函數(shù)值
1)math.erf(x)? ? #高斯誤差函數(shù)
2) math.erfc(x)? ? #余補(bǔ)高斯誤差函數(shù)
3) math.gamma(x)? ? #伽馬函數(shù)(歐拉第二積分函數(shù))
4) math.lgamma(x)? ? #伽馬函數(shù)的自然對數(shù)
如何用python實(shí)現(xiàn)圖像的一維高斯濾波器
現(xiàn)在把卷積模板中的值換一下,不是全1了,換成一組符合高斯分布的數(shù)值放在模板里面,比如這時(shí)中間的數(shù)值最大,往兩邊走越來越小,構(gòu)造一個小的高斯包。實(shí)現(xiàn)的函數(shù)為cv2.GaussianBlur()。對于高斯模板,我們需要制定的是高斯核的高和寬(奇數(shù)),沿x與y方向的標(biāo)準(zhǔn)差(如果只給x,y=x,如果都給0,那么函數(shù)會自己計(jì)算)。高斯核可以有效的出去圖像的高斯噪聲。當(dāng)然也可以自己構(gòu)造高斯核,相關(guān)函數(shù):cv2.GaussianKernel().
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(‘flower.jpg‘,0) #直接讀為灰度圖像
for i in range(2000): #添加點(diǎn)噪聲
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‘)#默認(rèn)彩色,另一種彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,‘gray‘)
clear?
close?all
%%%%%%%%%%%%%%%%%%%%%%%%%生成實(shí)驗(yàn)數(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
borderType= None)函數(shù)
此函數(shù)利用高斯濾波器平滑一張圖像。該函數(shù)將源圖像與指定的高斯核進(jìn)行卷積。
src:輸入圖像
ksize:(核的寬度,核的高度),輸入高斯核的尺寸,核的寬高都必須是正奇數(shù)。否則,將會從參數(shù)sigma中計(jì)算得到。
dst:輸出圖像,尺寸與輸入圖像一致。
sigmaX:高斯核在X方向上的標(biāo)準(zhǔn)差。
sigmaY:高斯核在Y方向上的標(biāo)準(zhǔn)差。默認(rèn)為None,如果sigmaY=0,則它將被設(shè)置為與sigmaX相等的值。如果這兩者都為0,則它們的值會從ksize中計(jì)算得到。計(jì)算公式為:
borderType:像素外推法,默認(rèn)為None(參考官方文檔 BorderTypes
)
在圖像處理中,高斯濾波主要有兩種方式:
1.窗口滑動卷積
2.傅里葉變換
在此主要利用窗口滑動卷積。其中二維高斯函數(shù)公式為:
根據(jù)上述公式,生成一個3x3的高斯核,其中最重要的參數(shù)就是標(biāo)準(zhǔn)差 ,標(biāo)準(zhǔn)差 越大,核中心的值與周圍的值差距越小,曲線越平滑。標(biāo)準(zhǔn)差 越小,核中心的值與周圍的值差距越大,曲線越陡峭。
從圖像的角度來說,高斯核的標(biāo)準(zhǔn)差 越大,平滑效果越不明顯。高斯核的標(biāo)準(zhǔn)差 越小,平滑效果越明顯。
可見,標(biāo)準(zhǔn)差 越大,圖像平滑程度越大
參考博客1:關(guān)于GaussianBlur函數(shù)
參考博客2:關(guān)于高斯核運(yùn)算
本文翻譯自
上一節(jié)中探討的k-means聚類模型簡單易懂,但其簡單性導(dǎo)致其應(yīng)用中存在實(shí)際挑戰(zhàn)。具體而言,k-means的非概率特性及簡單地計(jì)算點(diǎn)與類蔟中心的歐式距離來判定歸屬,會導(dǎo)致其在許多真實(shí)的場景中性能較差。本節(jié),我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強(qiáng)有力的估計(jì)工具,而不僅僅是聚類。
我們將以一個標(biāo)準(zhǔn)的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節(jié)所示,給定簡單,易于分類的數(shù)據(jù),k-means能找到合適的聚類結(jié)果。
舉例而言,假設(shè)我們有些簡單的數(shù)據(jù)點(diǎn),k-means算法能以某種方式很快地將它們聚類,跟我們?nèi)庋鄯直娴慕Y(jié)果很接近:
從直觀的角度來看,我可能期望聚類分配時(shí),某些點(diǎn)比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數(shù)據(jù)點(diǎn)的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內(nèi)在度量(盡管可能使用bootstrap 的方式來估計(jì)這種不確定性)。為此,我們必須考慮泛化這種模型。
k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠(yuǎn)的點(diǎn)確定。該半徑充當(dāng)訓(xùn)練集中聚類分配的一個硬截?cái)啵喝魏稳ν獾臄?shù)據(jù)點(diǎn)不被視為該類的成員。我們可以使用以下函數(shù)可視化這個聚類模型:
觀察k-means的一個重要發(fā)現(xiàn),這些聚類模式必須是圓形的。k-means沒有內(nèi)置的方法來計(jì)算橢圓形或橢圓形的簇。因此,舉例而言,假設(shè)我們將相同的數(shù)據(jù)點(diǎn)作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數(shù)據(jù)集。在最簡單的情況下,GMM可用于以與k-means相同的方式聚類。
但因?yàn)镚MM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調(diào)用predict_proba方法實(shí)現(xiàn)。它將返回一個大小為[n_samples, n_clusters]的矩陣,用于衡量每個點(diǎn)屬于給定類別的概率:
我們可以可視化這種不確定性,比如每個點(diǎn)的大小與預(yù)測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點(diǎn)反映了群集分配的不確定性:
本質(zhì)上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執(zhí)行以下操作:
有了這個,我們可以看看四成分的GMM為我們的初始數(shù)據(jù)提供了什么:
同樣,我們可以使用GMM方法來擬合我們的拉伸數(shù)據(jù)集;允許full的協(xié)方差,該模型甚至可以適應(yīng)非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個主要實(shí)際問題。
如果看了之前擬合的細(xì)節(jié),你將看到covariance_type選項(xiàng)在每個中都設(shè)置不同。該超參數(shù)控制每個類簇的形狀的自由度;對于任意給定的問題,必須仔細(xì)設(shè)置。默認(rèn)值為covariance_type =“diag”,這意味著可以獨(dú)立設(shè)置沿每個維度的類蔟大小,并將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =“spherical”,它約束了類簇的形狀,使得所有維度都相等。盡管它并不完全等效,其產(chǎn)生的聚類將具有與k均值相似的特征。更復(fù)雜且計(jì)算量更大的模型(特別是隨著維數(shù)的增長)是使用covariance_type =“full”,這允許將每個簇建模為具有任意方向的橢圓。
對于一個類蔟,下圖我們可以看到這三個選項(xiàng)的可視化表示:
盡管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ù)的整體分布進(jìn)行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機(jī)數(shù)據(jù)的方法。例如,以下是從這個16分量GMM擬合到我們原始數(shù)據(jù)的400個新點(diǎn):
GMM非常方便,可以靈活地建模任意多維數(shù)據(jù)分布。
GMM是一種生成模型這一事實(shí)為我們提供了一種確定給定數(shù)據(jù)集的最佳組件數(shù)的自然方法。生成模型本質(zhì)上是數(shù)據(jù)集的概率分布,因此我們可以簡單地評估模型下數(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個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。
注意重點(diǎn):這個組件數(shù)量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類算法的效果。我鼓勵您將GMM主要視為密度估算器,并且只有在簡單數(shù)據(jù)集中保證時(shí)才將其用于聚類。
我們剛剛看到了一個使用GMM作為數(shù)據(jù)生成模型的簡單示例,以便根據(jù)輸入數(shù)據(jù)定義的分布創(chuàng)建新樣本。在這里,我們將運(yùn)行這個想法,并從我們以前使用過的標(biāo)準(zhǔn)數(shù)字語料庫中生成新的手寫數(shù)字。
首先,讓我們使用Scikit-Learn的數(shù)據(jù)工具加載數(shù)字?jǐn)?shù)據(jù):
接下來讓我們繪制前100個,以準(zhǔn)確回憶我們正在看的內(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來計(jì)算我們應(yīng)該使用的GMM組件的數(shù)量:
似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數(shù)據(jù)擬合并確保它已收斂合:
現(xiàn)在我們可以使用GMM作為生成模型在這個41維投影空間內(nèi)繪制100個新點(diǎn)的樣本:
最后,我們可以使用PCA對象的逆變換來構(gòu)造新的數(shù)字:
大部分結(jié)果看起來像數(shù)據(jù)集中合理的數(shù)字!
考慮一下我們在這里做了什么:給定一個手寫數(shù)字的樣本,我們已經(jīng)模擬了數(shù)據(jù)的分布,這樣我們就可以從數(shù)據(jù)中生成全新的數(shù)字樣本:這些是“手寫數(shù)字”,不是單獨(dú)的出現(xiàn)在原始數(shù)據(jù)集中,而是捕獲混合模型建模的輸入數(shù)據(jù)的一般特征。這種數(shù)字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節(jié)中看到。