线性模型
损失函数(Trainging Loss(Error)
l
o
s
s
=
(
y
^
−
y
)
2
=
(
x
∗
ω
−
y
)
2
\begin{aligned}loss=(\hat{y}-y)^2=(x*\omega-y)^2\end{aligned}
loss=(y^−y)2=(x∗ω−y)2
其中
y
^
\hat{y}
y^为预测值,
y
y
y为实际值,
ω
\omega
ω为权重
平均平方误差(Mean Square Error)
c
o
s
t
=
1
N
∑
n
=
1
N
(
y
^
n
−
y
n
)
2
\begin{aligned}cost&=\frac{1}{N}\sum_{n=1}^N(\hat{y}_n-y_n)^2\end{aligned}
cost=N1n=1∑N(y^n−yn)2
简称MSE
课中代码实现
import matplotlib.pyplot as plt
import numpy as np
#数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
#模型(前馈)
def forward(x):
return x * w
#损失函数
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
#保存权重和损失值
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1): #从0.0到4.0,步长为0.1
print('w=', w)
l_sum = 0
for x_val, y_val in zip(x_data, y_data):
y_pred_val = forward(x_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val
print('\t', x_val, y_val, y_pred_val, loss_val)
print(' MSE=', l_sum / 3)
w_list.append(w)
mse_list.append(l_sum / 3)
plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.grid(alpha=0.4)
plt.show()
提及的可视化工具
- visdom
- mp.meshgride()绘制3D图
课后作业
当模型变为
y
^
=
x
∗
ω
+
b
\hat{y}=x*\omega+b
y^=x∗ω+b
时,求出loss和MSE,并绘图
课后作业代码实现
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
#数据集
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([6.0, 8.0, 10.0])
#设置字体
font = {'family': 'Microsoft YaHei', 'weight': 'bold', 'size': 10}
#模型
def forward(x):
return x * w + b
#损失函数
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
#绘图
fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)
#建立空列表,存放w和mse值
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1):
for b in np.arange(0.0, 8.1, 0.1):
print('w = ', w, ', b = ', b)
l_sum = 0 #损失值之和
loss_val = 0 #当前损失值
for x_val, y_val in zip(x_data, y_data): #将x、y通过zip()映射成(x,y)
y_pred_val = forward(x_val) #y的预测值
loss_val = loss(x_val, y_val) #计算当前损失值
l_sum += loss_val #累计损失值
print('\t', x_val, y_val, y_pred_val, loss_val) #打印当前的x值,y值,y的预测值以及当前的损失值
print('MSE = ', l_sum / 3) #打印MSE值
w_list.append([w, b]) #将w,b追加到w_list中
mse_list.append(l_sum / 3) #将mse添加到mse_list中
w, b = np.meshgrid(np.arange(0.0, 4.1, 0.1), np.arange(0.0, 8.1, 0.1)) #将w,b组成网格,即拓展w,b维度,w拓展列,b拓展行
l_sum = 0 #先初始化l_sum,避免被前面的值影响
for x_val, y_val in zip(x_data, y_data): #还是先把x,y通过zip()映射成(x,y)
loss_val = loss(x_val,
y_val) #此时loss函数中用到的forward()函数中的w、b由于用了meshgride(),已经成了一个Numpy数组了,所有这时候求到的loss_val也是一个Numpy数组
l_sum += loss_val #同上理,这时候l_sum求得的也是一个Numpy数组
mse = l_sum / 3
#将l_sum里面的每一个列表中的每一个元素都除3,再赋给mse,因此mse也是一个Numpy数组,且维度和w,b一致
sc = ax.plot_surface(w, b, mse, # x,y,z二维矩阵(坐标矩阵xv,yv,zv)
rstride=1, # retride(row)指定行的跨度
cstride=1, # retride(column)指定列的跨度
cmap='BrBG_r') # 设置颜色映射
#绘制等高线(投影)
ax.contourf(w, b, mse, offset=-2, cmap='BrBG_r')
ax.text2D(0, 0, 'y_hat=w*x+b')
plt.xlabel('w')
plt.ylabel('b')
ax.set_zlabel('mse')
#绘制图例
#用参数aspect和shrink控制
#aspect还是宽与长的比值
#shrink是等比例缩放系数
#extend用来控制上下两个尖尖
plt.colorbar(sc,extend='both',shrink=0.5,aspect=20)
plt.show()