【程序员眼中的统计学(12)】相关与回归:我的线条如何? (转)
閱讀目錄
- 目錄
- 1 算法的基本描述
- 2 算法的應(yīng)用場景。
- 3算法的優(yōu)點和缺點
- 4 算法的輸入數(shù)據(jù)、中間結(jié)果以及輸出結(jié)果
- 5 算法的代碼參考
- 6 共享
相關(guān)與回歸:我的線條如何?
作者 白寧超
2015年10月25日22:16:07
摘要:程序員眼中的統(tǒng)計學(xué)系列是作者和團隊共同學(xué)習(xí)筆記的整理。首先提到統(tǒng)計學(xué),很多人認為是經(jīng)濟學(xué)或者數(shù)學(xué)的專利,與計算機并沒有交集。誠然在傳統(tǒng)學(xué)科中,其在以上學(xué)科發(fā)揮作用很大。然而隨著科學(xué)技術(shù)的發(fā)展和機器智能的普及,統(tǒng)計學(xué)在機器智能中的作用越來越重要。本系列統(tǒng)計學(xué)的學(xué)習(xí)基于《深入淺出統(tǒng)計學(xué)》一書(偏向代碼實現(xiàn),需要讀者有一定基礎(chǔ),可以參見后面PPT學(xué)習(xí))。正如(吳軍)先生在《數(shù)學(xué)之美》一書中闡述的,基于統(tǒng)計和數(shù)學(xué)模型對機器智能發(fā)揮重大的作用。諸如:語音識別、詞性分析、機器翻譯等世界級的難題也是從統(tǒng)計中找到開啟成功之門鑰匙的。尤其是在自然語言處理方面更顯得重要,因此,對統(tǒng)計和數(shù)學(xué)建模的學(xué)習(xí)是尤為重要的。最后感謝團隊所有人的參與。( 本文原創(chuàng),轉(zhuǎn)載注明出處:相關(guān)與回歸:我的線條如何? )
回到頂部目錄
【程序員眼中的統(tǒng)計學(xué)(1)】 信息圖形化:第一印象
【程序員眼中的統(tǒng)計學(xué)(2)】集中趨勢度量:分散性、變異性、強大的距
【程序員眼中的統(tǒng)計學(xué)(3)】概率計算:把握機會
【程序員眼中的統(tǒng)計學(xué)(4)】離散概率分布的運用:善用期望
【程序員眼中的統(tǒng)計學(xué)(5)】排列組合:排序、排位、排
【程序員眼中的統(tǒng)計學(xué)(6)】幾何分布、二項分布及泊松分布:堅持離散
【程序員眼中的統(tǒng)計學(xué)(7)】正態(tài)分布的運用:正態(tài)之美
【程序員眼中的統(tǒng)計學(xué)(8)】統(tǒng)計抽樣的運用:抽取樣本
【程序員眼中的統(tǒng)計學(xué)(9)】總體和樣本的估計:進行預(yù)測
【程序員眼中的統(tǒng)計學(xué)(10)】假設(shè)檢驗的運用:研究證據(jù)
【程序員眼中的統(tǒng)計學(xué)(11)】卡方分布的應(yīng)用
【程序員眼中的統(tǒng)計學(xué)(12)】相關(guān)與回歸:我的線條如何?
回到頂部1 算法的基本描述
1.1 算法描述
為了了解兩個變量(自變量和因變量)之間的相關(guān)關(guān)系,利用線性回歸法對二變量數(shù)據(jù)進行分析,得出最佳擬合線和相關(guān)系數(shù),從而通過一個變量的值,估計推測另一個變量的值。
1.2 定義
假如有一個二變量數(shù)據(jù)分布如下:
| X | x1 | x2 | x3 | x4 | …… | xn-2 | xn-1 | xn |
| Y | y1 | y2 | y3 | y4 | …… | yn-2 | yn-1 | yn |
變量X與Y的取值一一對應(yīng)且呈現(xiàn)線性相關(guān)的關(guān)系。
1.3 符號解釋
X:表示自變量
Y:表示因變量
xi:表示自變量的取值
yi:表示因變量的取值
1.4 計算方法
1、假設(shè)最佳擬合線的方程為:y=ax+b
2、計算自變量X和因變量Y的均值:,
3、利用最小二乘法回歸法求最佳擬合線的斜率:
4、計算最佳擬合線的切距:
5、由求得的斜率和切距得出最佳擬合線的方程:
6、計算自變量X和因變量Y的標準差:,
7、計算相關(guān)系數(shù):
8、通過相關(guān)系數(shù)判斷所求最佳擬合線與數(shù)據(jù)的擬合度,規(guī)則如下:
(1)如果相關(guān)系數(shù)的絕對值越接近1,則所求最佳擬合線的擬合度越高,可用于數(shù)據(jù)預(yù)測。
(2)如果相關(guān)系數(shù)的絕對值越接近0,則所求最佳擬合線的擬合度越低,不推薦用于進行預(yù)測(預(yù)測的結(jié)果可能不準確)。
回到頂部2 算法的應(yīng)用場景。
2.1 該場景下算法描述
案例描述:有一個不同場次的預(yù)計天晴時數(shù)和音樂會聽眾人數(shù)的關(guān)系數(shù)據(jù)樣本,利用這些數(shù)據(jù),如何基于音樂會當天預(yù)計天晴時數(shù)(小時)來估計出票情況。
2.2 該場景下算法定義
案例定義:有一個二變量數(shù)據(jù)同時給出預(yù)計天晴時數(shù)和音樂會聽眾人數(shù),如下所示:
| 天晴時數(shù)(小時) | 1.9 | 2.5 | 3.2 | 3.8 | 4.7 | 5.5 | 5.9 | 7.2 |
| 音樂會聽眾人數(shù)(百人) | 22 | 33 | 30 | 42 | 38 | 39 | 42 | 55 |
如果音樂會當天預(yù)計天晴時數(shù)可能為4.3小時,請問音樂會聽眾人數(shù)可能會有多少人?
2.3 該場景下算法中符號解釋
天晴時數(shù):表示自變量
聽眾人數(shù):表示因變量
2.4 該場景下算法計算方法
1、假設(shè)最佳擬合線的方程為:y=ax+b
2、計算天晴時數(shù)和聽眾人數(shù)的均值:
3、利用最小二乘法回歸法求最佳擬合線的斜率:
4、計算最佳擬合線的切距:
5、由求得的斜率和切距得出最佳擬合線的方程:
6、計算天晴時數(shù)和聽眾人數(shù)的標準差:
7、計算相關(guān)系數(shù):
8、通過相關(guān)系數(shù)判斷所求最佳擬合線與數(shù)據(jù)的擬合度并得出預(yù)測結(jié)果:
由于r接近1,說明音樂會聽眾人數(shù)和預(yù)計天晴時數(shù)之間有很強的正相關(guān)。換句話說,根據(jù)已有的數(shù)據(jù),利用最佳擬合線根據(jù)預(yù)計天晴時數(shù)給出了期望音樂會聽總?cè)藬?shù)的合理的良好估計。
當音樂會當天預(yù)計天晴時數(shù)可能為4.3小時,利用最佳擬合線方程,那么就可估計當天音樂會聽眾人數(shù)大約會是3868人。
回到頂部3算法的優(yōu)點和缺點
3.1 本算法優(yōu)點
優(yōu)點:發(fā)掘變量數(shù)據(jù)間的線性相關(guān)模式,并能為預(yù)測提出意見和結(jié)果。
3.2 本算法缺點
缺點: 只適用于對已有的數(shù)據(jù)信息進行估計,不一定適用于數(shù)據(jù)限制以外的范圍。以音樂會為例,當音樂會當天預(yù)計天晴時數(shù)可能為8小時,就不一定能良好估計聽眾人數(shù)可能會有多少人。
3.3 本算法適應(yīng)場景
呈因果關(guān)系的變量之間,由原因因素值估計預(yù)測結(jié)果因素值。如光照時長與水稻產(chǎn)量。
3.4 本算法不適應(yīng)場景
無因果關(guān)系的變量之間,例如,人的體重與身高。
3.5 本算法適用的數(shù)據(jù)類型
本算法適用于double數(shù)據(jù)類型,默認保留三位小數(shù),可以自行設(shè)定保留位數(shù)。
回到頂部4 算法的輸入數(shù)據(jù)、中間結(jié)果以及輸出結(jié)果
4.1 本算法輸入數(shù)據(jù)
?| 1 2 3 4 5 | * @param twoVarData double[][[],表示樣本數(shù)據(jù) * @param testiVar double,因變量測試值 * @param fraDigits int,結(jié)果保留幾位小數(shù) |
4.2 本算法中間結(jié)果
?| 1 2 3 4 5 6 7 8 9 10 11 | * @param iVarAvg double,表示自變量的均值 * @param dVarAvg double,表示因變量的均值 * @param slope double,表示最佳擬合線的斜率 * @param tangentDistance double,表示切距 * @param Sx double,表示自變量的標準差 * @param Sy double,表示因變量的標準差 |
?
4.3 本算法輸出結(jié)果
?| 1 2 3 | * @return result String[4],包含{斜率,切距,最佳擬合線方程,相關(guān)系數(shù)}結(jié)果字符型數(shù)值 * @return estValue double,因變量估計值 |
?
回到頂部5 算法的代碼參考
5.1 類和方法基本描述
類源碼:見源程序:Statistics.src.CorrelationAndRegression
利用相關(guān)與回歸原理計算二變量[自變量和因變量]數(shù)據(jù)的最佳擬合線,并通過最佳擬合線[y=a+bx]來挖掘二變量[自變量和因變量]數(shù)據(jù)之間的線性關(guān)系,從而通過自變量的值預(yù)測估計因變量的值。
5.2 類和方法調(diào)用接口
見源程序:Statistics.src.CorrelationAndRegression
CorrelationAndRegression.java 下包含如下方法:
calculateAvgValue(double[] varData,int fraDigits)//計算變量的均值
calculateSlope(double[][] twoVarData,int fraDigits) //計算最佳擬合線的斜率
calculateTangentDistance(double slope,double iVarAvg,double dVarAvg,int fraDigits) //計算最佳擬合線的切距
calculateStandardDeviation(double[] varData,int fraDigits)//計算變量的標準差
calculateCorrelationCoefficient(double slope,double Sx,double Sy,int fraDigits) //計算相關(guān)系數(shù)
calculateEstimatedValue(double slope,double tangentDistance,double testiVar,int fraDigits) //計算因變量的估計值
analyze(double[][] twoVarData,int fraDigits) //回歸分析并得出結(jié)果
調(diào)用封裝方法:Statistics.src.utils.ScoreUtil
ScoreUtil.java中的方法:
getFractionDigits(double, int) //對數(shù)值保留幾位小數(shù)
5.3 源碼
import utils.ScoreUtil;/*** 相關(guān)與回歸* @description 利用相關(guān)與回歸原理計算二變量[自變量和因變量]數(shù)據(jù)的最佳擬合線,* 并通過最佳擬合線[y=a+bx]來挖掘二變量[自變量和因變量]數(shù)據(jù)之間的關(guān)系,從而通過自變量的值預(yù)測估計因變量的值。* 應(yīng)用場景:例如,通過天氣狀態(tài)預(yù)測演唱會到場的人數(shù);或者通過光照時長來估計植物的生長情況。* 局限性:只能根據(jù)已有的數(shù)據(jù)信息進行估計,不一定適用于數(shù)據(jù)限制意外的范圍。* 例如,現(xiàn)有2000年到2010年的數(shù)據(jù)信息,就不能預(yù)測估計2010年以后的數(shù)據(jù)。* @author candymoon* @2015-8-13下午4:19:57*/ public class CorrelationAndRegression {/*** 求變量值的平均值(公式:平均值=總和/總數(shù))* @param varData 變量數(shù)據(jù)值* @param fraDigits 結(jié)果保留位數(shù)* @return 平均值*/public static double calculateAvgValue(double[] varData,int fraDigits){double avgValue = 0;int len = varData.length;//數(shù)組長度for (int i = 0; i < varData.length; i++) {avgValue += varData[i];}//計算均值avgValue = avgValue/len;//并將結(jié)果保留3位小數(shù)(四舍五入)String avgValue_String = ScoreUtil.getFractionDigits(avgValue, fraDigits);avgValue = Double.valueOf(avgValue_String);return avgValue;} /*** 計算最佳擬合線(y=a+bx)的斜率b* @description 最佳擬合線(y=a+bx)的斜率b的計算公式為:b=∑((x-xAvg)(y-yAvg))/∑(x-xAvg)2* ,其中x為自變量,xAvg為自變量均值,y為因變量,yAvg為因變量均值。* @param twoVarData 二變量數(shù)據(jù)* @param fraDigits 結(jié)果保留位數(shù)* @return 斜率*/public static double calculateSlope(double[][] twoVarData,int fraDigits){double slope = 0;//斜率double iVarAvg = 0;//自變量均值double dVarAvg = 0;//因變量均值//計算自變量均值和因變量均值iVarAvg = calculateAvgValue(twoVarData[0],fraDigits);dVarAvg = calculateAvgValue(twoVarData[1],fraDigits);int iVarLen = twoVarData[0].length;double numerator = 0;//分子 double denominator = 0;//分母//計算公式的分子和分母for (int i = 0; i < iVarLen; i++) {double x = twoVarData[0][i];double y = twoVarData[1][i];numerator += (x-iVarAvg)*(y-dVarAvg);denominator += (x-iVarAvg)*(x-iVarAvg);}//計算斜率slope = numerator/denominator;//并將結(jié)果保留幾位小數(shù)(四舍五入)String slope_String = ScoreUtil.getFractionDigits(slope, fraDigits);slope = Double.valueOf(slope_String);return slope;}/*** 計算最佳擬合線(y=a+bx)的切距a* @description 因為最佳擬合線要經(jīng)過點(自變量均值,因變量均值),所以其計算公式為:* a=dVarAvg-b*iVarAvg* @param slope 斜率* @param iVarAvg 自變量* @param dVarAvg 因變量* @param fraDigits 結(jié)果保留位數(shù)* @return 切距*/public static double calculateTangentDistance(double slope,double iVarAvg,double dVarAvg,int fraDigits){double tanDis = 0;//切距//計算切距tanDis = dVarAvg-(slope*iVarAvg);//并將結(jié)果保留3位小數(shù)(四舍五入)String tanDis_String = ScoreUtil.getFractionDigits(tanDis, fraDigits);tanDis = Double.valueOf(tanDis_String);return tanDis;}/*** 計算變量數(shù)據(jù)的標準差* @description 標準差計算公式為:標準差 =((var-varAvg)2/(n-1))^2* @param varData 變量數(shù)據(jù)* @param fraDigits 結(jié)果保留位數(shù)* @return 標準差*/public static double calculateStandardDeviation(double[] varData,int fraDigits){double standardDev = 0;//標準差double varAvg = 0;//變量均值double denominator = 0;//分母//計算變量均值varAvg = calculateAvgValue(varData,fraDigits);int varDataLen = varData.length;for (int i = 0; i < varDataLen; i++) {double var = varData[i];denominator += (var-varAvg)*(var-varAvg);}//計算標準差standardDev = Math.pow(denominator/(varDataLen-1),0.5);//并將結(jié)果保留3位小數(shù)(四舍五入)String standardDev_String = ScoreUtil.getFractionDigits(standardDev, fraDigits);standardDev = Double.valueOf(standardDev_String);return standardDev;}/*** 計算相關(guān)系數(shù)* @description 相關(guān)系數(shù)表示最佳擬合線與二變量數(shù)據(jù)的擬合程度,相關(guān)系數(shù)計算公式為:r = (b*Sx)/Sy;* r的取值范圍為[-1,1],當|r|越接近1,則表示擬合程度越高;當|r|越接近0,則表示擬合程度越低* (1)當r=-1時,表示完全負相關(guān);(2)當r=1時,表示完全正相關(guān);(3)當r=0時,表示不相關(guān)。* @param slope 斜率* @param Sx 自變量的標準差* @param Sy 因變量的標準差* @param fraDigits 結(jié)果保留位數(shù)* @return 相關(guān)系數(shù)*/public static double calculateCorrelationCoefficient(double slope,double Sx,double Sy,int fraDigits){double r = 0;//相關(guān)系數(shù)r = (slope*Sx)/Sy;//并將結(jié)果保留3位小數(shù)(四舍五入)String r_String = ScoreUtil.getFractionDigits(r, fraDigits);r = Double.valueOf(r_String);return r;}/*** 計算因變量的估計值* @description 利用最佳擬合線方程y=a+bx求解* @param slope 最佳擬合線的斜率* @param tangentDistance 最佳擬合線的切距* @param testiVar 測試自變量值* @param fraDigits 結(jié)果保留幾位小數(shù)* @return 因變量的估計值*/public static double calculateEstimatedValue(double slope,double tangentDistance,double testiVar,int fraDigits){double estValue = 0;//估計值//利用最佳擬合線方程y=a+bx求解estValue = tangentDistance+(slope*testiVar);//并將結(jié)果保留3位小數(shù)(四舍五入)String estValue_String = ScoreUtil.getFractionDigits(estValue, fraDigits);estValue = Double.valueOf(estValue_String);return estValue;}/*** 求斜率、切距、最佳擬合線、相關(guān)系數(shù)* @param twoVarData 二變量數(shù)據(jù)* @param testiVar 測試值* @param fraDigits 結(jié)果保留幾位小數(shù)* @return 字符串結(jié)果數(shù)組{斜率、切距、最佳擬合線、相關(guān)系數(shù)}*/public static String[] analyze(double[][] twoVarData,int fraDigits){String[] result = new String[4];//字符串結(jié)果數(shù)組String bestFittingLine = "";double iVarAvg = 0;//自變量均值double dVarAvg = 0;//因變量均值double b = 0;//斜率double a = 0;//切距double r = 0;//相關(guān)系數(shù)double Sx = 0;//自變量的標準差double Sy = 0;//因變量的標準差//計算自變量和因變量的均值iVarAvg = calculateAvgValue(twoVarData[0],fraDigits);dVarAvg = calculateAvgValue(twoVarData[1],fraDigits);//計算斜率b = calculateSlope(twoVarData,fraDigits);//計算切距a = calculateTangentDistance(b,iVarAvg,dVarAvg,fraDigits);//計算自變量和因變量的標準差Sx = calculateStandardDeviation(twoVarData[0],fraDigits);Sy = calculateStandardDeviation(twoVarData[1],fraDigits);//計算相關(guān)系數(shù)r = calculateCorrelationCoefficient(b,Sx,Sy,fraDigits);//組合最佳擬合線方程bestFittingLine = "y="+a+"+"+b+"x";//將結(jié)果加入到結(jié)果數(shù)組result[0]= b+"";result[1]= a+"";result[2]= bestFittingLine+"";result[3]= r+"";return result;}/*** @param args*/public static void main(String[] args) {/** iVar是independent variable(自變量)的縮寫* dVar是dependent variable(因變量)的縮寫*/double[] iVar = {1.9,2.5,3.2,3.8,4.7,5.5,5.9,7.2};//自變量值double[] dVar = {22,33,30,42,38,49,42,55};//因變量值double[][] twoVarData = new double[][]{iVar,dVar};//二變量數(shù)據(jù)int fraDigits = 3;//結(jié)果保留幾位小數(shù)數(shù) double testiVar = 4.3;//測試自變量值String[] result = analyze(twoVarData,fraDigits);double estValue = 0;//估計值System.out.println("-------------輸出結(jié)果---------------");System.out.println(" 斜率:"+result[0]+" 切距:"+result[1]);System.out.println(" 最佳擬合線:"+result[2]);System.out.println(" 相關(guān)系數(shù):"+result[3]);estValue = calculateEstimatedValue(Double.valueOf(result[0]),Double.valueOf(result[1]),testiVar,fraDigits);System.out.println(" 測試自變量值:"+testiVar);System.out.println(" 因變量估計值:"+estValue);System.out.println("----------------------------------");}}?
回到頂部6 共享
PPT:http://yunpan.cn/cFWAwExCtkmEd 訪問密碼 291e
開源代碼:http://yunpan.cn/cFWAFPNrvn6PV 訪問密碼 8208
http://www.cnblogs.com/baiboy轉(zhuǎn)載于:https://www.cnblogs.com/softidea/p/5225969.html
總結(jié)
以上是生活随笔為你收集整理的【程序员眼中的统计学(12)】相关与回归:我的线条如何? (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables实现网络防火墙及地址转换
- 下一篇: 跳转指令