浏览本文须要的背景知识点:对数几率回归算法、一丢丢编程常识
一、引言
后面介绍了对数几率回归算法,该算法叫做回归算法,但其实是用来解决分类问题,将数据集分为了两类,用0、1或者是-1、1来示意。事实中不仅仅有二分类问题,同时也有很多是例如辨认手写数字0~9等这种多分类的问题,上面咱们就来介绍下多分类的对数几率回归算法1(Multinomial Logistic Regression Algorithm)
二、模型介绍
多分类能够通过对二分类进行推广来失去,通过一些策略,能够用二分类器来解决多分类的问题。罕用的策略有:一对一(One vs. One/OvO)、一对其余(One vs. Rest/OvR)、多对多(Many vs. Many/MvM)
例如有如下数据集分类:
一对一(One vs. One/OvO)
一对一的策略是每次只解决两个类别,将全副N个类别两两配对,会产生 N(N-1)/2 个二分类的工作。
如上面的表格所示,一共有苹果、梨子、香蕉、桃子这四种分类,会产生六种不同的后果,所以须要六个不同的分类器。须要预测新的是哪一类时,只需通过这些分类器的后果,其中预测最多的分类就是最终的分类后果。
一对其余(One vs. Rest/OvR)
一对其余的策略是将一个类别作为正例,其余所有的类别当成反例,全副N个类别会产生N个二分类的工作。
如上面的表格所示,一共有苹果、梨子、香蕉、桃子这四种分类,会产生四种不同的后果,所以须要四个不同的分类器。须要预测新的是哪一类时,只需抉择分类器预测后果为正的后果作为最终分类后果,若有多个分类器都预测为正,则抉择权重最大的分类器的分类后果。
多对多(Many vs. Many/MvM)
多对多的策略是将若干类别作为正例、若干类别作为反例,通过肯定的编码,实现多分类的问题。常见的次要有二元码与三元码。二元码将每种类型看成正例或者反例,三元码除了正反例以外有一个停用类,即分类时不应用。
二元码:如上面的表格所示,一共有苹果、梨子、香蕉、桃子这四种分类,这里用了五个分类器来编码后果,如 h1 将苹果、香蕉、桃子作为反例,将梨子作为正例。须要预测新的是哪一类时,通过五个分类器的后果与原始后果比拟,这里应用海明间隔,即后果有多少不统一的数量,间隔最小的分类就是最终分类后果。
三元码:如上面的表格所示,一共有苹果、梨子、香蕉、桃子这四种分类,这里用了七个分类器来编码后果,如 h2 将苹果作为反例,将香蕉、桃子作为正例,不应用梨子的分类。须要预测新的是哪一类时,通过这七个分类器的后果与原始后果比拟,一样应用海明间隔,间隔最小的分类就是最终分类后果。
能够看到OvO、OvR是MvM的非凡状况。OvO绝对OvR来说,须要更多的分类器模型,所以其存储与预测阶段的开销会更大,但在训练阶段应用的数据量更小,相对来说这部分开销会小一些。MvM这种编码的形式具备肯定的纠错能力,某个分类器的后果谬误,可能对最初的分类后果不会有影响,所以这种形式叫做纠错输入码(Error Correcting Output Codes/ECOC)
多分类对数几率回归
多分类对数几率回归与二分类的对数几率回归不同的是,不再应用逻辑函数(Logistic Function),而是应用Softmax函数2(Softmax Function),该函数能够看作是对逻辑函数的一种推广。
Softmax函数能将一个含任意实数的K维向量z“压缩”到另一个K维实向量(z)中,使得每一个元素的范畴都在(0,1)之间,并且所有元素的和为1。
$$\sigma(z)_{j}=\frac{e^{z_{j}}}{\sum_{i=1}^{K} e^{z_{i}}} \quad(j=1, \cdots, K)$$
假如有K种分类,能够将每种分类的条件概率写成Softmax函数的模式,行将每个分类的线性组合后果带入到Softmax函数中:
$$P(y=j \mid x, W)=\frac{e^{W_{j}^{T} x}}{\sum_{i=1}^{K} e^{W_{i}^{T} x}} \quad(j=1, \cdots, K)$$
其假如函数为:
$$h(x)=\left[\begin{array}{c}P(y=1 \mid x, W) \\P(y=2 \mid x, W) \\\cdots \\P(y=K \mid x, W)\end{array}\right]=\frac{1}{\sum_{i=1}^{K} e^{W_{i}^{T} x}}\left[\begin{array}{c}e^{W_{1}^{T} x} \\e^{W_{2}^{T} x} \\\cdots \\e^{W_{K}^{T} x}\end{array}\right]$$
因为多分类对数几率回归应用了Softmax函数,所以该回归算法有时也被称为Softmax回归(Softmax Regression)
多分类对数几率回归的代价函数
与二分类对数几率回归的代价函数一样,也是应用最大似然函数的对数模式,首先写出其似然函数:
$$L(W)=\prod_{i=1}^{N} \prod_{j=1}^{K}\left(\frac{e^{W j^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)^{1_{j}\left(y_{i}\right)}$$
其中指数局部为批示函数(indicator function),代表当第i个y的值等于分类j时函数返回1,不等于时返回0,如下所示:
$$1_A(x) = \left\{\begin{matrix} 1 & x \in A\\ 0 & x \notin A\end{matrix}\right.$$
而后对似然函数取对数后加个负号,就是多分类对数几率回归的代价函数了,咱们的指标仍然是最小化该代价函数:
$$\operatorname{Cost}(W)=-\sum_{i=1}^{N} \sum_{j=1}^{K} 1_{j}\left(y_{i}\right) \ln \left(\frac{e^{W j^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)$$
该代价函数也是凸函数,仍然能够应用梯度降落法进行最小化的优化。
三、原理证实
多分类对数几率回归的代价函数为凸函数
同后面的证实一样,只需证实当函数的黑塞矩阵是半正定的,则该函数就为凸函数。
(1)代价函数对W求梯度,推导时须要留神下标
(2)能够将代价函数中的第二个连加操作拆成两个式子,后面一个为连加中的第j个式子,前面为连加项但不包含第j项,这时的下标用l示意
(3)将除法的对数写成对数的减法
(4)第一个连加操作对求梯度不影响,间接写到最外层。批示函数对求梯度也没有影响,利用求导公式别离对前面几项求梯度
(5)整顿后能够看到前面两项又能够合成同一个连加
(6)因为y的取值必然会在1-K中,批示函数的从1-K连加必然等于1
$$\begin{aligned}\frac{\partial \operatorname{Cost}(W)}{\partial W_{j}} &=\frac{\partial}{\partial W_{j}}\left(-\sum_{i=1}^{N} \sum_{j=1}^{K} 1_{j}\left(y_{i}\right) \ln \frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right) & (1) \\&=\frac{\partial}{\partial W_{j}}\left(-\sum_{i=1}^{N}\left(1_{j}\left(y_{i}\right) \ln \frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}+\sum_{l \neq j}^{K} 1_{l}\left(y_{i}\right) \ln \frac{e^{W_{l}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)\right) & (2) \\&=\frac{\partial}{\partial W_{j}}\left(-\sum_{i=1}^{N}\left(1_{j}\left(y_{i}\right)\left(W_{j}^{T} X_{i}-\ln \sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}\right)+\sum_{l \neq j}^{K} 1_{l}\left(y_{i}\right)\left(W_{l}^{T} X_{i}-\ln \sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}\right)\right)\right) & (3) \\&=-\sum_{i=1}^{N}\left(1_{j}\left(y_{j}\right)\left(X_{i}-\frac{e^{W_{j}^{T} X_{i}} X_{i}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)+\sum_{l \neq j}^{K} 1_{l}\left(y_{i}\right)\left(0-\frac{e^{W_{j}^{T} X_{i}} X_{i}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)\right) & (4) \\&=-\sum_{i=1}^{N}\left(X_{i}\left(1_{j}\left(y_{i}\right)-\sum_{j=1}^{K} 1_{j}\left(y_{i}\right) \frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)\right) & (5) \\&=-\sum_{i=1}^{N}\left(X_{i}\left(1_{j}\left(y_{i}\right)-\frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)\right) & (6) \end{aligned}$$
(1)代价函数对W求黑塞矩阵
(2)第一项对W来说为常数,只需对第二项求导
(3)利用求导公式求出对应的导数
(4)整顿后果,分子为连加中去掉第j项
$$\begin{aligned}\frac{\partial^{2} \operatorname{Cost}(W)}{\partial W_{j} \partial W_{j}^{T}} &=\frac{\partial}{\partial W_{j}}\left(-\sum_{i=1}^{N}\left(X_{i}\left(1_{j}\left(y_{i}\right)-\frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}}\right)\right)\right) & (1)\\&=\sum_{i=1}^{N} \frac{\partial}{\partial W_{j}}\left(\frac{e^{W_{j}^{T} X_{i}}}{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}} X_{i}\right) & (2)\\&=\sum_{i=1}^{N} \frac{\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}} e^{W_{j}^{T} X_{i}} X_{i}-e^{W_{j}^{T} X_{i}} e^{W_{j}^{T} X_{i}} X_{i}}{\left(\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}\right)^{2}} X_{i} & (3)\\&=\sum_{i=1}^{N} \frac{\sum_{k \neq j}^{K} e^{W_{k}^{T} X_{i}} e^{W_{j}^{T} X_{i}}}{\left(\sum_{k=1}^{K} e^{W_{k}^{T} X_{i}}\right)^{2}} X_{i} X_{i}^{T} & (4)\end{aligned}$$
同后面的证实,黑塞矩阵后面的常数必然大于零,则对应的黑塞矩阵矩阵为正定矩阵,阐明其代价函数为凸函数,证毕。
对数几率回归是多分类对数几率回归的特例
(1)当K的值为2时,带入到多分类对数几率回归的假如函数
(2)将分子分母同时乘以e的-W1次幂
(3)e的零次幂为1,化简可得
(4)将W2-W1视为新的w,这时会发现假如函数就为二分类的对数几率回归的假如函数
$$\begin{aligned}h(x) &=\frac{1}{e^{W_{1}^{T} x}+e^{W_{2}^{T} x}}\left[\begin{array}{c}e^{W_{1}^{T} x} \\e^{W_{2}^{T} x}\end{array}\right] & (1)\\&=\frac{1}{e^{0^{T} x}+e^{\left(W_{2}-W_{1}\right)^{T} x}}\left[\begin{array}{c}e^{0^{T} x} \\e^{\left(W_{2}-W_{1}\right)^{T} x}\end{array}\right] & (2) \\&=\frac{1}{1+e^{\left(W_{2}-W_{1}\right)^{T} x}}\left[\begin{array}{c}1 \\e^{\left(W_{2}-W_{1}\right)^{T} x}\end{array}\right] & (3) \\&=\left[\begin{array}{c}\frac{1}{1+e^{\hat{w}^{T} x}} \\\frac{e^{\hat{w}^{T} x}}{1+e^{\hat{w}^{T} x}}\end{array}\right] & (4)\end{aligned}$$
对数几率回归是多分类对数几率回归在K=2时候的特例,也能够看到多分类对数几率回归的权重系数具备冗余的性质,即权重系数同时扭转雷同的值时,对最初的预测后果不影响。
四、代码实现
应用 Python 实现多分类对数几率回归算法(梯度降落法):
import numpy as npdef dcost(X, y, w): """ 多分类对数几率回归的代价函数的梯度 args: X - 训练数据集 y - 指标标签值 w - 权重系数 return: 代价函数的梯度 """ ds = np.zeros(w.shape) for i in range(X.shape[0]): c = np.sum(np.exp(w.dot(X[i]))) for j in range(w.shape[1]): a = 0 if j == y[i]: a = 1 b = np.exp(w[j].dot(X[i])) ds[j] = ds[j] - X[i] * (a - b / c) return dsdef direction(d): """ 更新的方向 args: d - 梯度 return: 更新的方向 """ return -ddef multinomialLogisticRegressionGd(X, y, max_iter=1000, tol=1e-4, step=1e-3): """ 多分类对数几率回归,应用梯度降落法(gradient descent) args: X - 训练数据集 y - 指标标签值 max_iter - 最大迭代次数 tol - 变动量容忍值 step - 步长 return: W - 权重系数 """ y_classes = np.unique(y) # 初始化 W 为零向量 W = np.zeros((len(y_classes), X.shape[1])) # 开始迭代 for it in range(max_iter): # 计算梯度 d = dcost(X, y, W) # 当梯度足够小时,完结迭代 if np.linalg.norm(x=d, ord=1) <= tol: break p = direction(d) # 更新权重系数 W W = W + step * p return W
五、第三方库实现
scikit-learn3 实现多分类对数几率回归:
from sklearn.linear_model import LogisticRegression# 初始化多分类对数几率回归器,无正则化reg = LogisticRegression(penalty="none", multi_class="multinomial")# 拟合线性模型reg.fit(X, y)# 权重系数W = reg.coef_# 截距b = reg.intercept_
六、动画演示
下图展现了存在三种分类时的演示数据,其中红色示意标签值为0的样本、蓝色示意标签值为1的样本、绿色示意标签值为2的样本:
下图为应用梯度降落法拟合数据的后果,其中浅红色示意拟合后依据权重系数计算出预测值为0的局部,浅蓝色示意拟合后依据权重系数计算出预测值为1的局部,浅绿色示意拟合后依据权重系数计算出预测值为2的局部:
七、思维导图
八、参考文献
- https://en.wikipedia.org/wiki...
- https://en.wikipedia.org/wiki...
- https://scikit-learn.org/stab...
残缺演示请点击这里
注:本文力求精确并通俗易懂,但因为笔者也是初学者,程度无限,如文中存在谬误或脱漏之处,恳请读者通过留言的形式批评指正
本文首发于——AI导图,欢送关注