线性模型(Linear Model)
任务说明:创建三个数据点,用线性模型对数据进行拟合,模型参数(w, b)的确定采用穷举法,计算损失函数mse,将每对(w,b)的mse显示出来,最后绘制(w,b,mse)三维曲线图,确定最优的线性模型。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
train_x = [1.0, 2.0, 3.0]
train_y = [2.0, 4.0, 6.0]
def predict(x):
return w * x + b
def loss(x, y):
pred_y = predict(x)
return (y - pred_y)*(y - pred_y)
W = np.arange(0, 4.1, 0.1)
B = np.arange(-0.5, 0.6, 0.1)
w_matrix, b_matrix = np.meshgrid(W, B)
mse_matrix = np.zeros([w_matrix.shape[0], w_matrix.shape[1]])
for i in range(w_matrix.shape[0]):
for j in range(w_matrix.shape[1]):
w, b = w_matrix[i][j], b_matrix[i][j]
print("w ={0} b = {1}".format(w, b))
total_loss = 0.0
for x_val, y_val in zip(train_x, train_y):
y_pred = predict(x_val)
loss_n = loss(x_val, y_val)
print("\t", x_val, y_val, y_pred, loss_n)
total_loss += loss_n
print("mse = {}".format(total_loss / 3))
print("----------------------------")
mse_matrix[i][j] = total_loss / 3
print(np.where(mse_matrix==np.min(mse_matrix))) #找到mse最小值的索引
# print(mse_matrix[5][20])
# print(w_matrix[5][20])
# print(b_matrix[5][20])
#绘制三维图
fig = plt.figure()
ax = fig.gca(projection='3d')
plt.xlabel('w')
plt.ylabel('b')
ax.plot_surface(w_matrix, b_matrix, mse_matrix,rstride=1, cstride=1, cmap=cm.coolwarm,linewidth=0, antialiased=False)
plt.show()
前面mse的计算没有特别说明的,注意使用plot_surface绘制三维图时,要求mse必须是二维数据,开始的思路是先用列表存储w,b和mse的值,再使用meshgrid()创建W和B,最后将mse转换为二维数据,但是这个过程中由于W和B是由生成的列表转化而来,不仅矩阵很大,而且数据的排列顺序发生变化,导致mse矩阵的生成比较麻烦(这里应该有好方法),因此想到先将w和b也转化为二维,采用meshgrid()函数,直接用其中的值计算mse矩阵。(这里处理的比较笨,但还是能够完成任务的。)
W = np.arange(0, 4.1, 0.1)
B = np.arange(-0.5, 0.6, 0.1)
w_matrix, b_matrix = np.meshgrid(W, B)
mse_matrix = np.zeros([w_matrix.shape[0], w_matrix.shape[1]])
最终绘制出的三维图效果: