# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as mp X = np.linspace(0, 2, 100) np.random.shuffle(X) Y = 4 * X + 5 + np.random.normal(0, 0.5, (100,)) train_x, train_y = X[1:60:1], Y[1:60:1] test_x, test_y = X[60:], Y[60:] times = 20 # 定义梯度下降次数 lrate = 0.01 # 记录每次梯度下降参数变化率 # 记录每次梯度下降的索引 w0, w1, losses,epoches = [1], [1], [],[] for i in range(1, times + 1): epoches.append(i) loss = ((w0[-1] + w1[-1] * train_x - train_y) ** 2).sum()/2 losses.append(loss) # 求损失函数关于w0与w1的偏导数,从而更新模型参 d0 = (w0[-1] + w1[-1] * train_x - train_y).sum() d1 = (train_x * (w0[-1] + w1[-1] * train_x - train_y)).sum() # 根据梯度下降公式,更新w0与w1 w0.append(w0[-1] - lrate * d0) w1.append(w1[-1] - lrate * d1) # print("w0=%f,w1=%f,loses=%f"%(w0,w1,losses)) #print('line mode : y= %f + %f * x' % (w0, w1)) linex = np.linspace(train_x.min(), train_x.max(), 200) liney = w1[-1] * linex + w0[-1] mp.figure('Linear Regression ', facecolor='lightgray') mp.title('Linear,Regression ', fontsize=18) mp.scatter(train_x,train_y,s=80,marker='o',color='dodgerblue', label='Samples') mp.plot(linex,liney,color="orange") mp.legend() mp.show() mp.figure('Training Progress ', facecolor='lightgray') mp.title('Training Progress ', fontsize=18) mp.grid(linestyle=':') mp.subplot(311) mp.grid(linestyle=':') mp.ylabel(r'$w_0$',fontsize=14) mp.plot(epoches,w0[ :-1],color='dodgerblue',label=r'$w_os') mp.legend() mp.subplot(312) mp.grid(linestyle=':') mp.ylabel(r'$w_1$',fontsize=14) mp.plot(epoches,w1[ :-1],color='blue' ,label=r'$w_1s') mp.legend() mp.subplot(313) mp.grid(linestyle=':') mp.ylabel(r'$loss$', fontsize=14) mp.plot(epoches,losses, color= 'red',label=r'$loss$') mp.legend() mp.show()
时间: 2023-06-14 09:04:06 浏览: 111
#_--_coding_UTF-8_--_import_sys,os,dlib,glob,nu_PythonFace.zip
这段代码实现了一个简单的线性回归模型,使用梯度下降算法进行参数更新,训练模型拟合一个带有噪声的线性函数。具体实现过程如下:
1. 首先生成100个等间隔的随机数作为输入X,然后将它们随机打乱,生成一个带有噪声的线性函数Y = 4X + 5 + ε,其中ε服从均值为0,标准差为0.5的正态分布。
2. 将前60个样本作为训练集,后40个样本作为测试集。
3. 定义梯度下降的迭代次数为20,学习率为0.01,记录每次梯度下降的参数变化率,以及每次梯度下降的参数值和损失函数值。
4. 在每次迭代中,计算模型在训练集上的损失函数,并根据梯度下降公式更新模型参数(w0和w1)。
5. 记录每次梯度下降的参数值、变化率和损失函数值,并在训练完成后绘制出模型拟合的直线、参数变化率和损失函数随迭代次数的变化图。
需要注意的是,这段代码中的绘图部分使用了matplotlib库,通过subplot函数将三张子图绘制在同一个画布上,分别展示模型参数w0和w1的变化情况,以及损失函数随迭代次数的变化情况。同时,使用scatter和plot函数绘制训练集样本点和模型拟合的直线。
阅读全文