在学习python的numpy,pandas,matplotlib,sklearn,pytorch,opencv等第三方库时,代码有很多需要理解的地方,故写下此笔记来帮助自己学习,并有助于以后回顾。这可能是比较笨且慢的办法,但对我是有效的。
mpl.rcParams[u'font.sans-serif'] = ['SimHei']:**设置绘图时所使用的字体为宋体**(SimHei)。
mpl.rcParams['axes.unicode_minus'] = False:**解决负号显示为方块的问题**。
file_path = "../datasets/Freestyle100m.csv"
dataset = pd.read_csv(file_path)
dataset_tensor = torch.tensor(dataset.values) # 转换为tensor
x = dataset_tensor[:, :-1]
y = dataset_tensor[:, -1]
如果你的代码文件位于与数据集文件相同的目录下,只需使用一个点即可表示当前目录。例如:
file_path = "./datasets/Freestyle100m.csv"
如果你的代码文件位于数据集文件的上一级目录下,则可以使用两个点来表示上级目录。例如:
file_path = "../datasets/Freestyle100m.csv"
其中,x 和 y 是两个张量,通过调用 numpy() 方法将它们转换为了 NumPy 数组,以便能够在 Matplotlib 中进行绘图。
具体来说,plot 函数的参数如下:
x:横坐标数据,可以是 NumPy 数组、Python 列表、Pandas Series 对象或其他可迭代对象。
y:纵坐标数据,与 x 对应,必须具有相同的长度。
‘o’:指定绘图所使用的符号类型,这里使用的是散点符号。可以根据需要更改为其他符号类型,例如折线符号 ‘-’ 或者曲线符号 ‘.’ 等等。
plt.plot(x.numpy(),y.numpy(),'o')
def main():
# 主要逻辑代码
if __name__ == "__main__":
main()
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
import torch
from matplotlib import pyplot as plt
import pandas as pd
import matplotlib as mpl
# 防止plt汉字乱码
mpl.rcParams[u'font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
def main():
# 加载奥运会数据
file_path = "../datasets/Freestyle100m.csv"
dataset = pd.read_csv(file_path)
dataset_tensor = torch.tensor(dataset.values) # 转换为tensor
x = dataset_tensor[:, :-1]
y = dataset_tensor[:, -1]
# 绘图
plt.plot(x.numpy(), y.numpy(), 'o')
plt.xlabel('奥运会(年)') #设置标签
plt.ylabel('取胜时间(秒)')
plt.show()
if __name__ == "__main__":
main()
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
import torch
from matplotlib import pyplot as plt
import pandas as pd
import matplotlib as mpl
mpl.rcParams[u'font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
def model(x,w,b):
return w*x+b
#损失函数
def loss_fn(y_pred,y):
loss = (y_pred - y)**2
return loss.mean()
#损失函数求导
def grad_loss_fn(y_pred,y):
return (y_pred - y) * 2
#梯度函数
def grad_fn(x,y,y_pred):
grad_w = grad_loss_fn(y_pred,y)*x
grad_b = grad_loss_fn(y_pred,y)
return torch.stack([grad_w.mean(),grad_b.mean()])
def model_training(x,y,n_epoches,learning_rate,params,print_params = True):
for epoch in range(1,n_epoches+1):
w, b = params
#前向传播
y_pred = model(x,w,b)
#计算损失
loss = loss_fn(y_pred,y)
#梯度
grad = grad_fn(x,y,y_pred)
#更新参数
params = params - learning_rate * grad
if epoch == 1 or epoch % 500 == 1:
print("轮次:%d,\t损失:%f"%(epoch,float(loss)))
if print_params:
print(f"参数:{params.detach().numpy()}")
print(f"梯度:{grad.detach().numpy()}")
return params
def main():
file_path = "../datasets/Freestyle100m.csv"
dataset = pd.read_csv(file_path)
dataset_tensor = torch.tensor(dataset.values)
xx = dataset_tensor[:,0]
y = dataset_tensor[:,-1]
x = xx - xx[0]
w = torch.zeros(1)
b = torch.zeros(1)
y_pred = model(x,w,b)
print("未优化模型的预测结果:",y_pred.detach().numpy())
loss = loss_fn(y_pred,y)
print("未优化模型的损失:",loss.detach().numpy())
params = model_training(
x = x,
y = y,
n_epoches = 50000,
learning_rate = 0.00017,
params = torch.tensor([0.0,0.0])
)
print("梯度下降找到的w和b:%f %f\n"%(params[0],params[1]))
y_pred = model(x,*params)
print(f"优化后的模型预测结果:{y_pred.detach().numpy()}\n")
#绘图
plt.plot(xx.numpy(),y_pred.detach().numpy(),label="模型")
plt.plot(xx.numpy(),y.numpy(),'o',label = "数据")
plt.xlabel("奥运会(年)")
plt.ylabel("取胜时间(秒")
plt.legend()
plt.show()
if __name__ == "__main__":
main()