【程序員眼中的統計學(2)】集中趨勢度量:分散性、變異性、強大的距


 集中趨勢度量:分散性、變異性、強大的距

作者 白寧超
2015年10月14日10:13:13

摘要:程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨着科學技術的發展和機器智能的普及,統計學在機器智能中的作用越來越重要。本系列統計學的學習基於《深入淺出統計學》一書偏向代碼實現,需要讀者有一定基礎,可以參見后面PPT學習)。正如(吳軍)先生在《數學之美》一書中闡述的於統計和數學模型對機器智能發揮重大的作用。諸如:語音識別、詞性分析、機器翻譯等世界級的難題也是從統計中找到開啟成功之門鑰匙的。尤其是在自然語言處理方面更顯得重要,因此,對統計和數學建模的學習是尤為重要的。最后感謝團隊所有人的參與。( 本文原創,轉載注明出處集中趨勢度量:分散性、變異性、強大的距  )

 目錄


【程序員眼中的統計學(1)】 信息圖形化:第一印象

【程序員眼中的統計學(2)】集中趨勢度量:分散性、變異性、強大的距

【程序員眼中的統計學(3)】概率計算:把握機會

【程序員眼中的統計學(4)】離散概率分布的運用:善用期望

【程序員眼中的統計學(5)】排列組合:排序、排位、排

【程序員眼中的統計學(6)】幾何分布、二項分布及泊松分布:堅持離散

【程序員眼中的統計學(7)】正態分布的運用:正態之美

【程序員眼中的統計學(8)】統計抽樣的運用:抽取樣本

【程序員眼中的統計學(9)】總體和樣本的估計:進行預測

【程序員眼中的統計學(10)】假設檢驗的運用:研究證據

【程序員眼中的統計學(11)】卡方分布的應用

【程序員眼中的統計學(12)】相關與回歸:我的線條如何?

1 平均值


1.1 均值算法的描述

均值的定義

均值有兩種計算方法:第一種計算方式是:將所有的數字加起來,然后除以數字的個數 。可用記為:µ=∑x/n

另一種計算方法是把每個數的頻數考慮進去了的,它表示如下:µ=∑fx/f

均值符號定義

n:表示的是輸入的數據的個數

µ:為數據的均值

∑:表示所有數據之和

均值算法中的計算方法

  1. 統計出輸入數據的個數n
  2. 計算出所有的數據之和 sum
  3. 計算出數據的均值avg=sum/n

1.2 均值算法的應用場景

案例描述:俱樂部中,各個舞蹈班的人數的清單為:1人,2人,3 人,4人,5人,6人,7人。

均值算法在該場景的定義

案例定義:這個俱樂部舞蹈班的總人數為28,總共有7個舞蹈班,知道了總的人數和總共有多少個班級,即可求出舞蹈班人數的均值。

該場景下算法中符號解釋

n:用來統計輸入的舞蹈班的個數

list:用來存儲輸入的舞蹈班的人數

sum:表示所有舞蹈班的人數之和

avg:表示n個舞蹈班的人數的均值

該場景下算法計算方法

案例中俱樂部舞蹈班的人數的總和為:sum=1+2+3+4+5+6+7,sum=28,  

統計出俱樂部中舞蹈班級的個數為:n=7

計算出該俱樂部的人數的均值為:avg=sum/n,avg=28/7=4 ,

1.3 本算法優缺點

  • 優點:能夠快速准確地計算出均值
  • 缺點: 在輸入的數據過多時,會產出一定的誤差。
  • 本算法采用的數據類型:本算法適用於double數據類型。

1.4 算法的輸入數據、中間結果以及輸出

本算法輸入數據

* @param    i   double,表示輸入的數據

* @param    list   List,存儲輸入的數據

 算法中間結果

* @param   sum   double,表示輸入的所有的數據之和

 本算法輸出結果

* @return avg  double,表示數據的均值

 1.5 算法中的異常及處理辦法

本算法可能異常或誤差

異常1:輸入數據不合法,如:輸入字母。

異常2:輸入數據特別大,會產生誤差。

本算法異常或誤差處理

異常1:解決,輸入不合法給予提示。

異常2:解決,擴大數據占有的空間

1.6 算法的代碼參考

源碼:

    /**
     * @Title: set
     * @Description: 數據賦值
     * @param a存儲的是輸入的數據
     * @author cy
     * @date 2015-7-29
     */
    public static void set(double a[]) {

        b = a;
        n=a.length;
    }

    /**
     * @Title: avg
     * @Description: 計算平均值
     * @param a存儲輸入的數據
     * @param sum 表示輸入的所有的數據之和
     * @param avg表示數據的均值
     * @author cy
     * @date 2015-7-29
     */
    public static void avg(double a[]) {
        // 定義一個平均值、和
        double sum = 0;
        for (double i : a) {
            sum += i;
        }

        System.out.println("平均值為:" + sum / n);

    }

類和方法基本描述

類源碼:見源程序:Average.java

該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,均值avg=sum/n;

類和方法調用接口

見源程序:Average.java

Average.java下包含如下方法:

List<Double> input()  //輸入數據的函數

set(List<Double> list)  //數據賦值

avg(List<Double> list)  //計算均值的方法

2 中位數值


2.1 中位數算法的描述

中位數的定義永遠處於一組數據的中間,它是個中間值

中位數均值符號定義

n:表示的是輸入的數據的個數

中位數算法中的計算方法

  1. 按順序排列數字:從最小值排列到最大值
  2. 如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2
  3. 如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2。兩個中間數分別位於這個中間數位置的兩側

2.2 中位數算法的應用場景

案例描述:有兩組數據,分別求出兩組數據的中位數,並比較兩組數據的中位數的情況。

年齡

19

20

21

147

145

頻數

3

6

3

1

1

1     1     1     2     2     2     2     3     3     31   31   32   32   32   32   33   33   33

中位數算法在該場景的定義

案例定義:將兩組數據輸入到算法中,算法中用數組list接受,之后,算法就會自動的算出這兩組數據的中位數。

該場景下算法中符號解釋

n:用來統計輸入數據個數

list:用來存儲輸入數據

該場景下算法計算方法

①按順序排列數字:

1     1     1     2     2     2     2     3     3     31   31   32   32   32   32   33   33   33

②如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2:

③如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2:

該組數據中有18個數據為偶數。因此,用③中的方法,求出該組數據的中位數是17

2.3 本算法優缺點

  • 優點:能夠快速准確地計算出數據的中位數
  • 缺點: 在輸入的數據過多時,會產出一定的誤差。
  • 本算法適用於double數據類型。

2.4 算法的輸入數據、中間結果以及輸出

本算法輸入數據

* @param    i   double,表示輸入的數據

本算法中間結果

* @param    list   List,存儲輸入的數據

本算法輸出結果

* @return med  double,表示數據的中位數

2.5 算法中的異常及處理辦法

本算法可能異常或誤差

異常1:輸入數據不合法,如:輸入字母。

異常2:輸入數據特別大,會產生誤差。

本算法異常或誤差處理

異常1:解決,輸入不合法給予提示。

異常2:解決,擴大數據占有的空間

2.6 算法的代碼參考

源碼:

    /**
     * @Title: med
     * @Description: 找中位數
     * @param a存儲輸入的數據
     * @param med表示中位數
     * @param n表示中位數的個數
     * @author cy
     * @date 2015-7-29
     */
    public static void med(double a[]) {
        // 定義中位數
        double med;
        // 對數據進行排序
        Arrays.sort(a);
        // 數據個數為奇數的情況
        if (n % 2 == 1) {
            med = a[(n+1)/2];
            // 數據個數為偶數的情況
        } else {
            med = (a[n / 2 ] + a[n/2+1]) / 2.0;
        }
        System.out.println("該組數據的中位數為:" + med);
    }

類和方法基本描述

類源碼:見源程序:Median.java

算法中首先按輸入的數據存入到數組List中(輸入時以輸入0為結束),再講數組中的數字順序排列:從最小值排列到最大值,如果有奇數個數值,則中位數為位於中間的數值。如果有n個數,則中間數的位置為(n+1)/2,如果有偶數個數值,則將兩個中間數相加,然后除以2.中間位置的算法是:(n+1)/2。兩個數分別位於這個中間數位置的兩側。

類和方法調用接口

見源程序:Median.java

Median.java下包含如下方法:

List<Double> input()  //輸入數據的函數

set(List<Double> list)  //數據賦值

med(List<Double> list)  //找出數據中的中位數

3 眾數


3.1 眾數算法的描述

眾數的定義

眾數:即頻率最大的數,與均值和中位數不同,眾數必須是數據集中的一個數值,而且是最頻繁出現的數值。

眾數符號定義

n:表示的是輸入的數據的個數

眾數算法中的計算方法

眾數的三步法:

  1. 把數據中的不同類別或數值全部找出來。
  2. 寫出每個數值或類別的頻數。
  3. 挑出具有最高頻數的一個或幾個數值,得出眾數。

3.2 眾數算法的應用場景

案例描述:有一組數據,求出這組數據的眾數。

 

年齡

19

20

21

147

145

頻數

3

6

3

1

1

眾數算法在該場景的定義

案例定義:將這組數據輸入到算法中,算法中用數組map接受,之后,算法就會自動的算出這組數據的眾數。

該場景下算法中符號解釋

n:用來統計輸入的值個數

map:用來存儲輸入的值和值出現的頻數

tm:存儲頻數

max:表示最大的頻數的值

該場景下算法計算方法

①首先按照要求將上述的數據輸入到算法中,並以輸入兩個#號為結束。

②將輸入的數據的頻數存儲到數組tm中

③找出tm數組中最大的數

④輸出tm中與max值相同的數,即為要求的眾數。

3.3 本算法優缺點

  • 優點:能夠快速准確地計算出眾數
  • 缺點: 在輸入的數據過多時,會產出一定的誤差。
  • 本算法適用於double數據類型,String類型。

3.4 算法的輸入數據、中間結果以及輸出

本算法輸入數據

* @param    i   double,表示輸入的數據

* @param    map  Map,存儲輸入的值和該值出現的次數

本算法中間結果

* @param   tm   int[],存儲值得頻數

* @param   max   int 存儲頻數的最大值

本算法輸出結果

* @return   int,表示數據的眾數

3.5 算法中的異常及處理辦法

本算法可能異常或誤差

異常1:輸入數據特別大,會產生誤差。

本算法異常或誤差處理

異常1:解決,擴大數據占有的空間

3.6 算法的代碼參考

源碼:

    // 用於統計輸入了多少數據
    static int n = 0;
    static String a1[];
    static int b1[];
    /**
     * @Title: set
     * @Description: 數據賦值
     * @param a存儲輸入的數值,b數值出現的次數
     * @author cy
     * @date 2015-7-29
     */
    public static void set(String a[],int b[]) {

        a1=a;
        b1=b;
        n=b.length;
    }

    /**
     * 找眾數
     * @param n輸入的數據的個數
     * @param b存儲數值出現的次數的數組
     * @param max表示次數的最大值
     */
    public static void zs(String a[],int b[]) {
        int i = 0;
        Arrays.sort(b);
        // 數組b中的最大值
        int max;
        // 獲取數組中的最大值
        max = b[b.length - 1];
        System.out.print("眾數為:");
        for (int j =0;j<b.length;j++){
            if(b[j]==max){
                System.out.println(a[j]);
            }
        }
        // 通過max得出數據的眾數
    }

類和方法基本描述

類源碼:見源程序:Mode.java

算法中利用Map(映射,集合中的每一個元素包含一對鍵對象和值對象,鍵對象對應數據中的數值,值對象對應數值出現的頻數)來存儲輸入的數據,將數據存入到map中,以輸入兩個#為輸入結束。將map中的值對象即頻數讀出存入到數組tm中,在對數組tm進行排序,求出數組tm中的最大值max,最后將所有的最大值輸出即得到眾數。

類和方法調用接口

見源程序:Mode.java

Mode.java下包含如下方法:

Map<String, Object> input()  //輸入數據的函數

set(Map<String, Object> map)  //數據賦值

zs(Map<String, Object> map) //找出數據的眾數

4 方差


4.1 方差算法的描述

方差的定義

方差:量度數據分散性的一種方法,是數據與均值的距離的平方數的平值。

方差公式:∑(x-μ)^2/n

方差符號定義

n:表示的是輸入的數據的個數

u:為數據的均值

∑:表示所有數據之和

方差算法中的計算方法

n:表示的是輸入的數據的個數

u:為數據的均值

∑:表示所有數據之和

4.2 方差算法的應用場景

案例描述:有一組數據,求出這組數據的方差情況。

1     1     1     2     2     2     2     3     3     31   31   32   32   32   32   33   33   33

方差算法在該場景的定義

案例定義:將這組數據輸入到算法中,算法中用數組list接受,之后,算法就會先計算出這一組數據的均值,再統計出該組數據的個數,最后,計算出這組數據的方差。

該場景下算法中符號解釋

n:用來統計輸入的數據個數

list:用來存儲輸入數據

sum:表示所有的數據之和

u:表示n個數據的均值

該場景下算法計算方法

案例中數據的和:sum=306 ,

統計數據的個數為:n=18

計算出該組數據的均值為:avg=sum/n,avg=17 ,

再計算出該組數據的方差為226.4083044982699

4.3 本算法優缺點

  • 優點:能夠快速准確地計算出方差
  • 缺點: 在輸入的數據過多時,會產出一定的誤差。
  • 本算法適用於double數據類型。

4.4 算法的輸入數據、中間結果以及輸出

本算法輸入數據

* @param    i   double,表示輸入的數據

* @param    list   List,存儲輸入的數據

本算法中間結果

* @param   sum   double,表示輸入的所有的數據之和

* @param   n   int,表示輸入的數據的個數

* @param   u   double表示數據的平均值

本算法輸出結果

* @return fc  double,表示數據的方差

4.5 算法中的異常及處理辦法

本算法可能異常或誤差

異常1:輸入數據不合法,如:輸入字母。

異常2:輸入數據特別大,會產生誤差。

本算法異常或誤差處理

異常1:解決,輸入不合法給予提示。

異常2:解決,擴大數據占有的空間

4.6 算法的代碼參考

源碼:

    /**
     * @Title: calFac
     * @Description: 計算方差
     * @param a存儲輸入的數據
     * @param sum1所有的數據之和
     * @param u所有的數據的均值
     * @author cy
     * @date 2015-7-29
     */
    public static double calFac(double a[]) {

        // 數據的平均值
        double u;
        // 存儲數據之和
        double sum1 = 0;
        for (double s : a) {
            sum1 += s;
        }
        // 計算平均值
        u = sum1 / n;
        for (double s : a) {
            sum = sum + (s) * (s);
        }
        return (sum / n - u * u);
    }
    /**
     * @Title: fac
     * @Description: 輸出方差
     * @param a存儲輸入的數據
     * @author cy
     * @date 2015-7-29
     */
    public static void fac(double a[]) {

        System.out.println("方差為:" + calFac(a));
    }

 

類和方法基本描述

類源碼:見源程序:Facha.java

方差算法的描述:方差是數據與均值的距離的平方數的平值。該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,再求出數據的均值u=sum/n;最后根據方差的快速計算公式得出方差的值。

類和方法調用接口

見源程序:Facha.java

Facha.java下包含如下方法:

List<Double> input()  //輸入數據的函數

set(List<Double> list)  //數據賦值

5 標准差


5.1 標准差算法的描述

標准差的定義

標准差:是描述典型值與均值距離的一種方法,標准差越小,數值離均值越近 。

標准差公式:σ=方差開方

注:標准差也有可能為0,如果每個數值與均值的距離都是為0,則標准差將為0。

標准差符號定義

n:表示的是輸入的數據的個數

u:為數據的均值

∑:表示所有數據之和

σ:表示標准差

標准差算法中的計算方法

1、計算出該組數據的均值u

2、再統計該組數據的個數n

3、利用方差的公式計算出方差

4、利用標准差的公式計算出標准差

5.2 標准差算法的應用場景

案例描述:有一組數據,求出這組數據的標准差情況。

1     1     1     2     2     2     2     3     3     31   31   32   32   32   32   33   33   33

標准差算法在該場景的定義

案例定義:將這組數據輸入到算法中,算法中用數組list接受,之后,算法就會先計算出這一組數據的均值,再統計出該組數據的個數,計算出這組數據的方差,最后計算出該組數據的標准差。

該場景下算法中符號解釋

n:用來統計輸入的數據個數

list:用來存儲輸入數據

sum:表示所有的數據之和

u:表示n個數據的均值

該場景下算法計算方法

案例中數據的和:sum=306,

統計數據的個數為:n=18

計算出該組數據的均值為:avg=sum/n,avg=17 ,

再計算出該組數據的方差為226.408304498269

最后計算出該組數據的標准差:15.129074290546956

5.3 本算法優缺點

  • 優點:能夠快速准確地計算出標准差
  • 缺點: 在輸入的數據過多時,會產出一定的誤差。
  • 本算法適用於double數據類型。

5.4 算法的輸入數據、中間結果以及輸出

本算法輸入數據

** @param    i   double,表示輸入的數據

* @param    list   List,存儲輸入的數據

本算法中間結果

* @param   sum   double,表示輸入的所有的數據之和

* @param   n   int,表示輸入的數據的個數

* @param   u   double表示數據的平均值

本算法輸出結果

* @return bzc  double,表示數據的方差

5.5 算法中的異常及處理辦法

本算法可能異常或誤差

異常1:輸入數據不合法,如:輸入字母。

異常2:輸入數據特別大,會產生誤差。

本算法異常或誤差處理

異常1:解決,輸入不合法給予提示。

異常2:解決,擴大數據占有的空間

5.6 算法的代碼參考

源碼:

    /**
     * @Title: fac
     * @Description: 計算標准差
     * @param a存儲輸入的數據
     * @param sum1所有的數據之和
     * @param u所有的數據的均值
     * @author cy
     * @date 2015-7-29
     */
    public static void bzc(double a[]){
        double bzc;
        // 計算方差
        bzc = calFac(a);
        // 標准差=方差開根號
        System.out.println("標准差為:" + Math.sqrt(bzc));
    }

 

類和方法基本描述

類源碼:見源程序:Bzc.java

該算法首先接受輸入的n個數據(輸入時以輸入0為結束),將其存入到List數組list中,再求出這些數據的總和sum,再求出數據的均值u=sum/n;最后根據方差的快速計算公式得出方差的值,將方差的值開根號即得到標准差的值。

類和方法調用接口

見源程序:Bzc.java

Bzc.java下包含如下方法:

List<Double> input()  //輸入數據的函數

set(List<Double> list)  //數據賦值

bzc(List<Double> list)  //計算方差的方法

6 本章補充


6.1 基本概念

全距

全距:也叫極差,是用於來量度數據集分散程度的一種方法。

其算法為:上界減去下界,其中上界為最大值,下界為最小值。

  • 優點:全距是量度數據分散程度的既簡單又方便的方法。
  • 缺點:全距僅僅描述了數據的寬度,並沒有描述數據在上下界之前的分布形態,不能體現數據的實際分布形態。並且,全距很容易受到異常值的影響。

擺脫異常值的辦法:四分位數

四分位法:它將數據一分為四,最小的四分位數稱為下四分位數,最大的四分位數稱為上四分位數,中間的四分位數即為中位數。

 四分位距=上四分位數-下四分位數

求下四分位數的位置

①首先計算n/4

②如果結果為整數,則下四分位數位於“n/4”這個位置和下一個位置的中間取這兩個位置上的數值的平均值,即得到下四分位數。

③如果“n/4”不是整數,則向上取整,結果即為下四分視為數的位置。

例如:如果你有6個數,首先計算6/4,得到1.5.向上取整的得到2,這表示下四分數的位置為2.

求上四分位數的位置

①首先計算3n/4

②如果結果為整數,則上四分位數位於“3n/4”這個位置這個位置和下一位置的中間,取這兩個位置上的數值的平均值,即得到上四分位數。

③如果“3n/4”不是整數,則向上取整,所得到的新數字即為上四分位數的位置。 

百分位數:是將數據一分為百的數值。

箱線圖

用箱線圖繪制各種“距”

創建箱線圖:首先按標度畫出一個“箱”,想的左右兩邊分布代表下四分位數和上四分位數,然后在箱中畫出一條線,標示中位數,這個箱的寬度就是四分距的寬度,隨后,在箱的兩邊畫出“線”,顯示出全距的上界、下界和寬度。以下就是之前提到的舞蹈者的得分的箱線圖。

舞蹈者A的全距相對較小,她的得分中位數比舞蹈者B的高一些,舞蹈者B的全距非常大,有時候這位舞蹈者的得分比舞蹈者A高很多,但是有時又低很多,舞蹈者A發揮更穩定,通常得分高於舞蹈者B,所以,我們會選擇舞蹈者A

標准分

標准分是對不同環境下的相關數據進行比較的一種方法,可以對不同數據集的數據進行比較,可以使用標准分比較舞蹈者相對於其本人歷史紀錄的表現。

標准分的計算公式:z=(x-μ)/σ

計算標准分:

6.2 小結

學習的統計量:均值、中位數、眾數,它們只是讓我們知道了數據中心的情況,即數據集中的典型的具有代表性的數值,而第三章學的知識對讓我們對一個數據集有了更完整的了解,知道了數據集中數值的實際的分布形態,有助於我們對數據更好的掌握。

            

本章主要講的是分散性和變異性的量度,分散性的量度主要有全距(容易受異常值的影響)、四分位距(擺脫了異常值得影響)。異常性的量度主要有方差、標准差、標准分

7 開源共享 


 PPT:http://yunpan.cn/cFZnmrDr3rKQt    訪問密碼 27ba

開源代碼:http://yunpan.cn/cFZnjmcvzRsyg    訪問密碼 bf10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM