[TOC] 更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:<a target="_blank" href="https://www.cnblogs.com/nickchen121/p/11686958.html">http://www.javashuo.com/article/p-vozphyqp-cm.html</a>html
虽然逻辑回归的名字里有“回归”两个字,可是它并非一个回归算法,事实上它是一个分类算法。python
曾经在感知机引入时咱们讲过,操场上男生和女生因为受传统思想的影响,男生和女生分开站着,而且由于男生和女生散乱在操场上呈线性可分的状态,所以咱们总能够经过感知机算法找到一条直线把男生和女生分开,而且最终能够获得感知机模型为 $$ f(x)=sign((w^*)^Tx) $$ 若是你细心点会发现,因为感知模型使用的是sign函数,若是当计算一个样本点$w^Tx=0.001$的时候,$sign(w^Tx)=1$,即该函数会把该样本归为$1$,可是为何他不能是$0$类呢?而且因为sign函数在$x=0$处有一个阶跃,即函数不连续,该函数在数学上也是不方便处理的。git
由此逻辑函数使用sigmoid函数对$w^Tx$作处理,而且把sigmoid函数获得的值$\hat{y}$当成几率进行下一步处理,这也正是逻辑回归对感知机的改进。算法
上述整个过程其实就是逻辑回归一步一步被假想出来的的一个过程,接下来将从理论层面抽象的讲解逻辑回归。数据结构
# 感知机引入图例 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') np.random.seed(1) x1 = np.random.random(20)+1.5 y1 = np.random.random(20)+0.5 x2 = np.random.random(20)+3 y2 = np.random.random(20)+0.5 # 一行二列第一个 plt.subplot(121) plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)') plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)') plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='$wx+b=0$') plt.title('线性可分', fontproperties=font, fontsize=20) plt.xlabel('x') plt.legend(prop=font) # 一行二列第二个 plt.subplot(122) plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)') plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)') plt.scatter(3.5, 1, s=50, color='b') plt.title('线性不可分', fontproperties=font, fontsize=20) plt.xlabel('x') plt.legend(prop=font) plt.show()
回归_6_0.png?x-oss-process=style/watermark)dom
线性回归的假设函数为 $$ \hat{y} = \omega^Tx $$ 此时的$\hat{y}$是连续值,因此它是一个回归模型,若是$\hat{y}$是离散值呢?机器学习
可能你已经想到了,对假设函数获得的连续值再作一次转换,即$g(\hat{y})$,而且令$g(\hat{y})$函数值在$\hat{y}$属于某个区间时为$c_1$类;$\hat{y}$属于另外一个区间时为$c_2$类,这样就能获得一个二元分类模型。函数
上一节讲到对线性回归的结果经过函数$g$作一次转换便可得逻辑回归。在逻辑回归当中函数$g$一般使用Sigmoid函数替代,即函数$g$为 $$ g(z) = {\frac{1}{1+e^{-z}}} $$学习
让步比能够理解成有利于某一特定事件的几率,能够定义为 $$ {\frac{p}{1-p}} $$ 在已知二分类问题的状况下每一个分类的几率分别为$\hat{y_i}$和$1-\hat{y_i}$,能够定义logit函数,即让步比的对数形式(log-odds)为 $$ \begin{align} \log{it}(\hat{y_i}) & = \log{\frac{p(y=1|x,\omega)}{p(y=0|x,\omega)}} \ & = \log{\frac{\hat{y_i}}{1-\hat{y_i}}} \ & = \log{\frac{{\frac{1}{1+e^{-\omega^Tx}}}}{{\frac{-\omega^Tx}{1+e^{-\omega^Tx}}}}} \ & = \omega^Tx \end{align} $$ 其中$\log{it}(p)$函数等于事件发生的几率除以不发生的几率取对数,即表示特征值和对数几率之间的线性关系。优化
然而特征值和对数几率之间的线性关系并不重要,重要的是预测值与它发生的几率的关系,即让步比的逆形式,也就是上述说到的Sigmoid函数。 $$ w^Tx = \log{\frac{p}{1-p}} \ e^{w^Tx} = {\frac{p}{1-p}} \ p = {\frac{1}{1+e^{-w^Tx}}} \ $$
# Sigmoid函数图像图例 import numpy as np import matplotlib.pyplot as plt %matplotlib inline def sigmoid(z): return 1 / (1 + np.exp(-z)) ax = plt.subplot(111) # 描绘十字线 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0)) z = np.linspace(-10, 10, 256) hat_y = sigmoid(z) plt.plot(z, hat_y, c='r', label='Sigmoid') # 描绘y=0.5和y=1.0两条直线 plt.yticks([0.0, 0.5, 1.0]) ax = plt.gca() ax.yaxis.grid(True) plt.xlabel('z') plt.ylabel('$\hat{y}$') plt.legend() plt.show()
回归_15_0.png?x-oss-process=style/watermark)
上图为Sigmoid函数图像,能够看出当$z$趋于正无穷时,$g(z)$趋于1;当$z$趋于负无穷时,$g(z)$趋于0,这个属性很是适合上述所说的分类模型。
所以能够把线性函数的假设函数当作是Sigmoid函数的自变量,即逻辑回归的假设函数为 $$ \hat{y} = {\frac{1}{1+e^{-\omega^Tx}}} $$ 虽然改变了逻辑回归的假设函数,可是Sigmoid函数的输出值是$(0,1)$范围内的连续值,并非二元分类模型想要的二元离散值,所以须要对逻辑回归的假设函数作进一步处理,即 $$ \begin{cases} \hat{y}>0.5即\omega^Tx>0, \quad y=1 \ \hat{y}<0.5即\omega^Tx<0, \quad y=0 \ \end{cases} $$ 若是$\hat{y}=0.5即\omega^Tx=0$,不在逻辑回归模型的讨论范围内,通常而言视具体状况而定。
获得了逻辑回归的假设函数,则须要经过最小化目标函数即最小化偏差找到最合适的参数$\omega$。
因为线性回归是预测连续值的模型,所以可使用均方偏差代价函数。可是逻辑回归是预测离散值的模型,所以可使用极大似然估计推导出逻辑回归的目标函数。
上一节假设逻辑回归的输出为类别$0$或类别$1$,用几率表达方式为 $$ \begin{align} & p(y=1|x,\omega)=\pi(x) \ & p(y=0|x,\omega)=1-\pi(x) \end{align} $$ 因为$y$只多是$0$或$1$,则能够把上述两个公式联立可得$y$的几率分布函数表达式 $$ p(y|x,\omega) = (\pi(x))^y(1-\pi(x))^{(1-y)} $$ 经过$y$的几率分布函数表达式便可得似然函数为 $$ L(\omega) = \prod_{i=1}^m [\pi(x_i)]^{y_i}[(1-\pi{x_i})]^{(1-y_i)} $$ 其中$m$为样本的个数。
经过似然函数获得对数似然函数即目标函数(注:该目标函数与交叉熵损失函数的形式一致,二元逻辑回归能够理解为交叉熵损失函数两个类变量的特殊形式,交叉熵详见**《熵和信息增益》**)为 $$ \begin{align} J(\omega) & = \log{L(\omega)} \ & = \sum_{i=1}^m [y_i\log\pi(x_i)+(1-y_i)\log(1-\pi(x_i))] \end{align} $$ 对$J(\omega)$求极大值,便可获得$\omega$的估计值。
通常采用梯度上升法或拟牛顿法求解$\omega$的估计值。
逻辑回归的目标函数为 $$ J(\omega) = \sum_{i=1}^m [y_i\log\pi(x_i)+(1-y_i)\log(1-\pi(x_i))] $$ 对于二分类问题,能够求出$y=1$和$y=0$的代价函数 $$ J(\omega) = \begin{cases} -\log\pi(x) \quad if y=1 \ -\log(1-\pi(x)) \quad if y=0 \ \end{cases} $$
# 不一样样本实例分类的代价图例 def cost_1(z): return -np.log(sigmoid(z)) def cost_0(z): return -np.log(1-sigmoid(z)) z = np.linspace(-10, 10, 256) pi_x = sigmoid(z) c1 = [cost_1(i) for i in z] c0 = [cost_0(i) for i in z] plt.plot(pi_x, c1, c='r', linestyle='--', label='$J(\omega), \quad if \quad y=1$') plt.plot(pi_x, c0, c='g', label='$J(\omega), \quad if \quad y=0$') plt.xlabel('$\pi(x)$') plt.ylabel('$J(\omega)$') plt.legend() plt.show()
回归_21_0.png?x-oss-process=style/watermark)
上图能够看出若是正确地预测样本属于第$1$类,代价会接近0(虚线);若是正确的预测$y=0$(实线),代价也会接近0。若是预测错误,代价则会趋近于无穷大,即用愈来愈大的代价惩罚错误的预测。
二元逻辑回归的目标函数为 $$ J(\omega) = \sum_{i=1}^m [y_i\ln\pi(x_i)+(1-y_i)\ln(1-\pi(x_i))] $$ 获得二元逻辑回归的目标函数,咱们须要最大化似然函数,即最大化二元逻辑回归的目标函数。
目标函数对$\omega$的偏导为 $$ \begin{align} {\frac{\partial{J(\omega)}}{\partial{\omega_j}}} & = \sum_{i=1}^m({\frac{y_i}{\pi(x_i)}}-{\frac{1-y_i}{1-\pi(x_i)}}){\frac{\partial{\pi(x_i)}}{\partial{\omega_j}}} \ & = \sum_{i=1}^m({\frac{y_i}{g(\omega^Tx_i)}}-{\frac{1-y_i}{1-g(\omega^Tx_i)}}){\frac{\partial{g(\omega^Tx_i)}}{\partial{\omega_j}}} \ & = \sum_{i=1}^m({\frac{y_i}{g(\omega^Tx_i)}}-{\frac{1-y_i}{1-g(\omega^Tx_i)}})g(\omega^Tx_i)(1-g(\omega^Tx_i)){\frac{\partial{\omega^Tx_i}}{\partial{\omega_j}}} \ & = \sum_{i=1}^m (y_i(1-g(\omega^Tx_i))-(1-y_i)g(\omega^Tx_i)){x_i}j \ & = \sum{i=1}^m (y_i - g(\omega^Tx_i)){x_i}_j \end{align} $$ 其中$i$为第$i$个样本,$j$为第$j$个特征。
逻辑回归参数的学习规则为 $$ \omega_j = \omega_j + \alpha{\sum_{i=1}^m (y_i - g(\omega^Tx_i)){x_i}^{(j)}} $$
线性回归的参数学习公式为 $$ \omega_j = \omega_j - \alpha{\sum_{i=1}^m (y_i - h(\omega^Tx_i)){x_i}^{(j)}} $$ 逻辑回归的参数学习公式为 $$ \omega_j = \omega_j + \alpha{\sum_{i=1}^m (y_i - g(\omega^Tx_i)){x_i}^{(j)}} $$ 从上述两个参数学习公式能够看出线性回归和逻辑回归的参数更新方式有着相同的公式,可是因为线性回归是最小化目标函数,而逻辑回归是最大化似然函数即最大化目标函数,所以线性回归是梯度降低法、逻辑回归是梯度上升法,曾经也讲过其实梯度降低法和梯度上升法能够转换。
收敛速度更快,可是若是特征维度较大计算时间漫长。
假设求得逻辑回归参数为为$\omega^T$,则二元逻辑回归模型为 $$ \begin{align} & p(y=1|x) = {\frac{e^{-\omega^T{x}}}{1+e^{-\omega^T{x}}}} \ & p(y=0|x) = {\frac{1}{1+e^{-\omega^T{x}}}} \end{align} $$
二元逻辑回归的L1正则化与普通线性回归的L1正则化相似,增长了L1范数做为惩罚,即 $$ J(\omega) = \sum_{i=1}^m [y_i(\omega{x_i} - \ln(1+exp(\omega(x_i))] + \lambda||\omega||_1 $$ 二元逻辑回归L1正则化目标函数经常使用的优化方法有坐标轴降低和最小角回归。
二元逻辑回归的L2正则化与普通线性回归的L2正则化相似,增长了L2范数做为惩罚,即 $$ J(\omega) = \sum_{i=1}^m [y_i(\omega{x_i} - \ln(1+exp(\omega(x_i))] + {\frac{1}{2}}\lambda||\omega||_2 $$
上面介绍的逻辑回归都是二元分类模型,用于二分类问题,可使用如下三种方法将其推广为多元逻辑回归。OvR和MvM主要是对数据作处理,这里不介绍其具体过程。而Softmax回归则是优化模型,所以主要讲解Softmax回归。
假设一个数据集$D$有$c_1,c_2,\ldots,c_k$共$k$个类别,则能够把$c_1$当作一个类别,把$c_2,c_3,\ldots,c_k$当作另一个类别,即把$D$分为两个子集,把多分类问题则变成了关于$c_1$和$c_2,c_3,\ldots,c_k$的二分类问题,而后对含有多个类别的子集再次使用OvR方法,直至没法分类为止。一般这种方法称为OvR(One-vs-Rest)。
假设一个数据集$D$有$c_1,c_2,\ldots,c_k$共$k$个类别,则能够先把$c_1,c_2,\ldots,c_i, \quad i<k$当作一个类别,把$c_i,c_{i+1},\ldots,c_k$当作另一个类别,即把$D$分为两个子集,多分类问题则变成了关于$c_1,c_2,\ldots,c_i$和$c_i,c_{i+1},\ldots,c_k$的二分类问题,而后对两个子集再次使用MvM方法,直至没法分类为止。一般这种方法称为MvM(Many-vs-Many)。
若是每次只选择两个个类别进行分类的话,则该方法称为OvO(One-vs-One),通常状况下首先考虑使用OvO。
详见**《Softmax回归》**
有$m$个实例$n$维特征的数据集 $$ T={(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)} $$ 其中$x_i$是实例的特征向量即$({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})$。
$\omega$和二元逻辑回归模型。
逻辑回归引入时说到逻辑回归必定程度上也是基于感知机演化而来,在替换sigmoid函数的同时,将sigmoid函数获得的值转换为几率的形式,进而能够最大化似然函数获得最优$w^*$,这也是逻辑回归的巧妙之处,可是二者仍是换汤不换药,都是基于特征的线性模型分类。
因为感知机、线性回归和逻辑回归都和线性模型有必定的关系,所以放在一块儿讲,下面将会将一个单独的算法,它从理论上而言是最简单易懂的一个算法,即k近邻算法。