1. 程式人生 > >純數學手段實現基於最小二乘法的線性迴歸

純數學手段實現基於最小二乘法的線性迴歸

終於,抱著興趣,我利用純數學的手段實現了基於最小二乘法的線性迴歸模型。這是我昨天的目標(今天我還沒有睡覺呢,假設我睡覺後是明天的話),那麼我明天希望能夠利用純數學手段實現基於隨機梯度下降的線性迴歸演算法模型。

        下面是筆者手打的最小二乘法的數學原理,然後我們再利用數學手段對其進行實現即可,也就是利用多元函式的極值求出偏導數而已,其正面過程請參見同濟版《高等數學》P110.

利用Python程式碼表示如下:

#首先引入資料集x,和y的值的大小利用Python的資料結構:列表,來實現。

y=[4,8,13,35,34,67,78,89,100,101]

x=[0,1,2,3,4,5,6,7,8,9]

#然後再引入Python當中的繪相簿,用於檢測我們利用線性迴歸得到的結果是否正確

from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=15)

import matplotlib.pyplot as plt

k = 0

for i in range(10):

    j = k

    k = j+i**2

    print(k)

    print(i)#實現計算x的平方

a11 = k

k=0

print("\n")#換行,使我們的結果更加清晰

for i in range(10):

    #實現計算X的求和

    j = k

    k = j+i

    print(k)

a12 = k

#下面開始計算y*x的求和

k=0

for i in range(10):

    j = k

    k = j+y[i]*i

    print("我們k的大小是{}".format(k))

yixi = k

b1 = yixi

#現在再來計算我們yi求和後的大小

k=0

for i in range(10):

   j = k

   k = j+y[i]

   print(k)

yi = k

b2 = yi

#計算完畢,現在根據求出偏導數後的值計算我們斜率和截距的大小

#根據題意可得到:

a22 = 10

a21 = a12

#因此根據線性代數的克拉默法則,我們可以將其寫成一個二階行列式的形式:

print("現在開始列印行列式的各個值:")

print(a11)

print(a12)

print(a21)

print(a22)#檢查無誤後開始用克拉默法則進行計算

k = (b1*a22-a12*b2)/(a11*a22-a12*a21)

b = (a11*b2-a21*b1)/(a11*a22-a12*a21)

print("\n")

print("K的大小是:{}".format(k))

print("b的大小是:{}".format(b))

plt.scatter(x,y)

plt.title("利用最小二乘法實現線性單元迴歸\n製作人:Geeksongs",fontproperties=font)

plt.plot([0,12],[(a11*b2-a21*b1)/(a11*a22-a12*a21),((b1*a22-a12*b2)/(a11*a22-a12*a21))*12+b],linewidth=3,color="black")

plt.show()

最終的結果如圖所示:

得解。