一、上课笔记如下,边听遍记,记的乱乱的;;
二、课后作业
python代码实现线性回归和多项式回归
1.线性回归
(1)思路:设置一个模型,y=wx+r,控制输入x和y的二维数组(有几行就代表有几组数据,有几列就代表有几个特征),w、r一开始随机赋一个初值,然后带入x和y计算loss,根据计算出的loss和设置好的学习率来改变w和r,然后再带入x、y计算loss,循环往复,直到训练满了设置好的次数或者loss为0了为止,跳出循环输出w、r,然后随便输入一个测试值x,拿到验证值y。
(2)程序:可以自己编也可以直接用别人封装好的函数,我是懒狗我选第二种;)
直接编代码实现可以看这个:机器学习5-线性回归算法的代码实现_线性回归代码-CSDN博客
我使用的是pythorch的torch.nn.linear类:PyTorch 深度学习实践 第5讲_model call 深度学习-CSDN博客
(3)额外:
我想能随意更改x和y的维数,所以加了一个数据预处理的函数,作用是写入一个存在误差(大于零小于一)的数组,可以自己规定维数。如果想要改变数据可以把写文件这里注释掉,直接自己往txt文件里写。
import numpy as np
def loadtxt(filename, shape):
# 写文件
size = shape[0] * shape[1]
c = np.array(range(size))
r = np.random.rand(size)
a = c+r
np.savetxt(filename, a, fmt='%f', delimiter=',')
# 读文件
b = np.loadtxt(filename, dtype=np.float32, delimiter=',').reshape(shape)
return b
我还想把loss的降低过程画出来,把训练用的数据点和模型拟合的直线也画出来,所以编写了一个绘图函数,作用就是画图
import numpy as np
import matplotlib.pyplot as plt
# 读取存储为txt文件的数据
def data_read(dir_path):
with open(dir_path, "r") as f:
raw_data = f.read()
data = raw_data[1:-1].split(", ") # [-1:1]是为了去除文件中的前后中括号"[]"
return np.asfarray(data, float)
def draw(dir_path, x_arr, y_arr, w, b, x_t, y_t):
train_loss_path = dir_path # 存储文件路径
y_train_loss = data_read(train_loss_path) # loss值,即y轴
x_train_loss = range(len(y_train_loss)) # loss的数量,即x轴
fig, axs = plt.subplots(1, 2, figsize=(12, 5))
# 左边画loss曲线
axs[0].plot(x_train_loss, y_train_loss, linewidth=1, linestyle="solid", label="train loss")
axs[0].set_xlabel('iters')
axs[0].set_ylabel('loss')
axs[0].legend()
axs[0].set_title('Loss curve')
# 右边画训练集数据点以及模型拟合的直线
axs[1].scatter(x_arr, y_arr, marker='+', label="Data Points")
axs[1].scatter(x_t, y_t, color='g', marker='*', label="Test Points")
size = np.size(x_arr)
x_line = np.array(range(size+1)) # 直线的x坐标范围
y_line = w * x_line + b # 计算直线对应的y坐标
axs[1].plot(x_line, y_line, color='red', label='Fitted Line') # 绘制拟合的直线
axs[1].set_xlabel('x')
axs[1].set_ylabel('y')
axs[1].legend()
axs[1].set_title('linear regression result')
plt.tight_layout()
plt.show()
用这个函数之前要先把训练中所有的loss都存起来,所以要在前文的参考链接代码里面加几句话:
啊对了,以及规定一下存放数据的路径path_loss。
(4)结果:
2.多项式回归
(1)思路:多项式回归感觉跟线性回归的区别就在于直线是单次项相加、曲线是不同次幂的多次项相加,类似于把很多一次项相乘升幂(?)
所以具体流程应该和线性回归流程一致(读数据、建模型、定优化器和loss函数、训练模型、测试模型),只不过在模型构造方面,要多嵌套几层线性模型
(2)程序:
代码参考:Python神经网络学习之5层网络学习多项式回归_5层神经网络代码-CSDN博客
(3)结果: