前言
利用numpy实现线性函数的最小二乘法,预估线性函数的参数,并计算损失函数。
一、先上代码
#线性,最小二乘法
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 forward(x):
return x*w
#定义损失函数
def loss(x,y):
y_pred=forward(x)
return (y_pred-y)*(y_pred-y)
#存储w权重,并记录下对应的cost value
w_list=[]
mse_list=[]
#权重从0,到4,步长为0.1
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)
plt.plot(w_list,mse_list)
plt.ylabel("loss")
plt.xlabel("w")
plt.show()
二、关键点总结
1.数据处理
我们输入的数据为x,输出的为y,一共有三组数据。
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
2.定义模型
我们定义模型为正比例函数,参数w待求
#定义模型
def forward(x):
return x*w
3.定义损失函数
损失函数如下:
def loss(x,y):
y_pred=forward(x)
return (y_pred-y)*(y_pred-y)
3.主函数
主函数如下:主要是我们针对w进行测试,从0到4,步长为0.1,记录损失函数的值。
#存储w权重,并记录下对应的cost value
w_list=[]
mse_list=[]
#权重从0,到4,步长为0.1
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)
4.画图
plt.plot(w_list,mse_list)
plt.ylabel("loss")
plt.xlabel("w")
plt.show()
总结
其实很简单,但是这个简单的模型蕴含了后面我们进行复杂深度学习网络训练的基本思想:
定义模型结构
构造损失函数
不断调参知道损失函数的值降到最小
大家可以往后体会一下这种思想。