機器學習—線性回歸之最小二乘法

1 什么是”最小二乘法”呢?

線性回歸是很常見的一種回歸,線性回歸可以用來預測或者分類做鹰,主要解決線性問題。

一元線性回歸鼎姐、多元線性回歸钾麸、邏輯斯諦回歸、廣義線性回歸炕桨、非線性回歸的關(guān)系 

插圖摘自周志華《機器學習》及互聯(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ù)點分布趨和直線回歸方程基本一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扎谎,隨后出現(xiàn)的幾起案子碳想,更是在濱河造成了極大的恐慌烧董,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移袍,死亡現(xiàn)場離奇詭異解藻,居然都是意外死亡,警方通過查閱死者的電腦和手機葡盗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門螟左,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觅够,你說我怎么就攤上這事胶背。” “怎么了喘先?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵钳吟,是天一觀的道長。 經(jīng)常有香客問我窘拯,道長红且,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任涤姊,我火速辦了婚禮暇番,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘思喊。我一直安慰自己壁酬,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布恨课。 她就那樣靜靜地躺著舆乔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剂公。 梳的紋絲不亂的頭發(fā)上希俩,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音诬留,去河邊找鬼斜纪。 笑死,一個胖子當著我的面吹牛文兑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腺劣,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼绿贞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橘原?” 一聲冷哼從身側(cè)響起籍铁,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤涡上,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拒名,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吩愧,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年增显,在試婚紗的時候發(fā)現(xiàn)自己被綠了雁佳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡同云,死狀恐怖糖权,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炸站,我是刑警寧澤星澳,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站旱易,受9級特大地震影響禁偎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阀坏,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一如暖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧全释,春花似錦装处、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至李命,卻和暖如春登淘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背封字。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工黔州, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阔籽。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓流妻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笆制。 傳聞我的和親對象是個殘疾皇子绅这,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349