最小二乘法原理推導和代碼演示

原理推導公式太多,寫到草稿紙上,下圖所示:

在這裏插入圖片描述

代碼演示,這裏生成200個0到100的數值X,且這個數值間隔相同。再通過給定權重w、偏置b、噪音noise,生成200個對應的Y值。最後通過最小二乘法計算出最適合的權重w和b來擬合這些數據。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,100,200)
noise = np.random.normal(loc=0,scale = 20,size=200)
y = 3*x+10+noise
def complute_loss(w,b,x,y): #計算損失
    loss_total = 0
    for i in range(len(x)):
        loss_total += (w*x[i]+b-y[i])**2
    return loss_total
def average(data): #求平均值
    data_sum = 0
    for i in range(len(data)):
        data_sum += data[i]
    data_aver = data_sum/len(data)
    return data_aver
def fit(x,y):   #求w和b
    up = 0 #分子
    down = 0 #分母
    x_bar = average(x)
    y_bar = average(y)
    for i in range(len(x)):
        up += x[i]*y[i]
        down += x[i]**2
    up -= len(x)*x_bar*y_bar
    down -= len(x)*x_bar**2
    w = up/down
    b = y_bar-w*x_bar
    return w,b
w,b = fit(x,y)
y_pre = w*x +b
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.scatter(x,y,c='c')
plt.title('x和y的關係圖')
plt.plot(x,y_pre,'r')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章