更新時(shí)間:2019年10月10日18時(shí)29分 來源:傳智播客 瀏覽次數(shù):
一、問題引入
我們都參加過高考,據(jù)統(tǒng)計(jì),高考的物理成績(jī)確實(shí)與數(shù)學(xué)成績(jī)有一定關(guān)系,但除此之外,還存在很多影響物理成績(jī)的因素,例如:是否喜歡物理,用在物理上的時(shí)間等。而當(dāng)我們主要考慮數(shù)學(xué)成績(jī)對(duì)物理的影響時(shí),就是要考察這兩者之間的相關(guān)關(guān)系。
現(xiàn)實(shí)生活中還有很多的相關(guān)關(guān)系,如
1.商品銷售輸入與廣告支出經(jīng)費(fèi)之間的關(guān)系,銷售輸入與廣告支出有著密切的關(guān)系,但是還與商品質(zhì)量、居民收入等因素有關(guān)。
2.糧食產(chǎn)量與施肥量之間的關(guān)系。在一定范圍內(nèi),施肥量越大,糧食生產(chǎn)就越高。除此之外,糧食產(chǎn)量還受到土壤質(zhì)量、降雨量等的影響。
3.人體內(nèi)脂肪的含量與年齡之間的關(guān)系。在一定年齡段內(nèi),隨著年齡的增長(zhǎng),人體內(nèi)的脂肪含量會(huì)增加,但人體內(nèi)的脂肪含量還和飲食習(xí)慣,體育鍛煉有關(guān)系,可能還與先天
體質(zhì)有關(guān)系。
對(duì)于上述兩個(gè)變量之間的關(guān)系,應(yīng)該說都可以根據(jù)經(jīng)驗(yàn)做出相應(yīng)的判斷,因?yàn)?ldquo;經(jīng)驗(yàn)當(dāng)中有規(guī)律”,但是,不管你經(jīng)驗(yàn)多么豐富,如果只憑借經(jīng)驗(yàn)辦事,還是很容易出錯(cuò)。因此在分析兩個(gè)變量之間的相關(guān)關(guān)系時(shí),我們需要一些說服力的辦法。
在尋找變量之間的相關(guān)關(guān)系中,統(tǒng)計(jì)同樣發(fā)揮著非常重要的作用。因?yàn)樯厦嫣岬降倪@種關(guān)系,并不像勻速直線運(yùn)動(dòng)中時(shí)間與速度的關(guān)系那樣是完全確定的,而是帶有不確定性,這就需要通過收集大量的數(shù)據(jù)(有時(shí)候通過調(diào)查、或?qū)嶒?yàn)),在對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析的基礎(chǔ)上,發(fā)現(xiàn)其中的規(guī)律,才能讓他們之間的關(guān)系做出判斷?!就扑]了解:大數(shù)據(jù)培訓(xùn)課程】
二、脂肪含量和年齡相關(guān)嗎?
兩個(gè)變量的線性相關(guān):
如下表中描述了人體的脂肪百分比和年齡的關(guān)系圖表:
年齡脂肪含量
年齡 |
脂肪含量 |
23 |
9.5 |
27 |
17.8 |
39 |
21.2 |
41 |
25.9 |
45 |
27.5 |
49 |
26.3 |
50 |
28.2 |
53 |
29.6 |
54 |
30.2 |
56 |
31.4 |
57 |
30.8 |
58 |
33.5 |
60 |
35.2 |
61 |
34.6 |
問題:根據(jù)上述數(shù)據(jù),人體的脂肪含量與年齡之間有怎么樣的關(guān)系呢?
對(duì)問題的描述:
一般地,對(duì)于某個(gè)人來說,他的體內(nèi)脂肪不一定隨年齡增長(zhǎng)而增加或減少,但是如果把很多個(gè)體放在一起,這時(shí)就可能表現(xiàn)出一定的規(guī)律性,各年齡對(duì)應(yīng)的脂肪數(shù)據(jù)是這個(gè)年齡人群脂肪含量的樣本平均值。觀察上述表數(shù)據(jù),從大體上看,隨著年齡的增加,人體中脂肪的百分比也在增加。為了確定這一細(xì)節(jié),我們需要進(jìn)行數(shù)據(jù)的分析,與以前一樣,我們可以做統(tǒng)計(jì)圖、表,通過作統(tǒng)計(jì)圖、表,可以使我們對(duì)兩個(gè)變量之間的關(guān)系有一個(gè)直觀的印象和判斷。
下面我們做一個(gè)散點(diǎn)圖,如圖,假設(shè)人的年齡影響體內(nèi)脂肪含量,于是,按照習(xí)慣,以x軸表示年齡,y軸表示脂肪含量,得到下圖:
這些散分布的位置也是值得注意的,他們散布在從左上角到右下角的區(qū)域。對(duì)于兩個(gè)變量的這種相關(guān)關(guān)系,我們稱為正相關(guān)。還有一些變量,例如汽車的重量和汽車每消耗1L汽油所行駛的平均路程,是負(fù)相關(guān),也就是汽車越重,每消耗1L汽油所行駛的平均路程就越短,這時(shí)的點(diǎn)如果繪制在畫布上 將會(huì)從左上角到右下角的區(qū)域內(nèi)。
接下來,需要進(jìn)一步考慮的問題是,當(dāng)人的年齡增加時(shí),體內(nèi)脂肪含量到底是以什么方式增加的呢?
從散點(diǎn)圖可以看出,這些點(diǎn)大致分布在通過散點(diǎn)圖中心的一條直線附近,如果散點(diǎn)圖中的點(diǎn)分布從整體上看大致是在一條直線附近,我們就稱這兩個(gè)變量之間具有線性相關(guān)關(guān)系,這條直線叫做回歸直線(regression line)。
如果能求出這條回歸直線的方程,那么我們就可以清晰的了解年齡與體內(nèi)脂肪含量的相關(guān)性,就像平均值可以作為一個(gè)變量的數(shù)據(jù)的代表一樣,這條直線可以作為兩個(gè)變量具有線性相關(guān)性的代表。
當(dāng)你拿到這樣一個(gè)任務(wù)的時(shí)候,你可能會(huì)采用測(cè)量的做法,先畫出一條直線,測(cè)量各點(diǎn)與它的距離,然后移動(dòng)直線,到達(dá)一個(gè)使得距離的和最小的位置,測(cè)量出此時(shí)的斜率和截距,既可以得到回歸方程了。
也可能會(huì)采用平均方法,也就是在散點(diǎn)圖中多取幾組點(diǎn),確定出幾條直線的方程,在分別求出各條直線的斜率、截距的平均數(shù),將這兩個(gè)平均數(shù)作為回歸方程的斜率和截距。
三、問題的求解
上面方法雖然有一定道理,但是總讓人感覺可靠性不強(qiáng)。實(shí)際上,求回歸方程的關(guān)鍵是如何用數(shù)學(xué)的方法來刻畫“從整體上,各點(diǎn)與此直線的距離最小”。
總結(jié):這種通過求解Q關(guān)系式的最小值而得到回歸直線的方法,即求回歸直線,使得樣本數(shù)據(jù)的點(diǎn)到它的距離的平方和最小的方法,叫做最小二乘法(Least square)。
四、Execl繪制相關(guān)圖形
Execl畫回歸擬合直線如下方法:
(1)準(zhǔn)備數(shù)據(jù),首先繪制散點(diǎn)圖
(2)在散點(diǎn)圖基礎(chǔ)上點(diǎn)”趨勢(shì)預(yù)測(cè)”即可看到擬合的直線。
(3)在圖示區(qū)域顯示擬合直線的方程
四、SparkMl代碼實(shí)戰(zhàn)
這里采用基于DataFrame的SparkMl完成實(shí)驗(yàn),并與Execl的結(jié)果進(jìn)行對(duì)比分析:
代碼部分:
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.regression.{LinearRegression, LinearRegressionModel}
import org.apache.spark.sql.SparkSession
object testFat {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().master("local[*]").appName("traintestSplitTest").getOrCreate()
spark.sparkContext.setLogLevel("WARN")
val data = spark.createDataFrame(Seq(
(9.5, Vectors.dense(23)),
(17.8, Vectors.dense(27)),
(21.2, Vectors.dense(39)),
(25.9, Vectors.dense(41)),
(27.5, Vectors.dense(45)),
(26.3, Vectors.dense(49)),
(28.2, Vectors.dense(50)),
(29.6, Vectors.dense(53)),
(30.2, Vectors.dense(54)),
(31.4, Vectors.dense(56)),
(30.8, Vectors.dense(57)),
(33.5, Vectors.dense(58)),
(35.2, Vectors.dense(60)),
(34.6, Vectors.dense(61))
)).toDF("label", "features")
//1-data split
val Array(train, test): Array[Dataset[Row]] = data.randomSplit(Array(0.9, 0.1), seed = 120L)
//2-training model
val lr: LinearRegression = new LinearRegression()
val lrModel: LinearRegressionModel = lr.fit(data)
//3- Print the coefficients and intercept for linear regression
println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")
// 4-Summarize the model over the training set and print out some metrics
val trainingSummary = lrModel.summary
println(s"numIterations: ${trainingSummary.totalIterations}")
println(s"objectiveHistory: [${trainingSummary.objectiveHistory.mkString(",")}]")
trainingSummary.residuals.show()
println(s"RMSE: ${trainingSummary.rootMeanSquaredError}")
println(s"r2: ${trainingSummary.r2}")
// Coefficients: [0.5764772505370067] Intercept: -0.44779925795753567
// numIterations: 1
// objectiveHistory: [0.0]
// +---------------------------------------------+
// | residuals|
// +--------------------------------------------+
// | -3.311177504393619|
// | 2.682913493458356|
// .............................
// RMSE: 1.629890205389517
// r2: 0.9423379190667397
}
}
這里得到的R2是回歸問題的考量標(biāo)準(zhǔn),越接近于1效果越好,這里r2為0.94效果能夠達(dá)到預(yù)期,因此能夠證明隨著年齡的增長(zhǎng)脂肪含量會(huì)隨著增長(zhǎng),在回歸問題中此類問題常稱之為一元線性回歸或簡(jiǎn)單線性回歸,當(dāng)然可以考慮更多的變量因素存在對(duì)脂肪含量的影響,這里不再一一列舉。
六、總結(jié)
通過對(duì)脂肪含量和年齡的關(guān)系問題猜想、定義、Execl繪圖分析、SparkMl建模分析得到我們猜測(cè)和數(shù)學(xué)上可證明的結(jié)論,同學(xué)們可以借助SparkMl技術(shù)解決更多的回歸問題。加油!
北京校區(qū)