逻辑回归以及损失函数
什么是逻辑回归?
逻辑回归是一种用于二分类(多分类)问题的概率线性模型,常用于预测某样本属于某一类别的概率。
逻辑回归的基本思想
逻辑回归试图通过一个线性函数预测自变量x与因变量y的关系,再通过sigmoid函数将线性结果z映射为概率分布。
模型表示:
逻辑函数(sigmoid):
输出概率:
损失函数
二分类
逻辑回归的目标是让预测概率尽可能贴近真实标签。
采用对数损失函数,即交叉熵损失:
为真实标签(0或1)
是预测概率
对N个样本的平均损失:
多分类
多分类问题中,假设有 C 个类别,每个样本的标签y是一个整数(0~C-1),
是长度为C的概率分布(softmax输出):
:是第i个样本对其真实类别
的预测概率。
逻辑回归损失函数代码实现
二分类
import numpy as npdef sigmoid(z):return 1/(1+np.exp(-z))def cross_entropy_loss(pred, gt):''':param pred: shape(N,),预测为某类的概率:param gt: shape(N,),真实标签,0 or 1'''eps = 1e-15pred = np.clip(pred, eps, 1-eps) # 将pred限制在[eps,1-eps]中,超过区间上界的值会被设为上界,低于下界的值会被设为下界loss = -np.mean(gt*np.log(pred)+(1-gt)*np.log(1-pred))return lossgt = np.array([1,0,1,0])
pred_logits = np.array([2,-1,0,-2])
pred = sigmoid(pred_logits)
loss = cross_entropy_loss(pred, gt)
print(loss)
多分类
import numpy as npdef sigmoid(z):return 1 / (1+np.exp(-z))def cross_entropy_loss(pred,gt):''':param pred: [BS,classes] 每行是各类概率(softmax的输出):param gt: [BS,] 每个元素是类别编号:return:'''eps = 1e-15pred = np.clip(pred, eps, 1-eps)N = pred.shape[0] # [N*classes]correct_class_probs = pred[np.arange(N),gt]loss = -np.mean(np.log(correct_class_probs))return lossdef softmax(z):z = z-np.max(z)exp_z = np.exp(z)return exp_z/np.sum(exp_z)gt = np.array([2,0,1,2]) # 4个样本,3分类
pred_logits = np.array([[1.2,0.2,2.1],[2.0,1.1,4.0],[0.5,1.5,1.8],[1.1,0.3,2.5]])
pred_probs = softmax(pred_logits)
loss = cross_entropy_loss(pred_probs,gt)
print(loss)