思考:輸入到nn模型中的特徵要做歸一化處理,我看到airbnb對特徵歸一化的方式因特徵而異,這點驚訝到我,我當前的工作中,對特徵歸一化處理方式是同一種。然而並不知道特徵服從什麼分布,或許選擇了乙個大家通用的歸一化方法?這個不得而知。言歸正傳,airbnb根據不同特徵做不一樣的歸一化,因為他們對資料進行了觀察,發現了部分長尾資料,因此做了log的歸一化處理[1],這點很驚喜。在我剛工作的時候,也有人問過我,一些特徵的分布,當時基於人工統計做了一些**直方圖,能看出乙個大概,但是真說不上來是什麼分布,只是乙個統計而已。
隨後查閱了一些資料,主題是:如何確定一組資料的分布。
查閱到了乙個部落格[2],裡面彙總了一些判斷該分布為什麼分布的方法及**,這裡我補充了一些原理及概念解釋(因為我不太明白這些方法是什麼,使用範圍是什麼)。首先我們先看下有哪些分布,然後再研究有哪些方法可以去確定一組資料符合什麼分布。
(1) 離散分布:
伯努利分布(零一分布,兩點分布),二項分布,幾何分布,泊松分布(poisson分布)
(2) 連續分布:
指數分布,正態分佈(高斯分布),均勻分布
(3) 抽樣分布:
卡方分布(x2分布),f分布,t分布
(4) 其它分布:
多項分布,beta分布,dirichlet分布
方法1:夏皮羅維爾克檢驗(shapiro-wilk test)
概念:是一種在頻率上統計檢驗中檢驗正態性的方法。它在2023年由夏皮羅和威爾克發表。
適用範圍:檢驗小樣本資料是否服從正態分佈,資料量大於5000時不適用。
**:這裡需要生成一組正態分佈的資料,待驗證的資料跟它進行對比。
##生成40個服從n(2,1)的隨機數
import numpy as np
np.random.seed(0)
mu = 2 ; sigma = 1; sampleno = 40;
testdata = np.random.normal(mu, sigma, sampleno)
##利用shapiro-wilk test檢驗其是否服從正態分佈
import scipy.stats as stats
print(stats.shapiro(testdata))
##輸出(統計量w的值,p值)=(0.9782678484916687, 0.6254357695579529)
##w的值越接近1就越表明資料和正態分佈擬合得越好,p值》指定水平,不拒絕原假設,可以認為樣本資料服從正態分佈
方法2:科爾莫戈羅夫檢驗(kolmogorov-smirnov test)
概念:來分析變數是否符合某種分布或比較兩組之間有無顯著性差異。檢驗單一樣本是否來自某一特定分布的方法。
適用範圍:
1)用於檢驗x的分布g(x)是否服從給定分布f(x),僅適用於連續分布的檢驗;
2)檢驗兩組資料是否來自統一分布。
**:1)這裡stats.kstest()的第二個引數是defines the distribution used for calculating the p-value.意思是你想看看你的資料符合啥分布,則將該引數設定為啥分布。
##生成隨機數
import numpy as np
np.random.seed(0)
testdata = np.random.normal(0,1,100)
##利用kolmogorov-smirnov test檢驗testdata是否服從正態分佈
import scipy.stats as stats
stats.kstest(testdata,'norm')
##輸出(統計量d的值,p值)=(0.058248638723832402, 0.88658843653019392)
##統計量d的值越接近0就越表明資料和標準正態分佈擬合得越好,p值》指定水平,不拒絕原假設,可以認為樣本資料服從正態分佈。
2)
import numpy as np
chi2 = np.random.chisquare(98, size=100)
norm = np.random.normal(0,1,100)
##檢驗norm和chi2是否服從同一分布
import scipy.stats as stats
print(stats.ks_2samp(norm, chi2))
##輸出ks_2sampresult(statistic=1.0, pvalue=1.5505547466854487e-45)
方法3:安德森-達令檢驗(anderson-darling test)
概念:檢驗樣本資料是否來自特定分布,包括分布:'norm', 'expon', 'gumbel', 'extreme1' or 'logistic'.
適用範圍:它可用於試驗分布是否適合,它可以用於建基於最小距離估計程式的引數估計。
**:
import numpy as np
np.random.seed(0)
data_norm = np.random.normal(0,1,100)
##用anderson-darling檢驗生成的陣列是否服從正態分佈
import scipy.stats as stats
stats.anderson(data_norm, dist='norm')
方法4:lilliefors檢驗
概念:檢驗樣本資料是否來自正態總體
適用範圍:當總體均值和方差未知時,用樣本的均值和方差代替後 再用k-s檢驗法。據說效果不如anderson-darling test
**:
#**有點問題,後續會修正
##生成1000個服從n(0,1)的隨機數
import numpy as np
np.random.seed(0)
norm_data = np.random.normal(0,1,1000)
#生成100個服從lambda=10的指數分布exp(10)
exp_data = np.random.exponential(scale=0.1, size=1000) #scale=1/lambda
from statsmodels.stats.diagnostic import lilliefors
lilliefors(norm_data)
##輸出(統計量的值,p值)=(0.019125294462402076, 0.48168672320192013),p值》指定水平0.05,接受原假設,可以認為樣本資料服從正態分佈
lilliefors(exp_data)
方法5:基於偏度和峰度的檢驗
概念:偏度是判斷樣本左邊長尾(峰度)還是右邊長尾,峰度是判斷樣本的分布是瘦高還是矮胖。
適用範圍:可用於檢驗樣本資料是否來自正態分佈(偏度=0,峰度=3),易受異常值影響,不能用於小樣本。
**:
##生成1000個服從n(0,1)的隨機數
import numpy as np
np.random.seed(0)
norm_data = np.random.normal(0,1,1000)
#生成100個服從lambda=10的指數分布exp(10)
exp_data = np.random.exponential(scale=0.1, size=1000) #scale=1/lambda
import scipy.stats as stats
stats.jarque_bera(norm_data)
##輸出(統計量jb的值,p值)=(0.28220016508625245, 0.86840239542814834),p值》指定水平0.05,接受原假設,可以認為樣本資料在5%的顯著水平下服從正態分佈
stats.jarque_bera(exp_data)
##輸出(統計量jb的值,p值)=(1117.2762482645478, 0.0),p值《指定水平0.05,拒絕原假設,認為樣本資料在5%的顯著水平下不服從正態分佈
參考:
1.2.
3.4.
判斷scanf接收的資料是否為一組純數字
判斷scanf接收的資料是否為一組純數 為了程式的健壯性,我們需要檢查scanf函式接收的資料是否符合輸入要求,並提示使用者重新輸入正確的資料。以判斷輸入是否是 正整數為例,有以下幾種方法 方法 1 利用scanf函式的返回值 scanf 讀取匹配format 格式 字串的輸入scanf 的返回值是...
python 如何判斷一組資料是否符合正態分佈
正態分佈 判斷方法有畫圖 k s檢驗 畫圖 匯入模組 import numpy as np import pandas as pd import matplotlib.pyplot as plt matplotlib inline 構造一組隨機資料 s pd.dataframe np.random....
python 如何判斷一組資料是否符合正態分佈
若隨機變數x服從有個數學期望為 方差為 2 的正態分佈,記為n 其中期望值決定密度函式的位置,標準差決定分布的幅度,當 0,0 時的正態分佈是標準正態分佈 判斷方法有畫圖 k s檢驗 匯入模組 import numpy as np import pandas as pd import matplot...