線性公式 y = w * x (w為權重)
MSE: 均方誤差 (一種回歸損失函數) 目前權重下所有X資料計算出來的y資料(預測資料)和真實的y資料之間的差的平方 除以X的樣本數量。
MSE越小,說明預測值Y和真實值Y之間誤差越小。即目前權重越合理。
例子:
給定資料:
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
使用窮舉法尋找0~4之間最合适的值。
最後使用 matplotlib繪圖即可。
代碼實作:
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 計算預測值
def predict(x, w):
num_pre = x * w
return num_pre
# 計算損失值
def loss(num_pre, y_val):
num_loss = (num_pre - y_val) * (num_pre - y_val)
return num_loss
w_ll = [] # 權重清單
mse_ll = [] # 均方誤差清單
loss_sum = 0 # 計算本回合内的損失總量
# 窮舉權重
if __name__ == '__main__':
for w in np.arange(0.0,4.1,0.1):
w = round(w,1)
print("目前的權重值w為:", w)
for x_val, y_val in zip(x_data, y_data):
num_pre = predict(x_val, w) # 拿到目前窮舉的預測值
num_loss = loss(num_pre, y_val) # 那預測值去計算損失值
loss_sum += num_loss
w_ll.append(w)
mse_ll.append(loss_sum / len(x_data))
loss_sum = 0
print(w_ll)
print(mse_ll)
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.plot(w_ll,mse_ll)
plt.xlabel("權重W")
plt.ylabel("MSE")
plt.show()
得到最終結果:
X軸為權重,Y軸為MSE。
可以看到權重為2的時候。MSE最小。
這裡有個坑,使用 np.arange 有雙浮點數精度損失。
for i in np.arange(0.0,4.0,0.1):
print(i)
部分輸出:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9
1.0
1.1
1.2000000000000002
1.3
1.4000000000000001
1.5
1.6
1.7000000000000002
1.8