機器學習數學筆記|偏度與峰度及其python實現
覺得有用的話,歡迎一起討論相互學習~
本博客為七月在線鄒博老師機器學習數學課程學習筆記
為七月在線打call!!
課程傳送門
矩
- 對於隨機變量X,X的K階原點矩為
\[E(X^{k}) \]
- X的K階中心矩為
\[E([X-E(X)]^{k}) \]
- 期望實際上是隨機變量X的1階原點矩,方差實際上是隨機變量X的2階中心矩
- 變異系數(Coefficient of Variation):標准差與均值(期望)的比值稱為變異系數,記為C.V
- 偏度Skewness(三階)
- 峰度Kurtosis(四階)
偏度與峰度

利用matplotlib模擬偏度和峰度
計算期望和方差
import matplotlib.pyplot as plt
import math
import numpy as np
def calc(data):
n=len(data) # 10000個數
niu=0.0 # niu表示平均值,即期望.
niu2=0.0 # niu2表示平方的平均值
niu3=0.0 # niu3表示三次方的平均值
for a in data:
niu += a
niu2 += a**2
niu3 += a**3
niu /= n
niu2 /= n
niu3 /= n
sigma = math.sqrt(niu2 - niu*niu)
return [niu,sigma,niu3]
\[niu=\bar{X_{i}}即期望 \]
\[niu2=\frac{\sum_{i=1}^{n}X_{i}^{2}}{n} \]
\[niu3=\frac{\sum_{i=1}^{n}X_{i}^{3}}{n} \]
- sigma表示標准差公式為
\[\sigma=\sqrt{E(x^{2})-E(x)^{2}} \]\[用python語言表示即為sigma = math.sqrt(niu2 - niu*niu) \]
- 返回值為[期望,標准差,\(E(x^{3})\)]
- PS:我們知道期望E(X)的計算公式為
\[E(X)=\sum_{i=1}^{n}p(i)x(i)-----(1) \]這里我們X一個事件p(i)表示事件出現的概率,x(i)表示事件所給予事件的權值.
- 我們直接利用
\[E(x)=\bar{X_{i}}----(2) \]表示期望應當明確
- (2)公式中\(X_{i}是利用numpy中的偽隨機數生成的,其均值用於表示期望\)
- 此時(1)公式中對事件賦予的權值默認為1,即公式的本來面目為
\[E(x)=\bar{(X_{i}*1)} \]
計算偏度和峰度
def calc_stat(data):
[niu, sigma, niu3]=calc(data)
n=len(data)
niu4=0.0 # niu4計算峰度計算公式的分子
for a in data:
a -= niu
niu4 += a**4
niu4 /= n
skew =(niu3 -3*niu*sigma**2-niu**3)/(sigma**3) # 偏度計算公式
kurt=niu4/(sigma**4) # 峰度計算公式:下方為方差的平方即為標准差的四次方
return [niu, sigma,skew,kurt]
利用matplotlib模擬圖像
if __name__ == "__main__":
data = list(np.random.randn(10000)) # 滿足高斯分布的10000個數
data2 = list(2*np.random.randn(10000)) # 將滿足好高斯分布的10000個數乘以兩倍,方差變成四倍
data3 =[x for x in data if x>-0.5] # 取data中>-0.5的值
data4 = list(np.random.uniform(0,4,10000)) # 取0~4的均勻分布
[niu, sigma, skew, kurt] = calc_stat(data)
[niu_2, sigma2, skew2, kurt2] = calc_stat(data2)
[niu_3, sigma3, skew3, kurt3] = calc_stat(data3)
[niu_4, sigma4, skew4, kurt4] = calc_stat(data4)
print (niu, sigma, skew, kurt)
print (niu2, sigma2, skew2, kurt2)
print (niu3, sigma3, skew3, kurt3)
print (niu4, sigma4, skew4, kurt4)
info = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu,sigma, skew, kurt) # 標注
info2 = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu_2,sigma2, skew2, kurt2)
info3 = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu_3,sigma3, skew3, kurt3)
plt.text(1,0.38,info,bbox=dict(facecolor='red',alpha=0.25))
plt.text(1,0.35,info2,bbox=dict(facecolor='green',alpha=0.25))
plt.text(1,0.32,info3,bbox=dict(facecolor='blue',alpha=0.25))
plt.hist(data,100,normed=True,facecolor='r',alpha=0.9)
plt.hist(data2,100,normed=True,facecolor='g',alpha=0.8)
plt.hist(data4,100,normed=True,facecolor='b',alpha=0.7)
plt.grid(True)
plt.show()

- 圖形表示的是利用numpy隨機數生成函數生成的隨機數的統計分布,利用matplotlib.pyplot.hist繪制的直方圖.即是出現數字的分布統計,並且是歸一化到0~1區間后的結果.
- 即橫軸表示數字,縱軸表示在1000個隨機數中橫軸對應的數出現的百分比.若不使用歸一化橫軸表示數字(normed=False),縱軸表示出現的次數.
- 若不使用歸一化--縱軸表示出現次數,

- 關於matplotlib.pyplot.hist函數
n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='b')
hist的參數非常多,但常用的就這六個,只有第一個是必須的,后面四個可選
arr: 需要計算直方圖的一維數組
bins: 直方圖的柱數,可選項,默認為10
normed: 是否將得到的直方圖向量歸一化。默認為0
facecolor: 直方圖顏色
edgecolor: 直方圖邊框顏色
alpha: 透明度
histtype: 直方圖類型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值 :
n: 直方圖向量,是否歸一化由參數normed設定
bins: 返回各個bin的區間范圍
patches: 返回每個bin里面包含的數據,是一個list




