原理推導公式太多,寫到草稿紙上,下圖所示:
代碼演示,這裏生成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()