方差和标准差的意义
在此前一篇文章《算法效果評估:均方根誤差(RMSE)/ 標準誤差》中,我們介紹了方差/標準差的計算方法,也點出了它們是用來“度量數據離散程度”的一種數學方法,但是對于它們的意義并沒有給出更具體和形象的解釋。本文,我們把這塊內容補上。(本文地址:https://blog.csdn.net/bluishglc/article/details/128520861,轉載請注明出處)
一言以蔽之,方差/標準差是用來度量數據離散程度的,或者應該再精確一點說應該是:方差/標準差是用來度量一組數據距離某個中心位置(均值或數學期望)的離散程度的。反之,我們也可以在一些工具中通過設定方差/標準差的大小來生成離散程度不同的數據集,本文,我們就用這種方法來幫助我們理解方差/標準差的意義。
案例:箭靶
先不考慮任何數學知識,我們來看一個再形象不過的示例:箭靶
上圖中藍色和黃色的點位是兩個人的射擊成績,我們把每一個點位的正負值考慮進去,藍色和黃色的點到中心點的平均距離都為0,因為x,y軸有正負值,多點疊加會相互抵消,雖然實際情況未必會如此精準,但我們完全可以通過造數據的方式來生成一張到靶心的平均距離為0的圖。注意:我們這里強調兩種顏色的點到中心點的平均距離都為0實際上是在強調:兩套樣本的均值都是0(確切地說是(x=0,y=0)),也就是說:這些點是均勻地圍繞靶心分布的,它反映的是“射擊者在瞄準時總是盡量指向靶心”這一趨勢,這也符合人們的直觀感受。實際上,這里的靶心就是我們常說的“數學期望”,在保持相同數學期望(同一均值)的情況下去對比離散程度(方差)會更嚴謹也更直觀一些。
現在,我們來看一下誰的射擊成績更好?答案是非常確定的:藍色的成績更好,不用計算具體的環數,只從視覺上就可以看到:藍色的點位相比于黃色更加集中在圓心位置,它的離散程度遠遠小于黃色點位,那么箭靶上的這種點位的離散程度怎么用數據來說明(表征)呢?其實這就是方差/標準差。
案例:身高
由于箭靶的點位是一個由橫縱坐標組成的二維數據,比較我們計算方差時使用的一維樣本數據還是不太方便直接理解。我們再選一個一維數組來幫助我們理解方差/標準差。
考慮人類的身高數據,這是一個典型的符合正態分布的數據,我們假設正常人的身高集中在以170cm為中心,150cm- 190cm的區間內,則大多數人的身高會集中于170cm上下的區間內,越向兩側延伸(更高或更矮),人數越少。為此,我們可以利用numpy生成兩個符合這一正態分布的數據集,但是設置不同的方差,然后觀察一下它們的“離散”程度:
import numpy as np import pandas as pd import matplotlib.pyplot as plt%matplotlib inlinedef gen_heights(sample_scale, sample_size):# 以170cm為正態分布的中心點,給定的樣本數量和標準差,生成一維數組# 注:scale參數是指定的標準差,該值越大,樣本越發散,越小,樣本越集中heights = np.random.normal(loc=170, scale=sample_scale, size=sample_size)# print(f"heights variance = {heights.var()}")print(f"scale = {sample_scale}, heights standard deviation = {heights.std()}")# print(heights)# print(heights.shape)# 將其轉置為二維表結構:n行1列,就是行轉列操作,-1在reshape中的含義是:不手動計算這個維度的數量# 由numpy自動去計算。這里只需要控制列數=1即可heights = heights.reshape(-1, 1)# print(heights)# print(heights.shape)zeros = np.zeros(sample_size)# axis=1, 是在水平方向上插入zeros數組,所以效果上就是“擴列”# 插入位置是0(在第1個位置上插入),故最終的形式為[[0,a], [0,b], ...]heights = np.insert(heights, 0, zeros, axis=1)# print(heights)return pd.DataFrame(heights, columns=['0','height'])df1 = gen_heights(2, 20) df2 = gen_heights(6, 20)# 設置圖形屬性及布局 plt.style.use('ggplot') fig1 = plt.figure('身高分布') axes1 = fig1.subplots(nrows=1, ncols=2) ax1, ax2 = axes1.ravel()df1.plot(kind="scatter", color="red", ax=ax1, x="height", y="0", figsize=(12,5), xlim=(150, 190)) df2.plot(kind="scatter", color="green", ax=ax2, x="height", y="0", figsize=(12,5), xlim=(150, 190))程序輸出:
scale = 2, heights standard deviation = 1.8318180277200293 scale = 6, heights standard deviation = 5.444879647398637我們先看圖片,兩圖都是隨機生成的以170為中心符合正態分布的20個身高數據,從圖上發現:圖2明顯比圖1發散(兩張圖的橫縱軸范圍一樣,無縮放)。同樣是20個數據,是什么因素導致兩者的離散程度有如此明顯的差異呢?其實關鍵就是他們的“方差”不同。
在程序中,我們特別打印了生成數據的方差值:
- 第一組數據設定的scale=2,實際生成數據的標準差是1.8
- 第二組數據設定的scale=6,實際生成數據的標準差是5.4
將標準差和其對應的圖形聯系在一起,我們就可以很直觀地感受到:方差所描述的正是數據的離散程度。
最后,補充解釋一下為什么實際生成數據的標準差和通過scale設定的期望標準差有出入,原因是由于數據是隨機生成的,很難保證精確的方差值,特別是在數據樣本比較少的情況下,如果我們把樣本數量從20提高到2000,我們就會發現,實際生成數據的標準差就會穩定在2左右,很少會出現大的波動。
案例:身高+體重
由于單純的身高數據是一維的數組,他們的稀疏只能在數軸上體現,還是不夠直觀。我們現在把人的體重數據補充進來,以身高為橫軸,體重為縱軸,一個點代表一個人(他的身高和體重),然后再次利用numpy生成這樣的二維數組,讓身高和體重都服從正態分布,其中身高數據與上例相同,體重數據以60KG為中心點,然后設置不同的標準差,觀察它們的離散程度:
def gen_heights_weights(sample_scale, sample_size):# 分別生成height和weight的正態分布數據heights_weights = np.random.normal(loc=(60,170), scale=sample_scale, size=sample_size)print(f"scale = {sample_scale}, heights standard deviation = {heights_weights.std(axis=0)}")return pd.DataFrame(heights_weights, columns=['weight','height'])df3 = gen_heights_weights((2,2),(100,2)) df4 = gen_heights_weights((6,6),(100,2))# 設置圖形屬性及布局 plt.style.use('ggplot') fig2 = plt.figure('身高-體重分布') axes2 = fig2.subplots(nrows=1, ncols=2) ax3, ax4 = axes2.ravel()df3.plot(kind="scatter", color="red", ax=ax3, x="height", y="weight", figsize=(12,5), xlim=(150, 190), ylim=(40, 80)) df4.plot(kind="scatter", color="green", ax=ax4, x="height", y="weight", figsize=(12,5), xlim=(150, 190), ylim=(40, 80))程序輸出:
scale = (2, 2), heights standard deviation = [2.00995395 1.94059452] scale = (6, 6), heights standard deviation = [6.06434877 5.58389361]同樣是先觀察一下圖片,升級為2維數據后,收斂和發散的趨勢就更加鮮明了,如果這是槍靶數據,發散和收斂的含義非常清晰。但是由于這兩組數據是我們人工制造的,所以數據本身并沒有說明價值。只能說左側的人群受到相同的先天和后天因素的影響,身高和體重較為集中在標準范圍內;而右側的人群由于先天和后天因素都有很大差異(可以假設是從不同地區,不同職業,不同生活習慣等維度選出的),所以身高和體重的差異非常大。
參考
https://www.cnblogs.com/traditional/p/12629050.html
https://www.sharpsightlabs.com/blog/numpy-random-normal/
總結
 
                            
                        - 上一篇: 浅论三维标注技术的重要性
- 下一篇: 计算机软件的卸载,电脑里那些软件是不需要
