離散概率分布的運用:善用期望
作者 白寧超
2015年10月15日0:37:02
摘要:程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨着科學技術的發展和機器智能的普及,統計學在機器智能中的作用越來越重要。本系列統計學的學習基於《深入淺出統計學》一書(偏向代碼實現,需要讀者有一定基礎,可以參見后面PPT學習)。正如(吳軍)先生在《數學之美》一書中闡述的,基於統計和數學模型對機器智能發揮重大的作用。諸如:語音識別、詞性分析、機器翻譯等世界級的難題也是從統計中找到開啟成功之門鑰匙的。尤其是在自然語言處理方面更顯得重要,因此,對統計和數學建模的學習是尤為重要的。最后感謝團隊所有人的參與。( 本文原創,轉載注明出處:離散概率分布的運用:善用期望 )
目錄
【程序員眼中的統計學(1)】 信息圖形化:第一印象
【程序員眼中的統計學(2)】集中趨勢度量:分散性、變異性、強大的距
【程序員眼中的統計學(3)】概率計算:把握機會
【程序員眼中的統計學(4)】離散概率分布的運用:善用期望
【程序員眼中的統計學(5)】排列組合:排序、排位、排
【程序員眼中的統計學(6)】幾何分布、二項分布及泊松分布:堅持離散
【程序員眼中的統計學(7)】正態分布的運用:正態之美
【程序員眼中的統計學(8)】統計抽樣的運用:抽取樣本
【程序員眼中的統計學(9)】總體和樣本的估計:進行預測
【程序員眼中的統計學(10)】假設檢驗的運用:研究證據
【程序員眼中的統計學(11)】卡方分布的應用
【程序員眼中的統計學(12)】相關與回歸:我的線條如何?
1 離散概率分布
1 定義
設離散型隨機變量X所有可能得取值 Xi (i=1,2,3…….n),且事件{X=xi }的概率為P{X=xi }= pi ,此稱為離散型隨機變量的概率分布或分布列,即離散概率分布。用表格可表示:
作為一個離散概率分布,應滿足以下兩個性質:
在日常生活中此類例子不勝枚舉,比如,扔一枚或多枚硬幣,出現正面朝上的次數。
2 基本概念
離散隨機變量
若一個隨機變量X的所有可能的取值為有限個或無限可數個, 則稱它為離散型隨機變量。例如,玩一次游戲機可獲收益的金額。
期望
在概率論和統計學中,期望為期望值的簡稱,是指在一個離散型隨機變量試驗中每次可能結果的概率乘以其結果的總和。隨機變量X的期望通常寫作E(X),但有時也會寫作μ(繆),也就是均值的符號。下面是E(X)的計算式:
假設下表1為游戲機的概率分布:
游戲機收益的期望:
方差
方差是各個數據分別與其平均數之差的平方的和的平均數,用字母D表示。在概率論和數理統計中,方差用來度量隨機變量和其數學期望(即均值)之間的偏離程度。概率分布的方差通常寫作Var(X)或D(X),下面是Var(X)的計算式:
由上表1為例,游戲機收益的方差:
標准差
即方差的平方根,表示隨機變量值與期望之間的距離。標准差通常用σ(西格瑪)表示,計算式為: ,由上面求出的方差,可知游戲機收益的標准差是 1.642,這表示從平均情況老看,我們的每一局收益與期望收益-0.77之間的距離是1.642。
3 隨機變量的線性關系
假設隨機變量Y與游戲機收益的隨機變量X滿足Y=aX+b的線性關系,則Y的概率分布可用表2表示為:
且隨機變量Y的期望E(Y)和方差Var(Y)滿足以下線性關系:
4 獨立觀察值
定義:具有與同一隨機變量相同的概率分布且互不相干的觀測值。例如,一台游戲機先后兩次出現的收益結果。
觀測值速算法求期望和方差:
5 隨機變量的獨立性應用
如果X與Y是獨立隨機變量,則有:
E(X+Y) = E(X) + E(Y)
E(X-Y) = E(X) - E(Y)
Var(X+Y) = Var(X) + Var(Y)
Var(X-Y) = Var(X) + Var(Y)
同理,X與Y的線性變換的期望和方差:
E(aX+bY) = aE(X) + bE(Y)
E(aX-bY) = aE(X) - bE(Y)
Var(aX+bY) = Var(X) + Var(Y)
Var(aX-bY) = Var(X) + Var(Y)
隨機變量的獨立性應用的實例也不叫常見,例如,玩一次兩台不同游戲機的總收益。
2 內容擴展
1 分數處理工具類Java代碼實現
/**
* @ClassName ScoreUtil
* @Description 分數處理工具類
* @author candymoon
* @Date 2014-4-25
*/
public class ScoreUtil {
/**
* 使用java正則表達式去掉多余的.與0
* @param s
* @return
*/
public static String subZeroAndDot(String s){
if(!s.isEmpty()&&s!=""){
if(s.indexOf(".") > 0){
s = s.replaceAll("0+?$", "");//去掉多余的0
s = s.replaceAll("[.]$", "");//如最后一位是.則去掉
//如果現在還包含小數部分
if(s.indexOf(".")>0){
double db = Double.valueOf(s);
float retscorce = (float)(Math.round(db*10))/10;
return retscorce+"";
}
}
}
return s;
}
/**
* @Title: caculateScoreByProportion
* @Description: 按比例計算出分數
* @author candymoon
* @date 2014-4-28 下午3:23:03
* @param curProportion
* @param curScorceInfo
* @return
*/
public static String caculateScoreByProportion(String curProportion,String curScorceInfo){
//分數 當前分數為0分
if(!curScorceInfo.isEmpty()&&curScorceInfo!=""){
return "0";
}
float scorceInfo = Float.valueOf(curScorceInfo);
float proportion = Float.valueOf(curProportion)/100;
float retscorce = (float)(Math.round(scorceInfo*proportion*10))/10;
return retscorce+"";
}
/**
* @Title: addScore
* @Description: 計算2個得分
* @author candymoon
* @date 2014-4-28 下午3:51:03
* @param beforescorceInfo
* @param aftercorceInfo
* @return
*/
public static String addScore(String beforescorceInfo,String aftercorceInfo){
float beforescorceInfo1 = Float.valueOf(beforescorceInfo);
float aftercorceInfo2 = Float.valueOf(aftercorceInfo);
return (beforescorceInfo1+aftercorceInfo2)+"";
}
/**
* 將double類型數據轉換為百分比格式,並保留小數點前IntegerDigits位和小數點后FractionDigits位
* @author candymoon
* @param d
* @param IntegerDigits
* @param FractionDigits
* @return
*/
public static String getPercentFormat(double d,int IntegerDigits,int FractionDigits){
NumberFormat nf = java.text.NumberFormat.getPercentInstance();
nf.setMaximumIntegerDigits(IntegerDigits);//小數點前保留幾位
nf.setMinimumFractionDigits(FractionDigits);// 小數點后保留幾位
String str = nf.format(d);
return str;
}
/**
*
* @param d
* @return
*/
public static String getPercentFormat(double d){
DecimalFormat df = new DecimalFormat(".00");
String str = df.format(d);
float con = Float.valueOf(str);
con = con*100;
str = (int)con+"%";
return str;
}
/**
* 獲取指定小數位的字符串
* @param fractionDigits (四舍五入)保留幾位小數
* @return
*/
public static String getFractionDigits(double dvalue,int fractionDigits){
String decimalFormat = "%."+fractionDigits+"f";
String valueString = String.format(decimalFormat,dvalue);
//System.out.println(valueString);
return valueString;
}
public static void main(String[] args) {
System.out.println(ScoreUtil.caculateScoreByProportion("40", "62"));
System.out.println(getPercentFormat(111.0123,3,3));
getFractionDigits(0.0,3);
//System.out.println(getFractionDigits(12438.45687,3));
//System.out.println(getFractionDigits(12438.00,3));
}
2 離散型概率分布(求期望、方差、標准差)
/**
* 離散型概率分布(求期望、方差、標准差)
* @author 白寧超
* @2015-7-31下午2:51:07
*/
public class DiscreteProbabilityDistribution {
/**
* 計算期望
* @param data 離散概率分布數據
* @return
*/
public static double calculateExpectedValue(double[][] data){
int len = data[0].length;
double Ex = 0;//x分布期望值
//循環疊加計算期望值
for (int i = 0; i < len; i++) {
Ex += data[0][i]*data[1][i];
}
//並將結果保留3位小數(四舍五入)
String Ex_String = ScoreUtil.getFractionDigits(Ex, 3);
Ex = Double.valueOf(Ex_String);
System.out.println("期望:"+Ex);
return Ex;
}
/**
* 計算方差
* @param data 離散概率分布數據
* @return
*/
public static double calculateVariance(double[][] data){
double Ex = calculateExpectedValue(data);
double Ex2 = 0;//x平方分布的期望值
double variance = 0;//方差
int len = data[0].length;
//循環疊加計算期望值
for (int i = 0; i < len; i++) {
Ex2 += data[0][i]*data[0][i]*data[1][i];
}
//方差計算公式:D(X) = E(X2)- E(X)*E(X)
variance = Ex2-(Ex*Ex);
//並將結果保留3位小數(四舍五入)
String variance_String = ScoreUtil.getFractionDigits(variance, 3);
variance = Double.valueOf(variance_String);
System.out.println("方差:"+variance);
return variance;
}
/**
* 計算標准差
* @param data 離散概率分布數據
* @return
*/
public static double calculateStandardDeviation(double[][] data){
double variance = calculateVariance(data);
double sd = Math.pow(variance, 0.5);//求一個數的開根號值
//並將結果保留3位小數(四舍五入)
String sd_String = ScoreUtil.getFractionDigits(sd, 3);
sd = Double.valueOf(sd_String);
System.out.println("標准差:"+sd);
return sd;
}
/**
* 計算離散概率分布的期望、方差和標准差
* @param data 概率分布數據
* @return 包含期望、方差和標准差的數組 double[]{Ex,variance,sd};
*/
public static double[] calculateEVAndVarAndSD(double[][] data){
//變量定義
int len = data[0].length;
double Ex = 0;//x分布期望值
double Ex2 = 0;//x平方分布的期望值
double variance=0;//方差
//計算x期望值和項x平方的期望值,並將結果保留3位小數(四舍五入)
for (int i = 0; i < len; i++) {
Ex += data[0][i]*data[1][i];
Ex2 += data[0][i]*data[0][i]*data[1][i];
}
String Ex_String = ScoreUtil.getFractionDigits(Ex, 3);
Ex = Double.valueOf(Ex_String);
//計算方差並將結果保留3位小數(四舍五入)
variance = Ex2-(Ex*Ex);
String variance_String = ScoreUtil.getFractionDigits(variance, 3);
variance = Double.valueOf(variance_String);
//計算標准差並將結果保留3位小數(四舍五入)
double sd = Math.pow(variance, 0.5);//求一個數的開根號值
String sd_String = ScoreUtil.getFractionDigits(sd, 3);
sd = Double.valueOf(sd_String);
System.out.println("期望:"+Ex+" 方差:"+variance+" 標准差:"+sd);
return new double[]{Ex,variance,sd};
}
/**
* @param args
*/
public static void main(String[] args) {
double[][] data = new double[][]{{1,2,3,4,5},{0.2,0.2,0.2,0.2,0.2}};
calculateStandardDeviation(data);
calculateEVAndVarAndSD(data);
}
3 開源共享
PPT:http://yunpan.cn/cFjaeaZuc2FFW 訪問密碼 916f
開源代碼:http://yunpan.cn/cFja8JiHJ9LKM訪問密碼 6812