逻辑回归从零实现以及PyTorch实现

简介: 逻辑回归从零实现以及PyTorch实现

逻辑回归原理参考链接:线性分类|机器学习推导系列(四)


一、逻辑回归从零开始实现


1. 导入所需要的库

import numpy as np
import matplotlib.pyplot as plt


2. 人工构造数据集


构造一个比较简单的二分类数据集,满足高斯分布,并进行了数据的可视化。

def create_data(size):
    X0=np.random.normal(2,1,(size,2))
    y0=np.zeros(size)
    X1=np.random.normal(-2,1,(size,2))
    y1=np.ones(size)
    X=np.concatenate((X0,X1),axis=0)
    y=np.concatenate((y0,y1),axis=0)
    return X,y
X,y=create_data(1000)
X_test,y_test=create_data(100)
# 可视化数据
plt.scatter(X[:,0],X[:,1],c=y,s=40,lw=0, cmap='RdYlGn')
plt.show()
# 添加偏置
X=np.insert(X,0,1,axis=1)
y=y.reshape(y.shape[0],-1)
X_test=np.insert(X_test,0,1,axis=1)
y_test=y_test.reshape(y_test.shape[0],-1)


3. 初始化模型参数

n_samples,n_features=np.shape(X)
limit=np.sqrt(n_features)
w=np.random.uniform(-limit,limit,(n_features,1)) # 学习参数
lr=.1 # 学习率
iters=1001 # 迭代次数


4. 定义sigmoid函数

def sigmoid(x):
    return 1/(1+np.exp(-x))


5. 定义优化算法

def gradient_descent(X,y,w,lr):
    y_pred=sigmoid(X@w)
    gradient=-((y-y_pred)*X).sum(axis=0)
    gradient=gradient.reshape(gradient.shape[0],-1)
    w=w-lr*gradient
    return w


6. 定义损失函数

def loss(X,y,w):
    y_pred=sigmoid(X@w)
    delta=1e-7
    left_log=np.log(y_pred+delta)
    right_log=np.log(1-y_pred+delta)
    l=-(y*left_log+(1-y)*right_log).sum()
    return l


7. 训练模型


定义测试函数。

def test(X_test,y_test):
    y_test_pred=sigmoid(X_test@w)
    y_test_pred[y_test_pred>=0.5]=1.0
    y_test_pred[y_test_pred<0.5]=0.0
    correct_list=[]
    for i,pred in enumerate(y_test_pred):
        is_correct = 1 if pred==y_test[i] else 0
        correct_list.append(is_correct)
    acc = sum(correct_list) / len(y_test)
    return acc


定义训练过程,并且进行记录。

iter_num=[]
acc_num=[]
loss_num=[]
for i in range(iters):
    w=gradient_descent(X,y,w,lr)
    if i%50 == 0:
        iter_num.append(i)
        acc_num.append(test(X_test,y_test))
        loss_num.append(loss(X,y,w))


8. 结果可视化

plt.subplot(221)
plt.plot(iter_num,acc_num,color='r',label='acc') 
plt.xlabel('epochs')
plt.ylabel('acc')
plt.title("acc")
plt.legend()
plt.show()
plt.subplot(222)
plt.plot(iter_num,loss_num,color='r',label='loss') 
plt.xlabel('epochs')
plt.ylabel('loss')
plt.title("loss")
plt.legend()
plt.show()


二、使用torch.nn实现逻辑回归


1. 导入所需要的库

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


2. 人工构造数据集


使用与之前同样的数据。

def create_data(size):
    n_data=torch.ones(size,2)
    X0=torch.normal(2*n_data,1)
    y0=torch.zeros(size)
    X1=torch.normal(-2*n_data,1)
    y1=torch.ones(size)
    X=torch.cat((X0,X1),0).type(torch.FloatTensor)
    y=torch.cat((y0,y1),0).type(torch.FloatTensor)
    return X,y
X,y=create_data(1000)
X_test,y_test=create_data(100)
plt.scatter(X.data.numpy()[:,0],X.data.numpy()[:,1],c=y.data.numpy(),s=40,lw=0,cmap='RdYlGn')
plt.show()


3. 定义模型


逻辑回归相当于一个两层神经网络,输出层只有一个节点,并且激活函数为sigmoid函数。

class LogisticRegression(nn.Module):
    def __init__(self):
        super(LogisticRegression,self).__init__()
        self.lr = nn.Linear(2,1)
        self.sigmoid = nn.Sigmoid()
    def forward(self,X):
        X=self.lr(X)
        X=self.sigmoid(X)
        return X
model = LogisticRegression()


4. 定义损失函数和优化器

criterion=nn.BCELoss()
optimizer=torch.optim.Adam(model.parameters(),lr=1e-3)


5. 训练模型

iter_num=[]
acc_num=[]
loss_num=[]
for epoch in range(3):
    logit=model(X)
    loss=criterion(logit,y)
    y_pred=logit.ge(0.5).float()
    correct=(y_pred==y).sum()
    acc=correct.item()/X.size(0)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if (epoch+1)%1==0:
        iter_num.append(epoch)
        acc_num.append(acc)
        loss_num.append(loss.data.item())
        print('epoch:{}'.format(epoch+1),',','loss:{:.4f}'.format(loss.data.item()),',','acc:{:.4f}'.format(acc))


6. 结果可视化

plt.subplot(221)
plt.plot(iter_num,acc_num,color='r',label='acc') 
plt.xlabel('epochs')
plt.ylabel('acc')
plt.title("acc")
plt.legend()
plt.show()
plt.subplot(222)
plt.plot(iter_num,loss_num,color='r',label='loss') 
plt.xlabel('epochs')
plt.ylabel('loss')
plt.title("loss")
plt.legend()
plt.show()


相关文章
|
机器学习/深度学习 算法 PyTorch
用PyTorch轻松实现二分类:逻辑回归入门
用PyTorch轻松实现二分类:逻辑回归入门
用PyTorch轻松实现二分类:逻辑回归入门
|
数据采集 PyTorch 数据处理
Pytorch学习笔记(3):图像的预处理(transforms)
Pytorch学习笔记(3):图像的预处理(transforms)
2667 1
Pytorch学习笔记(3):图像的预处理(transforms)
|
网络安全 开发者 iOS开发
iOS技术博客:App备案指南
本文介绍了移动应用程序(App)备案的重要性和流程。备案是规范App开发和运营的必要手段,有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程,本文提供了一份最新、最全、最详的备案指南,包括备案目的、好处、对象、时间、流程、条件和注意事项等内容。
iOS技术博客:App备案指南
|
存储 机器学习/深度学习 算法
Python 图像处理实用指南:1~5
Python 图像处理实用指南:1~5
1674 0
|
计算机视觉 Python
图像增强、锐化,利用 Python-OpenCV 来实现 4 种方法!
图像增强目的使得模糊图片变得更加清晰、图片模糊的原因是因为像素灰度差值变化不大,图片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰度值差值、使图像中的细节更加清晰。
图像增强、锐化,利用 Python-OpenCV 来实现 4 种方法!
|
存储 算法 计算机视觉
OpenCV(四十二):Harris角点检测
OpenCV(四十二):Harris角点检测
739 0
|
机器学习/深度学习 计算机视觉 Python
图像数据的特征提取与预处理方法,涵盖图像数据的特点、主要的特征提取技术
本文深入探讨了图像数据的特征提取与预处理方法,涵盖图像数据的特点、主要的特征提取技术(如颜色、纹理、形状特征)及预处理步骤(如图像增强、去噪、分割)。同时介绍了Python中常用的OpenCV和Scikit-image库,并提供了代码示例,强调了预处理的重要性及其在提升模型性能中的作用。
2324 5
|
消息中间件 人工智能 Kafka
Apache Kafka + 向量数据库 + LLM = 实时 GenAI
生成式AI(GenAI)革新了企业架构,催生新数据集成模式与最佳实践。借助Apache Kafka与Apache Flink,企业能高效处理大规模实时数据,连接各类数据库与分析平台。Kafka作为核心组件,支持GenAI应用如服务台自动化、聊天机器人及内容审核。结合大型语言模型(LLM)、检索增强生成(RAG)与向量数据库,Kafka与Flink共同打造强大数据流处理能力,克服GenAI挑战,如昂贵训练成本、数据时效性与准确性。通过语义搜索与RAG设计模式,确保LLM生成内容可靠无误。
883 0
|
机器学习/深度学习 异构计算
【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络
【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络
|
存储 开发框架 Java
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程
在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理,开发人员甚至感觉不到这一过程的存在。.NET程序可以找出某个时间点上哪些已分配的内存空间没有被程序使用,并自动释放它们。自动找出并释放不再使用的内存空间机制,就称为垃圾回收机制。本文主要介绍.Net中的GC(垃圾回收)机制及其整体流程。
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程

热门文章

最新文章