PyTorch深度学习实践第二讲——线性模型

线性模型(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]])

最终绘制出的三维图效果: 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值