Python机器学习:逻辑回归和最大熵模型

1、线性回归:一种最基本的回归分析方法,有着广泛的应用,线性回归研究的是自变量和应变量之间的线性关系,对于特征x=\left ( x^1,x^2,.....,x^n \right )以及其对应的标签y,线性回归假设二者之间存在如下关系:

y\approx f(x)=x\left ( \omega_1 x^1+\omega_2 x^2+\omega_3 x^3+\cdot \cdot \cdot \cdot +\omega_n x^n\right )=\sum_{i=1}^{n}\omega_ix^i+b=\omega^Tx+b

omega和b分别表示待学习的权重和偏置,直观上,权重omega的各个分量反应了每个特征变量的重要程度,权重越大,对应的随机变量的重要程度越大,反之越小,线性回归的目标是求解权重向量omega和偏置值b,使得f(x)尽可能的接近y,最基本的方法是最小二乘法,最小二乘法是一种不带条件的最优化问题,其目标是让整个样本集合上的预测值和真实值之间的欧式距离之和最小。

首先,我们来看一看一元线性回归

y\approx f\left ( x \right )=\omega x+b

其实这个我之前有两篇利用实现教科书上线性回归的博文,一个用的是c++的eigen包,有些慢,另一个用的是python,用numpy来解决的,今天再简单写一下,完整的推导在eigen那篇文章里面:

图1:一元线性回归推导

 然后,我在这里把我的那两篇博客链接挂上,里面的代码是可以直接用的,eigen包的话,VS的nuget可以下载,include就行,或者你可以直接去Eigen官网上去下载,然后在VS的附加包里面给添加上就好,numpy的话,直接pip install numpy,这个我的关于numpy的博客:Python科学计算:numpy系列里面都有的,

(5条消息) numpy的一次小尝试:一元线性回归分析_鲁智深坐捻绣花针的博客-CSDN博客(5条消息) 利用Eigen完成一元线性回归_鲁智深坐捻绣花针的博客-CSDN博客

2、多元线性回归:

      同样的,可以把b看成是权重,这样就有了:

\left\{\begin{matrix} & \omega=(\omega_1,\omega_2,.....,\omega_n,b)) & \\ & x=(x^1,x^2,.....,x^n,1))& \end{matrix}\right.

  这个时候,等式就能够表示成   

  y \approx f(x)=\omega^Tx     

这个时候,我们给定空间中的一组样本点:D=\left \{ (x_1,y_1),(x_2,y_2),....(x_n,y_n) \right \}  ,优化目标就是:

minJ(\omega)=min(Y-X\omega)^T(Y-X\omega)   

其中,X是样本矩阵的增广矩阵:

                                        

X=\begin{bmatrix} x_{1}^{1}& x_{1}^{2} & x_{1}^{3} & \cdots & x_{1}^{m} & 1& \\ x_{2}^{1}& x_{2}^{2} & x_{2}^{3} & \cdots & x_{2}^{m} & 1 &\\ x_{3}^{1}& x_{3}^{2} & x_{3}^{3} & \cdots & x_{3}^{m} &1& \\ \vdots & \vdots& \vdots& \ddots & \vdots & \vdots&\\ x_{m}^{1}& x_{m}^{2} & x_{m}^{3} & \cdots & x_{m}^{m} & 1&\\ \end{bmatrix}

  Y对应的标签向量是:

 Y=(y_1,y_2,\cdots,y_n)^T             

求解就得:

\omega=(X^TX)^{-1}X^TY

可以看到:只要是\left | X^TX \right |\neq 0,也就是说,  X^TX可逆,那么线性回归模型存在唯一解,样本集合中的样本太少或者是存在大量线性相关的维度,就可能会出现多个解的情况,所以,可以在原始线性回归模型的基础上增加正则化项目来降低模型的复杂度,使得模型变简单,优化目标就可以写作:

minJ(\omega)=min(Y-X\omega)^T(Y-X\omega)+\lambda||\omega||_2

这时,线性回归又被称为岭回归,求解:

\omega=(X^TX+\lambda I)^{-1}X^TY

其中,\lambda I是一个扰动想,这下,我们就能够降低模型的复杂度,防止过拟合,而且能够使上式中(X^TX+\lambda I)可逆,\omega有唯一解。如果我们采用的是L1正则化,线性回归模型又被称为Lasso(Least Absolute Shrinkage and Selection Operator)回归,这时,优化目标又可以写作:

minJ(\omega)=min(Y-X\omega)^T(Y-X\omega)+\lambda||\omega||_1

L1正则化能够得到比L2正则化更加稀疏的解,即\omega会有存在多个0元素,从而起到特征选择的作用,如果使用的是L1范数,则J(\omega)是不能连续求导的,因为L1范数使用绝对值表示,这时,就不能再用最小二乘法来进行求解,可以只用近端梯度下降进行求解(PGD)。线性模型通常是其他模型的基本组成单元,堆叠成为若干个线性模型,同时引入非线性化激活函数,就可以实现对任意数据的建模。

二、广义线性回归:

如果,y和x并非简单的直接呈线性关系,那么我们在使用线性回归模型的时候就会有很大的误差举个例子:

y=x^2+2x+1

我们取x_0=0,用泰勒展开的前三项进行拟合:

f(x)=f(x_0)+f^{'}(x_0)(x-x_0)+f^{''}(x_0)(x-x_0)^2

f(x)=1+2x+2x^2

来看看误差怎么样:

import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,5,100)
y=np.square(x)+2*x+1
y_approx=2*np.square(x)+2*x+1
err=y_approx-y
fig=plt.figure()
ax=fig.add_subplot(1,2,1)
ax.plot(x,y,"b",label="y=x^2+2x+1")
ax.plot(x,y_approx,'g',label="1+2x+2x^2")
ax.legend(loc="best")
ax2=fig.add_subplot(1,2,2)
ax2.plot(x,err,"r-",label="error")
ax2.legend(loc="best")
plt.show()

 来看看误差:

图2:拟合效果和误差

 好家伙,拟合的,根没拟合一样,只有最开始那一点拟合的还行。

那么怎么解决呢,人们想到的最简朴的办法就是,寻找一个函数g(y)使得g(y)和x是线性关系,这个样子我们就可以进行线性回归,这样的回归叫做广义回归,实际场景中,就是这个函数关系G最难选择,其他的到都不怎么难。

1、逻辑回归:

通过回归对数几率的方式将线性回归应用于分类任务,对于一个二分类问题,令Y\in \left \{ 0,1 \right \}表示样本x对应的类别变量,设x属于类别一的概率是P(Y=1 |x )=p那么自然就有其对立面:P(Y=0|x)=1-p,比值\frac{p}{1-p}称作几率,几率的对数即为对数几率:

\ln \frac{p}{1-p}

逻辑回归通过回归上式来间接的得到p的值,即:

\ln \frac{p}{1-p}=\omega^Tx+b

解得:

p=\frac{1}{1+e^{-(\omega^Tx+b)}}

我们令\left\{\begin{matrix} & \omega=(\omega_1,\omega_2,.....,\omega_n,b)) & \\ & x=(x^1,x^2,.....,x^n,1))& \end{matrix}\right.,就有

p=\frac{1}{1+e^{-(\omega^Tx)}}

因为样本集合给定的样本属于概率非0即1的那种,所以就没法子用最小二乘法来求解,但是,可以用极大似然估计来求解:

L(\omega)=\prod_{i=1}^{m}p^{y_i}(1-p)^{1-y_i}

 他的对数似然函数就是:

L(\omega)=\sum_{i=1}^{m}(y_i\ln p+(1-y_i)\ln (1-p))=\sum_{i=1}^{m}(y_i\omega^Tx_i-\ln(1+e^{\omega^T x_i}))

然后,就可以用经典启发式最优化算法梯度下降法来求解上式。

同时,二分类也可以扩展到多分类问题:

\omega=\omega_1-\omega_0,代入p=\frac{1}{1+e^{-(\omega^Tx)}}则会得到:

\left\{\begin{matrix} P(Y=1|X)=p=\frac{1}{1+e^{-(\omega ^Tx)}}=\frac{e^{\omega_1 ^Tx}}{e^{\omega_0 ^Tx}+e^{\omega_1 ^Tx}}& \\ P(Y=1|X)=1-p=\frac{e^{\omega_0 ^Tx}}{e^{\omega_0 ^Tx}+e^{\omega_1 ^Tx}} & \end{matrix}\right.

如果说类别数目是K的话,有

P(Y=i|x)=\frac{e^{\omega_i^Tx}}{\sum_{k=0}^{K-1}e^{\omega_k^T x}},i=0,1,2\cdots,K-1

最后,得到的是

P(Y=i|x)=\frac{e^{(\omega_i^T-\omega_0^T)x}}{\sum_{k=1}^{K-1}1+e^{(\omega_k^T-\omega_0^T) x}},i=0,1,2\cdots,K-1

然后将上式用极大似然估计的方式转换成对数似然函数,通过梯度下降法求解就好。

交叉熵损失函数:

这时神经网络中常用的一种损失函数,K分类问题中,假设样本x_i属于每个类别的真实概率为p_i=\left \{ p_i^0, p_i^1,\cdots, p_i^K-1 \right \},其中只有样本所属的类被的位置值为1,其余位置都是0,假设分类模型的参数为\omega,其预测的样本x_i属于每个类别的概率q= \left \{q_i^0, q_i^1, \cdots,q_i^{K-1}\right \}满足:

q_i的和为1,样本x_i的交叉熵损失定义为:

J_i \left (\omega \right )=-\sum_{k=0}^{K-1}p_i^k \ln q_i^k

对所有样本有:

J_i \left (\omega \right )=\sum_{i=1}^{m}J_i(\omega)=-\sum_{i=1}^{m}\sum_{k=0}^{K-1}p_i^k \ln q_i^k

 K=2时,就是逻辑回归的第一个,所以,交叉熵损失函数和通过极大似然函数导出的对数似然函数相类似,可以通过梯度下降方法来求解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值