目录
1、普通逻辑回归 一个样本中一条数据有1个特征
x1(X)->y1
x2(X)->y2
.............
xn->yn
2、多维特征:一个样本中一条数据有n个特征(以n=8为例)
x1(X1 X2...X8)->y1
x2(X1 X2...X8)->y2
........
xn(X1 X2...X8)->yn
计算流程:矩阵乘法
故代码中修改self.linear=torch.nn.Linear(8,1)
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear=torch.nn.Linear(8,1)
self.sigmoid=torch.nn.Sigmoid()
def forward(self,x):
x=self.sigmoid(self.linear(x))
return x
model=Model()
(8,1)表示什么?
答:w的维度(8,1)
或者 x(N,8)的8个特征的输入->y(N,1)的1个特征的输出 ,x、y的列表示特征量。
两层时候:
假设第一个w(8,2),
则先经过(8,2)的线性变化在经过(2,1)的线性变化就可以得到一个特征输出的y(N,1),8维降成2维,2维降成1维。
目标是找一个8维空间到1维空间的非线性的空间变换,神经网络中,引入sigmoid函数给线性变换增加非线性操作,使得可以拟合相应的非线性的变换。变换的维度和层数决定网络的复杂程度。
中间如何过度8D->2D->1D 还是8D->24D->12D->1D 具体取什么比较好,这就是一个典型的超参数的搜索。一般隐层越多,中间步骤越多,中间神经元越多,模型对非线性变换的学习能力就越强。学习能力强,会学到输入样本中噪声的规律也学到,所以要学的是数据真值本身的规律,所以学习能力太强也不好。
3、代码:
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
print(iris.keys())
# 数据预处理,包括从数据集里区分输入输出,最后把输入输出数据封装成Pytorch期望的Variable格式
X_train= iris['data'] # 特征信息
y_train= iris['target'] # 目标分类
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1=torch.nn.Linear(8,6)
self.linear2= torch.nn.Linear(6,4)
self.linear3= torch.nn.Linear(4,1)
self.sigmoid=torch.nn.Sigmoid()
def forward(self,x):
x=self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model=Model()
criterion=torch.nn.BCELoss(size_average=True)
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)
px,py = [],[] # 记录要绘制的数据
for epoch in range(1000):
y_pred=model(X_train)
loss=criterion(y_pred-y_train)
print(epoch,loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
# px.append(epoch)
# py.append(loss.item())
#
# # 每十次迭代绘制训练动态
# if epoch% 10 == 0:
# plt.cla()
# plt.plot(px, py, 'r-', lw=1)
# plt.text(0, 0, 'Loss=%.4f' % loss.item(), fontdict={'size': 20, 'color': 'red'})
# plt.pause(0.1)