更新時間:2019年10月10日18時29分 來源:傳智播客 瀏覽次數:
一、問題引入
我們都參加過高考,據統(tǒng)計,高考的物理成績確實與數學成績有一定關系,但除此之外,還存在很多影響物理成績的因素,例如:是否喜歡物理,用在物理上的時間等。而當我們主要考慮數學成績對物理的影響時,就是要考察這兩者之間的相關關系。
現實生活中還有很多的相關關系,如
1.商品銷售輸入與廣告支出經費之間的關系,銷售輸入與廣告支出有著密切的關系,但是還與商品質量、居民收入等因素有關。
2.糧食產量與施肥量之間的關系。在一定范圍內,施肥量越大,糧食生產就越高。除此之外,糧食產量還受到土壤質量、降雨量等的影響。
3.人體內脂肪的含量與年齡之間的關系。在一定年齡段內,隨著年齡的增長,人體內的脂肪含量會增加,但人體內的脂肪含量還和飲食習慣,體育鍛煉有關系,可能還與先天
體質有關系。
對于上述兩個變量之間的關系,應該說都可以根據經驗做出相應的判斷,因為“經驗當中有規(guī)律”,但是,不管你經驗多么豐富,如果只憑借經驗辦事,還是很容易出錯。因此在分析兩個變量之間的相關關系時,我們需要一些說服力的辦法。
在尋找變量之間的相關關系中,統(tǒng)計同樣發(fā)揮著非常重要的作用。因為上面提到的這種關系,并不像勻速直線運動中時間與速度的關系那樣是完全確定的,而是帶有不確定性,這就需要通過收集大量的數據(有時候通過調查、或實驗),在對數據進行統(tǒng)計分析的基礎上,發(fā)現其中的規(guī)律,才能讓他們之間的關系做出判斷?!就扑]了解:大數據培訓課程】
二、脂肪含量和年齡相關嗎?
兩個變量的線性相關:
如下表中描述了人體的脂肪百分比和年齡的關系圖表:
年齡脂肪含量
年齡 |
脂肪含量 |
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 |
問題:根據上述數據,人體的脂肪含量與年齡之間有怎么樣的關系呢?
對問題的描述:
一般地,對于某個人來說,他的體內脂肪不一定隨年齡增長而增加或減少,但是如果把很多個體放在一起,這時就可能表現出一定的規(guī)律性,各年齡對應的脂肪數據是這個年齡人群脂肪含量的樣本平均值。觀察上述表數據,從大體上看,隨著年齡的增加,人體中脂肪的百分比也在增加。為了確定這一細節(jié),我們需要進行數據的分析,與以前一樣,我們可以做統(tǒng)計圖、表,通過作統(tǒng)計圖、表,可以使我們對兩個變量之間的關系有一個直觀的印象和判斷。
下面我們做一個散點圖,如圖,假設人的年齡影響體內脂肪含量,于是,按照習慣,以x軸表示年齡,y軸表示脂肪含量,得到下圖:
這些散分布的位置也是值得注意的,他們散布在從左上角到右下角的區(qū)域。對于兩個變量的這種相關關系,我們稱為正相關。還有一些變量,例如汽車的重量和汽車每消耗1L汽油所行駛的平均路程,是負相關,也就是汽車越重,每消耗1L汽油所行駛的平均路程就越短,這時的點如果繪制在畫布上 將會從左上角到右下角的區(qū)域內。
接下來,需要進一步考慮的問題是,當人的年齡增加時,體內脂肪含量到底是以什么方式增加的呢?
從散點圖可以看出,這些點大致分布在通過散點圖中心的一條直線附近,如果散點圖中的點分布從整體上看大致是在一條直線附近,我們就稱這兩個變量之間具有線性相關關系,這條直線叫做回歸直線(regression line)。
如果能求出這條回歸直線的方程,那么我們就可以清晰的了解年齡與體內脂肪含量的相關性,就像平均值可以作為一個變量的數據的代表一樣,這條直線可以作為兩個變量具有線性相關性的代表。
當你拿到這樣一個任務的時候,你可能會采用測量的做法,先畫出一條直線,測量各點與它的距離,然后移動直線,到達一個使得距離的和最小的位置,測量出此時的斜率和截距,既可以得到回歸方程了。
也可能會采用平均方法,也就是在散點圖中多取幾組點,確定出幾條直線的方程,在分別求出各條直線的斜率、截距的平均數,將這兩個平均數作為回歸方程的斜率和截距。
三、問題的求解
上面方法雖然有一定道理,但是總讓人感覺可靠性不強。實際上,求回歸方程的關鍵是如何用數學的方法來刻畫“從整體上,各點與此直線的距離最小”。
總結:這種通過求解Q關系式的最小值而得到回歸直線的方法,即求回歸直線,使得樣本數據的點到它的距離的平方和最小的方法,叫做最小二乘法(Least square)。
四、Execl繪制相關圖形
Execl畫回歸擬合直線如下方法:
(1)準備數據,首先繪制散點圖
(2)在散點圖基礎上點”趨勢預測”即可看到擬合的直線。
(3)在圖示區(qū)域顯示擬合直線的方程
四、SparkMl代碼實戰(zhàn)
這里采用基于DataFrame的SparkMl完成實驗,并與Execl的結果進行對比分析:
代碼部分:
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是回歸問題的考量標準,越接近于1效果越好,這里r2為0.94效果能夠達到預期,因此能夠證明隨著年齡的增長脂肪含量會隨著增長,在回歸問題中此類問題常稱之為一元線性回歸或簡單線性回歸,當然可以考慮更多的變量因素存在對脂肪含量的影響,這里不再一一列舉。
六、總結
通過對脂肪含量和年齡的關系問題猜想、定義、Execl繪圖分析、SparkMl建模分析得到我們猜測和數學上可證明的結論,同學們可以借助SparkMl技術解決更多的回歸問題。加油!