说明:1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面,添加了激活函数(非线性变换)
2、分布的差异:KL散度,cross-entropy交叉熵
说明:预测与标签越接近,BCE损失越小。
import torch
import matplotlib.pyplot as plt
from torch.autograd.grad_mode import F
#创造数据
x_data=torch.tensor([[1.0],[2.0],[3.0]])
y_data=torch.tensor([[0],[0],[1]]).float()
class Logiesite(torch.nn.Module):
def __init__(self):
super(Logiesite,self).__init__()
self.linear=torch.nn.Linear(1,1)#输入特征一个,输出特征一个,并对参数w,b进行随机初始化
def forward(self,x):
y_pre=torch.sigmoid(self.linear(x))#在线性的基础上再加上一层sigmoid,将预测值转换成(0,1)区间上的概率
return y_pre
logi=Logiesite()
critizion=torch.nn.BCELoss(size_average = False)
option=torch.optim.SGD(logi.parameters(),lr=0.01)
yset=[]
for epoch in range(100):
y_pre=logi(x_data)#预测
loss=critizion(y_pre,y_data)#计算损失值
print(y_pre.data.numpy())
yset.append(y_pre.data.numpy())
option.zero_grad()#梯度归零
loss.backward()#反向传递计算梯度
option.step()#更新参数
print("epoch:",epoch," loss:",loss.item())
print("权重 (w):", logi.linear.weight.item())
print("偏置 (b):", logi.linear.bias.item())
#预测与绘图
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,10,200)
#这行代码生成了一个包含200个元素的等差数列 x,从0到10之间均匀分布的数据点。这些数据点将被用作输入数据。
x_t=torch.Tensor(x).view(200,1)#对PyTorch张量进行形状变换(reshape)的操作。
# 在这个特定的情境下,它用于将原始的一维张量变换为一个二维张量,其中有200行和1列
y_t=logi(x_t)
#得到预测值
y=y_t.data.numpy()
#将预测值转化为numpy数组,便于进行绘图
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='r')
#(0,10)表示x轴上两个点,(0.5,0.5)表示y轴上两点,都是0.5
#用于绘制一条横跨0-10,纵坐标总是0.5的一条红色直线
plt.xlabel("Hours")
plt.ylabel("Probabily")
plt.grid()#给绘图加上网格,便于观察
plt.show()