线性公式 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
这里可以看到有一些非常微小的精度问题,虽然对本题结果基本不构成影响,但是如果数据变得异常大不知道会不会有影响。
而后换成linspace 函数后存在同样的问题。直接使用linspace进行分配不会产生精度问题,而将其放入循环就会产生精度问题,有知道怎么处理的小伙伴,可以给我留言教教我~~~。
在本题中处理精度损失的方法是,直接截取了小数点后一位数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)