线性回归预测模型的实现(linear model)y=x*w+b
通过 numpy包穷举找到线性模型的预测的w和b值,并用matplotlib和mpl_toolkits包画出在训练过程中w、b、loss的三维变化。
1、实现y=x*w + b线性回归预测。关键是求解出w和b的值,w和b的值知道了其线性模型就确定了。
如下图所示:
x | y |
---|---|
1 | 5 |
2 | 8 |
3 | 11 |
2、训练模型需要调用的包和原始数据(存于列表中,为浮点型),还包括通过调用numpy包中的函数实现穷举w和b的值,并将值存入矩阵中,便于后面进行矩阵运算。#pic_center
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#这里设函数为y=3x+2
x_data = [1.0,2.0,3.0]
y_data = [5.0,8.0,11.0]
#并且设置穷举值,W、B,为一维array数组(通过向量表示),然后合并到矩阵中,[w,b]=np.meshgrid(W,B)。
mse_list = []
W=np.arange(0.0,4.1,0.1) #w值变化的范围
B=np.arange(0.0,4.1,0.1) #b值变化的范围
[w,b]=np.meshgrid(W,B)
3、模型在训练过程中,计算损失值loss的方法,用预测值-真实值的平方。
MSE表示平均损失,用cost表示计算,过程是计算每个样本的loss然后求和再求平均。
4、下面两个自定义函数,forward函数表示对线性模型进行预测,loss函数表示计算每个样本的损失值。
#预测,得到的是y预测值,y = x*w + b
def forward(x):
return x * w + b
#损失函数,平方来表示,,,,cost为误差
def loss(x,y):
y_pred = forward(x)
return (y_pred-y)*(y_pred-y)
5、下面是经过简单的穷举法,也可理解为循环遍历所有的样本数据,找出适合样本数据的w、b值,计算每个样本数据的损失值。并将每个w和b对应的损失值求和存于l_sum中,便于后面的画图。
l_sum = 0
for x_val, y_val in zip(x_data, y_data):
y_pred_val = forward(x_val)
print(y_pred_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val #因为只有3个样本数据所以除以3
6、数据可视化(画图),画出3维的立体图。
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, l_sum/3)
# 设置坐标轴标签
ax.set_xlabel("w")
ax.set_ylabel("b")
ax.set_zlabel("loss")
plt.show()
该线性回归预测模型的完整程序,y = x*w + b
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#这里设函数为y=3x+2
x_data = [1.0,2.0,3.0]
y_data = [5.0,8.0,11.0]
#预测
def forward(x):
return x * w + b
#损失函数,平方来表示,,,,cost为误差
def loss(x,y):
y_pred = forward(x)
return (y_pred-y)*(y_pred-y)
mse_list = []
W=np.arange(0.0,4.1,0.1) #w值变化的范围
B=np.arange(0.0,4.1,0.1) #b值变化的范围
[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)
print(y_pred_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, l_sum/3)
# 设置坐标轴标签
ax.set_xlabel("w")
ax.set_ylabel("b")
ax.set_zlabel("loss")
plt.show()
以上是本人的浅显见解,还请多多指教。