线性模型学习

目录

代码实现

实验分析

扩展实验

知识链接:np.meshgrid简介


代码实现

(1)、导入相关包,准备数据集

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]

(2)、计算预测值

def forward(x):
    return x * w

(3)、计算损失值

def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)

(4)、选定步长为 0.1 从 0 ~ 4.1 的 w 值进行迭代,找到最优解,找到 w

w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 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)

注意:`forward(x)`函数定义了一个单一的参数x,但没有传递参数w。由于w没有作为参数传递给`forward()`函数,那么`forward(x_val)`调用中的w实际上是从外部作用域中访问的变量。

在代码中的循环体内部,通过使用`for w in np.arange(0.0, 4.1, 0.1)`循环遍历了一系列w的值。在每次迭代中,w的值会被打印出来,并用于`forward(x_val)`函数和`loss(x_val, y_val)`函数的计算。

由于w是从外部作用域中访问的变量,所以在每次迭代中,循环体内部的`forward(x_val)`函数调用会使用当前迭代的w值进行计算。同样,`loss(x_val, y_val)`函数调用也会使用相同的w值进行计算。

因此,循环结束后,`w_list`列表中包含了所有迭代过程中的w值,而`mse_list`列表中包含了使用不同w值计算得到的MSE值。这种计算方式是依赖于w作为外部变量被访问的特性,而不是通过参数传递的方式。

(5)、主函数运行,绘制图像进行分析

if __name__ == "__main__":
    plt.plot(w_list, mse_list)
    plt.ylabel('Loss')
    plt.xlabel('w')
    plt.show()

实验分析

由上面实验结果可以看出,当 w = 2 时,损失函数降到最低,找到最优解。

因此这个时候找到了最优的线性模型即为 y^ = 2x

扩展实验

# 使用模型y=wx+b,并绘制三维图形
import numpy as np
import matplotlib.pyplot as plt  # 绘图包

# y = 2x + 1
x_data = [1.0, 2.0, 3.0]  # 数据集保存,x和y需分开,x为输入,y为输出
y_data = [3.0, 5.0, 7.0]


def forward(x):
    return x * W + B


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)


w = np.arange(0.0, 4.1, 0.1)

b = np.arange(0.0, 2.1, 0.1)
[W, B] = np.meshgrid(w, b)


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)

if __name__ == "__main__":
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    ax.plot_surface(W, B, l_sum / 3)  # 引入W,B,l_sum/3三个绘图参数
    plt.show()

可以看到当 w = 2 ,b = 1 时找到最优解!即有最优模型为 y^ = 2 x + 1 

tip:其中`y_pred`是一个数组。 在给定的代码中,`forward(x)`函数返回的是`x * W + B`的计算结果,其中`x`是一个输入值,`W`和`B`是两个二维数组。根据广播规则,当一个一维数组(如`x`)与一个二维数组(如`W`)相乘时,会将一维数组自动扩展为与二维数组的形状相匹配。 因此,`x * W`的计算结果会得到一个与`W`形状相同的二维数组。接着,将该结果与`B`相加,得到最终的输出结果`y_pred`,它也是一个与`W`和`B`形状相同的二维数组。 所以,`y_pred`是一个数组,具有与`W`和`B`相同的形状。在给定的代码中,`W`和`B`的形状都是`(21, 41)`,因此`y_pred`的形状也是`(21, 41)`

知识链接:np.meshgrid简介

import numpy as np
import matplotlib.pyplot as plt  # 绘图包

x = [1.0, 2.0, 3.0]
y = [4.0, 6.0, 8.0,10]

X,Y = np.meshgrid(x,y)

print('X',X)
print('Y',Y)
plt.plot(X,Y,'o--')
plt.grid(True)
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值