以下是跟着b站刘二大人的课程写的课程代码,以及课后作业
线性规划
课堂代码复现:
import numpy as np#引入numpy,数组运算更为方便
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)**2
#初始化存放w和mse(均方误差)的列表,为后续结果展示和画图做准备
w_list=[]
mse_list=[]
#相当于主函数部分
for w in np.arange(0.0,4.1,0.1):
print('w=',w)
l_sum=0
#将每个w的值带进去,得到每个w所对应的均方误差也就是所谓的损失值
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)
#画图,通过图像直观得出cost函数的最低点,找到最优的w的值
plt.plot(w_list,mse_list)
plt.ylabel('LOSS')
plt.xlabel('w')
plt.show()
运行结果:
课后作业代码:
课后作业中用了np.meshgrid可以将坐标向量生成坐标矩阵
sp:
x=np.arange(3)
#x=[0,1,2]
y=np.array([7,8])
res=np.meshgord(x,y)
返回结果: [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]
import numpy as np
import matplotlib.pyplot as plt
#画3维立体图
from mpl_toolkits.mplot3d import Axes3D
#训练集
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
#目标函数
def forward(x):
return x*w+b
#损失值
def loss(x,y):
y_pred=forward(x)
return (y_pred-y)**2
#生成w,b的二维数组,后续不用再将w,b遍历,因为python中的数组有广播机制,会自动将每个数都参与计算
w_list=np.arange(0.0,4.1,0.1)
b_list=np.arange(0.0,4.1,0.1)
[w,b]=np.meshgrid(w_list,b_list)
mse_list=[]
l_sum=0
#得到每一组w,b对应的损失值
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=l_sum+loss_val
print('\t',x_val,y_val,y_pred_val,loss_val)
print('MSE=',l_sum/3)
#画出三位立体图
mse_list.append(l_sum/3)
fig=plt.figure()
ax1= Axes3D(fig)
ax1.plot_surface(w, b, l_sum/3,cmap='rainbow')#画曲面图
plt.show()
生成结果如下图:
送大家一个画玫瑰花的代码:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax = Axes3D(fig)
[x,t]=np.meshgrid(np.array(range(25))/24.0,np.arange(0,575.5,0.5)/575*17*np.pi-2*np.pi)
p=(np.pi/2)*np.exp(-t/(8*np.pi))
u=1-(1-np.mod(3.6*t,2*np.pi)/np.pi)**4/2
y=2*(x**2-x)**2*np.sin(p)
r=u*(x*np.sin(p)+y*np.cos(p))
surf=ax.plot_surface(r*np.cos(t),r*np.sin(t),u*(x*np.cos(p)-y*np.sin(p)),rstride=1,cstride=1,cmap='rainbow',
linewidth=0,antialiased=True)
plt.show()
结果:
谢谢观看,后面持续更新,欢迎大家监督哦~