python利用插值法對(duì)折線進(jìn)行平滑曲線處理 09-19 主要為大家詳細(xì)介紹了python利用插值法對(duì)折線進(jìn)行平滑曲線處理,具有一定的參考價(jià)值。
創(chuàng)新互聯(lián)公司長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為桂東企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,桂東網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
很多業(yè)務(wù)場(chǎng)景中,我們希望通過(guò)一個(gè)特定的函數(shù)來(lái)擬合業(yè)務(wù)數(shù)據(jù),以此來(lái)預(yù)測(cè)未來(lái)數(shù)據(jù)的變化趨勢(shì)。(比如用戶的留存變化、付費(fèi)變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項(xiàng)式擬合 和 自定義函數(shù)擬合。
通過(guò)多項(xiàng)式擬合,我們只需要指定想要擬合的多項(xiàng)式的最高項(xiàng)次是多少即可。
運(yùn)行結(jié)果:
對(duì)于自定義函數(shù)擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運(yùn)行結(jié)果:
# 自定義繪制ks曲線的函數(shù)
def plot_ks(y_test, y_score, positive_flag):
# 對(duì)y_test,y_score重新設(shè)置索引
y_test.index = np.arange(len(y_test))
#y_score.index = np.arange(len(y_score))
# 構(gòu)建目標(biāo)數(shù)據(jù)集
target_data = pd.DataFrame({'y_test':y_test, 'y_score':y_score})
# 按y_score降序排列
target_data.sort_values(by = 'y_score', ascending = False, inplace = True)
# 自定義分位點(diǎn)
cuts = np.arange(0.1,1,0.1)
# 計(jì)算各分位點(diǎn)對(duì)應(yīng)的Score值
index = len(target_data.y_score)*cuts
scores = target_data.y_score.iloc[index.astype('int')]
# 根據(jù)不同的Score值,計(jì)算Sensitivity和Specificity
Sensitivity = []
Specificity = []
for score in scores:
? ? # 正例覆蓋樣本數(shù)量與實(shí)際正例樣本量
? ? positive_recall = target_data.loc[(target_data.y_test == positive_flag) (target_data.y_scorescore),:].shape[0]
? ? positive = sum(target_data.y_test == positive_flag)
? ? # 負(fù)例覆蓋樣本數(shù)量與實(shí)際負(fù)例樣本量
? ? negative_recall = target_data.loc[(target_data.y_test != positive_flag) (target_data.y_score=score),:].shape[0]
? ? negative = sum(target_data.y_test != positive_flag)
? ? Sensitivity.append(positive_recall/positive)
? ? Specificity.append(negative_recall/negative)
# 構(gòu)建繪圖數(shù)據(jù)
plot_data = pd.DataFrame({'cuts':cuts,'y1':1-np.array(Specificity),'y2':np.array(Sensitivity),
? ? ? ? ? ? ? ? ? ? ? ? ? 'ks':np.array(Sensitivity)-(1-np.array(Specificity))})
# 尋找Sensitivity和1-Specificity之差的最大值索引
max_ks_index = np.argmax(plot_data.ks)
plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y1.tolist()+[1], label = '1-Specificity')
plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y2.tolist()+[1], label = 'Sensitivity')
# 添加參考線
plt.vlines(plot_data.cuts[max_ks_index], ymin = plot_data.y1[max_ks_index],
? ? ? ? ? ymax = plot_data.y2[max_ks_index], linestyles = '--')
# 添加文本信息
plt.text(x = plot_data.cuts[max_ks_index]+0.01,
? ? ? ? y = plot_data.y1[max_ks_index]+plot_data.ks[max_ks_index]/2,
? ? ? ? s = 'KS= %.2f' %plot_data.ks[max_ks_index])
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()
# 調(diào)用自定義函數(shù),繪制K-S曲線
plot_ks(y_test = y_test, y_score = y_score, positive_flag = 1)
borderType= None)函數(shù)
此函數(shù)利用高斯濾波器平滑一張圖像。該函數(shù)將源圖像與指定的高斯核進(jìn)行卷積。
src:輸入圖像
ksize:(核的寬度,核的高度),輸入高斯核的尺寸,核的寬高都必須是正奇數(shù)。否則,將會(huì)從參數(shù)sigma中計(jì)算得到。
dst:輸出圖像,尺寸與輸入圖像一致。
sigmaX:高斯核在X方向上的標(biāo)準(zhǔn)差。
sigmaY:高斯核在Y方向上的標(biāo)準(zhǔn)差。默認(rèn)為None,如果sigmaY=0,則它將被設(shè)置為與sigmaX相等的值。如果這兩者都為0,則它們的值會(huì)從ksize中計(jì)算得到。計(jì)算公式為:
borderType:像素外推法,默認(rèn)為None(參考官方文檔 BorderTypes
)
在圖像處理中,高斯濾波主要有兩種方式:
1.窗口滑動(dòng)卷積
2.傅里葉變換
在此主要利用窗口滑動(dòng)卷積。其中二維高斯函數(shù)公式為:
根據(jù)上述公式,生成一個(gè)3x3的高斯核,其中最重要的參數(shù)就是標(biāo)準(zhǔn)差 ,標(biāo)準(zhǔn)差 越大,核中心的值與周?chē)闹挡罹嘣叫?,曲線越平滑。標(biāo)準(zhǔn)差 越小,核中心的值與周?chē)闹挡罹嘣酱?,曲線越陡峭。
從圖像的角度來(lái)說(shuō),高斯核的標(biāo)準(zhǔn)差 越大,平滑效果越不明顯。高斯核的標(biāo)準(zhǔn)差 越小,平滑效果越明顯。
可見(jiàn),標(biāo)準(zhǔn)差 越大,圖像平滑程度越大
參考博客1:關(guān)于GaussianBlur函數(shù)
參考博客2:關(guān)于高斯核運(yùn)算