1 什么是”最小二乘法”呢?
線性回歸是很常見的一種回歸,線性回歸可以用來預測或者分類做鹰,主要解決線性問題。
插圖摘自周志華《機器學習》及互聯(lián)網(wǎng)
線性回歸過程主要解決的就是如何通過樣本來獲取最佳的擬合線》钩ⅲ現(xiàn)在使用得比較廣泛的就是梯度下降和最小二乘法
,它是一種數(shù)學優(yōu)化技術(shù)谋作,它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配芋肠。
在有監(jiān)督學習問題中,線性回歸是一種最簡單的建模手段遵蚜。給定一個數(shù)據(jù)點集合作為訓練集帖池,線性回歸的目標是找到一個與這些數(shù)據(jù)最為吻合的線性函數(shù)。對于2D數(shù)據(jù)吭净,這樣的函數(shù)對應一條直線睡汹。
線性模型在二維空間中就是一條直線,在三維空間是一個平面寂殉,高維空間的線性模型不好去描述長什么樣子囚巴;如果這個數(shù)據(jù)集能夠用一個線性模型來擬合它的數(shù)據(jù)關(guān)系,不管是多少維的數(shù)據(jù),我們構(gòu)建線性模型的方法都是通用的彤叉。
學習 TensorFlow 讓我的思維發(fā)生了變化庶柿。
計算機本質(zhì)上是一種數(shù)學的工具,而我在學習編程的時候秽浇,思維也不可避免地收到了影響浮庐。傳統(tǒng)的編程思想,常常認為程序就應該像數(shù)學定理或者數(shù)學函數(shù)一樣柬焕,給出一個確定的結(jié)果审残。這是一種基于邏輯推導的思維習慣。
然而斑举,做實驗的科學家們的思維卻不像數(shù)學家一樣搅轿。實驗科學家通過做實驗收集數(shù)據(jù),再根據(jù)數(shù)據(jù)推測其中蘊含的某種規(guī)律富玷。
定義:最小二乘法(又稱最小平方法)是一種數(shù)學優(yōu)化技術(shù)璧坟,它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。
作用:利用最小二乘法可以簡便地求得未知的數(shù)據(jù)凌彬,并使得這些求得的數(shù)據(jù)與實際數(shù)據(jù)之間誤差的平方和為最小沸柔。
原則:以”殘差平方和最小”確定直線位置(在數(shù)理統(tǒng)計中循衰,殘差是指實際觀察值與估計值之間的差)
基本思路:對于一元線性回歸模型, 假設從總體中獲取了n組觀察值(X1铲敛,Y1),(X2会钝,Y2)伐蒋, …,(Xn迁酸,Yn)先鱼,對于平面中的這n個點,可以使用無數(shù)條曲線來擬合奸鬓。而線性回歸就是要求樣本回歸函數(shù)盡可能好地擬合這組值焙畔,也就是說,這條直線應該盡可能的處于樣本數(shù)據(jù)的中心位置串远。因此宏多,選擇最佳擬合曲線的標準可以確定為:使總的擬合誤差(即總殘差)達到最小。
2 如何理解最小二乘法
用一個具體的例子來說明澡罚,可能會讓讀者更加容易理解:
小明是跑運輸?shù)纳斓?公里需要6塊,跑2公里需要5塊(那段時間剛好油價跌了)留搔,跑3公里需要7塊更胖,跑4公里需要10塊,請問跑5公里需要多少塊?
如果我們有初中數(shù)學基礎却妨,應該會自然而然地想到用線性方程組來做饵逐,對吧。
y=β1+xβ2
這里假定x是公里數(shù)彪标,y是運輸成本(β1和β2是要求的系數(shù))梳毙。我們把上面的一組數(shù)據(jù)代入得到這么幾個方程:
β1+1β2=6
β1+2β2=5
β1+3β2=7
β1+4β2=10
如果存在這樣的β1和β2,讓所有的數(shù)據(jù)(x捐下,y)=(1,6)账锹,(2,5),(3,7)坷襟,(4奸柬,10)都能滿足的話,那么解答就很簡單了婴程,β1+5β2就是5公里的成本廓奕,對吧。
但遺憾的是档叔,這樣的β1和β2是不存在的桌粉,上面的方程組很容易,你可以把前面兩個解出來得到一組β1和β2衙四,后面兩個也解出來同樣得到一組β1和β2铃肯。這兩組β1和β2是不一樣的。
形象地說传蹈,就是你找不到一條直線押逼,穿過所有的點,因為他們不在一條直線上惦界。
可是現(xiàn)實生活中挑格,我們就希望能找到一條直線,雖然不能滿足所有條件沾歪,但能近似地表示這個趨勢漂彤,或者說,能近似地知道5公里的運輸成本灾搏,這也是有意義的挫望。
其實最小二乘法也是這樣,要盡全力讓這條直線最接近這些點确镊,那么問題來了士骤,怎么才叫做最接近呢?直覺告訴我們蕾域,這條直線在所有數(shù)據(jù)點中間穿過拷肌,讓這些點到這條直線的誤差之和越小越好到旦。這里我們用方差來算更客觀。也就是說巨缘,把每個點到直線的誤差平方加起來:
##最小二乘法
import numpy as np ##科學計算庫
import scipy as sp ##在numpy基礎上實現(xiàn)的部分算法庫
import matplotlib.pyplot as plt ##繪圖庫
from scipy.optimize import leastsq ##引入最小二乘法算法
'''
設置樣本數(shù)據(jù)添忘,真實數(shù)據(jù)需要在這里處理
'''
##樣本數(shù)據(jù)(Xi,Yi),需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([1,2,3,4])
Yi=np.array([6,5,7,10])
'''
設定擬合函數(shù)和偏差函數(shù)
函數(shù)的形狀確定過程:
1.先畫樣本圖像
2.根據(jù)樣本圖像大致形狀確定函數(shù)形式(直線若锁、拋物線搁骑、正弦余弦等)
'''
##需要擬合的函數(shù)func :指定函數(shù)的形狀
def func(p,x):
k,b=p
return k*x+b
##偏差函數(shù):x,y都是列表:這里的x,y更上面的Xi,Yi中是一一對應的
def error(p,x,y):
return func(p,x)-y
'''
主要部分:附帶部分說明
1.leastsq函數(shù)的返回值tuple,第一個元素是求解結(jié)果又固,第二個是求解的代價值(個人理解)
2.官網(wǎng)的原話(第二個值):Value of the cost function at the solution
3.實例:Para=>(array([ 0.61349535, 1.79409255]), 3)
4.返回值元組中第一個值的數(shù)量跟需要求解的參數(shù)的數(shù)量一致
'''
#k,b的初始值仲器,可以任意設定,經(jīng)過幾次試驗,發(fā)現(xiàn)p0的值會影響cost的值:Para[1]
p0=[1,20]
#把error函數(shù)中除了p0以外的參數(shù)打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#讀取結(jié)果
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("求解的擬合直線為:")
print("y="+str(round(k,2))+"x+"+str(round(b,2)))
'''
繪圖仰冠,看擬合效果.
matplotlib默認不支持中文乏冀,label設置中文的話需要另行設置
如果報錯,改成英文就可以
'''
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="sample data",linewidth=2)
#畫擬合直線
x=np.linspace(0,12,100) ##在0-15直接畫100個連續(xù)點
y=k*x+b ##函數(shù)式
plt.plot(x,y,color="red",label="Fitting straight line",linewidth=2)
plt.legend(loc='lower right') #繪制圖例
plt.show()
k= 1.400000000000871 b= 3.499999999964018
cost:1
求解的擬合直線為:
y=1.4x+3.5
求解的擬合直線為:
y=1.4x+3.5
這個函數(shù)也就是我們要的直線洋只,這條直線雖然不能把那些點串起來辆沦,但它能最大程度上接近這些點。也就是說5公里的時候识虚,成本為3.5+1.4x5=10.5塊肢扯,雖然不完美,但是很接近實際情況担锤。
3 實際應用的一個完整示例
整個過程分七步蔚晨,每步都放上了完整的代碼。
實驗數(shù)據(jù):
身高/cm:
105,109,119,120,120,120,121,121,121,123,
123,123,123,124,125,125,125,126,126,126,
126,126,127,127,127,127,127,129,130,130,
130,131,131,131,132,132,132,132,132,133,
134,134,134,136,136,137,137,142
體重/kg:
24,28,25,31,22,21,21,22,20,23,
22,23,22,21,28,23,22,21,26,24,
21,27,25,25,24,24,21,24,25,23,
28,29,26,26,31,27,27,31,25,34,
23,26,32,36,26,40,28,44
3.1 第一步:準備樣本數(shù)據(jù)并繪制散點圖
1)代碼及其說明
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
##樣本數(shù)據(jù)(Xi,Yi)妻献,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="sample data",linewidth=1)
plt.show()
2)結(jié)果圖
3)分析
從散點圖可以看出蛛株,樣本點基本是圍繞箭頭所示的直線分布的。所以先以直線模型對數(shù)據(jù)進行擬合
3.2 第二步: 使用最小二乘法算法求擬合直線
1)代碼及其說明
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
##樣本數(shù)據(jù)(Xi,Yi)育拨,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
##需要擬合的函數(shù)func :指定函數(shù)的形狀 k= 0.42116973935 b= -8.28830260655
def func(p,x):
k,b=p
return k*x+b
##偏差函數(shù):x,y都是列表:這里的x,y更上面的Xi,Yi中是一一對應的
def error(p,x,y):
return func(p,x)-y
#k,b的初始值,可以任意設定,經(jīng)過幾次試驗欢摄,發(fā)現(xiàn)p0的值會影響cost的值:Para[1]
p0=[1,20]
#把error函數(shù)中除了p0以外的參數(shù)打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#讀取結(jié)果
k,b=Para[0]
print("k=",k,"b=",b)
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="sample data",linewidth=2)
#畫擬合直線
x=np.linspace(105,142,100) ##在105-142直接畫100個連續(xù)點
y=k*x+b ##函數(shù)式
plt.plot(x,y,color="red",label="Fitting straight line",linewidth=2)
plt.legend() #繪制圖例
plt.show()
2)結(jié)果圖
3)分析
從圖上看熬丧,擬合效果還是不錯的。樣本點基本均勻的分布在回歸線兩邊怀挠,沒有出現(xiàn)數(shù)據(jù)點嚴重偏離回歸線的情況析蝴。
3.3 第三步: 驗證回歸線的擬合程度—殘差分布圖
1)代碼及其說明
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
##樣本數(shù)據(jù)(Xi,Yi),需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
xy_res=[]
##計算殘差
def residual(x,y):
res=y-(0.42116973935*x-8.28830260655)
return res
##讀取殘差
for d in range(0,len(Xi)):
res=residual(Xi[d],Yi[d])
xy_res.append(res)
##print(xy_res)
##計算殘差平方和:22.8833439288 -->越小擬合情況越好
xy_res_sum=np.dot(xy_res,xy_res)
#print(xy_res_sum)
##如果數(shù)據(jù)擬合模型效果好绿淋,殘差應該遵從正態(tài)分布(0,d*d:這里d表示殘差)
#畫樣本點
fig=plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
ax=fig.add_subplot(111)
fig=qqplot(np.array(xy_res),line='q',ax=ax)
plt.show()
2)結(jié)果圖
3)分析
上圖為Q-Q圖闷畸,原理:如果兩個分布相似,則該Q-Q圖趨近于落在y=x線上吞滞。如果兩分布線性相關(guān)佑菩,則點在Q-Q圖上趨近于落在一條直線上盾沫,但不一定在y=x線上。Q-Q圖可以用來可在分布的位置-尺度范疇上可視化的評估參數(shù)殿漠。
從圖上可以看出赴精,回歸效果比較理想,但不是最理想的
4)以下代碼可以同樣實現(xiàn)上述圖示:
import numpy as np
import scipy.stats as stats
import pylab
##樣本數(shù)據(jù)(Xi,Yi)绞幌,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
xy_res=[]
##計算殘差
def residual(x,y):
res=y-(0.42116973935*x-8.28830260655)
return res
##讀取殘差
for d in range(0,len(Xi)):
res=residual(Xi[d],Yi[d])
xy_res.append(res)
##print(xy_res)
##計算殘差平方和:22.8833439288 -->越小擬合情況越好
xy_res_sum=np.dot(xy_res,xy_res)
#print(xy_res_sum)
##如果數(shù)據(jù)擬合模型效果好蕾哟,殘差應該遵從正態(tài)分布(0,d*d:這里d表示殘差)
#畫樣本點
stats.probplot(np.array(xy_res),dist="norm",plot=pylab)
pylab.show()
3.4 第四步: 驗證回歸線的擬合程度—標準化殘差
1)代碼及其說明
import numpy as np
import matplotlib.pyplot as plt
##樣本數(shù)據(jù)(Xi,Yi),需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
xy_res = []
##計算殘差
def residual(x, y):
res = y - (0.42116973935 * x - 8.28830260655)
return res
##讀取殘差
for d in range(0, len(Xi)):
res = residual(Xi[d], Yi[d])
xy_res.append(res)
##print(xy_res)
##計算殘差平方和:22.8833439288 -->越小擬合情況越好
xy_res_sum = np.dot(xy_res, xy_res)
'''
標準殘差: (殘差-殘差平均值)/殘差的標準差
'''
'''
標準殘差圖:
1.標準殘差是以擬合模型的自變量為橫坐標,以標準殘差為縱坐標形成的平面坐標圖像
2.試驗點的標準殘差落在殘差圖的(-2,2)區(qū)間以外的概率<=0.05.若某一點落在區(qū)間外士飒,可判為異常點
3.有效標準殘差點圍繞y=0的直線上下完全隨機分布炭懊,說明擬合情況良好
4.如果擬合方程原本是非線性模型,但擬合時卻采用了線性模型琼富,標準化殘差圖就會表現(xiàn)出曲線形狀,產(chǎn)生
系統(tǒng)性偏差
'''
##計算殘差平均值
xy_res_avg = 0
for d in range(0, len(xy_res)):
xy_res_avg += xy_res[d]
xy_res_avg /= len(xy_res)
# 殘差的標準差
xy_res_sd = np.sqrt(xy_res_sum / len(Xi))
##標準化殘差
xy_res_sds = []
for d in range(0, len(Xi)):
res = (xy_res[d] - xy_res_avg) / xy_res_sd
xy_res_sds.append(res)
# print(xy_res_sds)
# 標準化殘差分布
plt.figure(figsize=(8, 6)) ##指定圖像比例: 8:6
plt.scatter(Xi, xy_res_sds)
plt.show()
'''
1.絕大部分數(shù)據(jù)分布在(-2,+2)的水平帶狀區(qū)間內(nèi)庄新,因此模型擬合較充分
2.數(shù)據(jù)點分布稍均勻鞠眉,但沒有達到隨機均勻分布的狀態(tài)。此外择诈,部分數(shù)據(jù)點還呈現(xiàn)某種曲線波動形狀械蹋,
有少許系統(tǒng)性偏差。因此可能采用非線性擬合效果會更好
'''
2)結(jié)果圖
3)分析
數(shù)據(jù)點分布還是存在一定的變化趨勢的羞芍。
3.5 第五步:使用曲線模型擬合數(shù)據(jù)
1)代碼及其說明
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
##樣本數(shù)據(jù)(Xi,Yi)哗戈,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
##需要擬合的函數(shù)func :指定函數(shù)的形狀 k= 0.860357336936 b= -19.6659389666
def func(p,x):
k,b=p
return x**k+b
##偏差函數(shù):x,y都是列表:這里的x,y更上面的Xi,Yi中是一一對應的
def error(p,x,y):
return func(p,x)-y
#k,b的初始值,可以任意設定,經(jīng)過幾次試驗荷科,發(fā)現(xiàn)p0的值會影響cost的值:Para[1]
p0=[1,20]
#把error函數(shù)中除了p0以外的參數(shù)打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#讀取結(jié)果
k,b=Para[0]
print("k=",k,"b=",b)
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="sample data",linewidth=2)
#畫擬合直線
x=np.linspace(105,142,100) ##在105-142直接畫100個連續(xù)點
y=x**k+b ##函數(shù)式
plt.plot(x,y,color="red",label="Fitting straight line",linewidth=2)
plt.legend() #繪制圖例
plt.show()
2)結(jié)果圖
3)分析
由于標準化殘差的分布圖唯咬,部分數(shù)據(jù)的趨勢與冪函數(shù)在第一象限的圖像類似, 所以采用了y=xa +b的函數(shù)形式畏浆,截距b是為了圖像可以在Y軸上下移動
3.6 第六步:驗證回歸線的擬合程度—殘差分布圖
1)代碼及其說明
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
##樣本數(shù)據(jù)(Xi,Yi)胆胰,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
xy_res=[]
##計算殘差
def residual(x,y):
res=y-(x**0.860357336936-19.6659389666)
return res
##讀取殘差
for d in range(0,len(Xi)):
res=residual(Xi[d],Yi[d])
xy_res.append(res)
##print(xy_res)
##計算殘差平方和:22.8833439288 -->越小擬合情況越好
xy_res_sum=np.dot(xy_res,xy_res)
#print(xy_res_sum)
##如果數(shù)據(jù)擬合模型效果好,殘差應該遵從正態(tài)分布(0,d*d:這里d表示殘差)
#畫樣本點
fig=plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
ax=fig.add_subplot(111)
fig=qqplot(np.array(xy_res),line='q',ax=ax)
plt.show()
2)結(jié)果圖
3)分析
從圖上可以看出刻获,回歸效果也比較理想
3.7 第七步:驗證回歸線的擬合程度—標準化殘差
1)代碼及其說明
import numpy as np
import matplotlib.pyplot as plt
##樣本數(shù)據(jù)(Xi,Yi)蜀涨,需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([105,109,119,120,120,120,121,121,121,123,123,123,123,124,125,125,125,126,126,126,126,126,127,127,127,127,127,129,130,130,130,131,131,131,132,132,132,132,132,133,134,134,134,136,136,137,137,142]) #身高
Yi=np.array([24,28,25,31,22,21,21,22,20,23,22,23,22,21,28,23,22,21,26,24,21,27,25,25,24,24,21,24,25,23,28,29,26,26,31,27,27,31,25,34,23,26,32,36,26,40,28,44])#體重
xy_res = []
##計算殘差
def residual(x, y):
res = y - (x ** 0.860357336936 - 19.6659389666)
return res
##讀取殘差
for d in range(0, len(Xi)):
res = residual(Xi[d], Yi[d])
xy_res.append(res)
##print(xy_res)
##計算殘差平方和:22.881076636 -->越小擬合情況越好
xy_res_sum = np.dot(xy_res, xy_res)
# print(xy_res_sum)
'''
標準殘差: (殘差-殘差平均值)/殘差的標準差
'''
##計算殘差平均值
xy_res_avg = 0
for d in range(0, len(xy_res)):
xy_res_avg += xy_res[d]
xy_res_avg /= len(xy_res)
# 殘差的標準差
xy_res_sd = np.sqrt(xy_res_sum / len(Xi))
##標準化殘差
xy_res_sds = []
for d in range(0, len(Xi)):
res = (xy_res[d] - xy_res_avg) / xy_res_sd
xy_res_sds.append(res)
print(xy_res_sds)
# 標準化殘差分布
plt.figure(figsize=(8, 6)) ##指定圖像比例: 8:6
plt.scatter(Xi, xy_res_sds)
plt.show()
'''
1.絕大部分數(shù)據(jù)分布在(-2,+2)的水平帶狀區(qū)間內(nèi),因此模型擬合較充分
2.數(shù)據(jù)點分布稍均勻蝎毡,但沒有達到隨機均勻分布的狀態(tài)厚柳。此外,部分數(shù)據(jù)點還呈現(xiàn)某種曲線波動形狀沐兵,
有少許系統(tǒng)性偏差别垮。因此可能采用非線性擬合效果會更好
'''
2)結(jié)果圖
3)分析
數(shù)據(jù)點分布趨和直線回歸方程基本一樣