逻辑斯蒂回归模型与最大熵模型

逻辑斯蒂回归(logistic regression)是统计学习中的经典分类方法。逻辑斯蒂回归模型属于对数线性模型

6.1 逻辑斯蒂回归模型

6.1.1 逻辑斯蒂分布

定义6.1(逻辑斯蒂回归) 设X是连续随机变量,X服从逻辑斯蒂分布是指X具有下列分布函数和密度函数:

式中,为位置参数,为形状参数。

逻辑斯蒂分布的密度函数f(x)和分布函数F(x)的图形如下所示:

ch06-1

分布函数F(x)属于逻辑斯蒂函数,其图形是一条S形曲线(sigmoid curve)。该曲线以点 为中心对称,即满足:

曲线在中心附近增长速度较快,在两端增长速度较慢。形状参数的值越小,曲线在中心附近增长的越快

6.1.2 二项逻辑斯蒂回归模型

二项逻辑斯蒂回归模型是一种分类模型由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯蒂分布。随机变量X取值为实数,随机变量Y取值为1或0。我们通过监督学习的方法来估计模型参数。

定义6.2(逻辑斯蒂回归模型) 二项逻辑斯蒂回归模型是如下的条件概率分布:

这里,是输入, 是输出,均为参数,w称为权重向量,b称为偏置,w.x表示w和x的内积。

如何使用上述条件概率分布进行分类?

对于给定的输入实例x,按照式(6.3)和式(6.4)可以求得P(Y=1|x)和P(Y=0|x)。逻辑斯蒂回归比较两个条件概率值的大小,将实例x分到概率值较大的那一类。

逻辑斯蒂回归模型的特点

为了方便,令。这时,逻辑斯蒂回归模型如下:

事件几率(odds)是指该事件发生的概率与改时间不发生的概率的比值。

如果事件发生的概率是p,那么该事件的几率是,该事件的对数几率或logit函数是:

对逻辑斯蒂回归而言,由式(6.5)和式(6.6)得:

也就是说,在逻辑斯蒂回归模型中,输出Y=1的对数几率是输入x的线性函数。

换个角度来看,logit函数的值域是实数域,通过逻辑斯蒂回归模型可以把logit函数的实数域映射为[0,1],相当于概率。

6.1.3 模型参数估计

给定训练数据集,其中,

设:

似然函数为:

对数似然函数为:

求极大值,得到w的估计值。

问题就变成了以对数似然函数为目标函数的最优化问题。

6.1.4 多项逻辑斯蒂回归

将二项逻辑斯蒂回归推广到多项逻辑斯蒂回归,用于多分类。

假设离散型随机变量Y的取值集合是{1,2,…,K},那么多项逻辑斯蒂回归模型是:

这里,

6.1.5 梯度下降法

根据6.1.3中得到的对数似然函数,我们可以通过梯度下降法进行求解。

目标函数:

最大化对数似然函数等价于最小化目标函数。

假设样本,n为样本特征维数,,表示权重向量与偏置。现在对权重向量w中的每一个维度进行求偏导数,可得:

那么,权重的更新规则为:

由于,因此权重的更新规则应为:

特别需要指出:

此处,为偏置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class LogisticRegression(object):
'''
基于梯度下降学习LR模型
'''
def __init__(self, eta=0.01, n_iter=10):
self.eta = eta
self.n_iter = n_iter

def fit(self,X,y):
self.w_ = np.zeros(1+X.shape[1])
self.cost_ = []
m = X.shape[0]

for _ in range(self.n_iter):
output = self.predict_proba(X)
errors = (-y+output)
update = (self.eta/m)*X.T.dot(errors)
self.w_[1:] += update
self.w_[0] += (self.eta/m)*errors.sum()
cost = (errors**2).sum()/(2.0*m)
self.cost_.append(cost)

return self

def net_input(self, X):
return np.dot(X,self.w_[1:])+self.w_[0]

def predict_proba(self,X):
return self.sigmoid(self.net_input(X))

def predict(self, X):
return np.where(self.predict_proba(X)>0.5,1,0)

def sigmoid(self, z):
return 1/(1+np.exp(z))

6.1.6 目标函数正则化

为了防止模型过拟合,引入正则化项,目标函数变为:

相应的权重的更新规则也应该改变:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class LogisticRegression(object):
'''
基于梯度下降学习LR模型
TODO:应该设置阈值,设定early stop功能
'''
def __init__(self, eta=0.01, n_iter=10, gamma=0):
'''
eta:为学习速率
n_iter:为迭代次数
gamma:为正则化系数,默认为0,即没有正则化项。
'''
self.eta = eta
self.n_iter = n_iter

def fit(self,X,y):
self.w_ = np.zeros(1+X.shape[1])
self.cost_ = []
m = X.shape[0]

for _ in range(self.n_iter):
output = self.predict_proba(X)
errors = (-y+output)
update = (self.eta/m)*X.T.dot(errors)
self.w_[1:] = (1-self.eta*self.gamma)*self.w_[1:] #正则化
self.w_[1:] += update
self.w_[0] += (self.eta/m)*errors.sum()
cost = (errors**2).sum()/(2.0*m)
self.cost_.append(cost)

return self

def net_input(self, X):
return np.dot(X,self.w_[1:])+self.w_[0]

def predict_proba(self,X):
return self.sigmoid(self.net_input(X))

def predict(self, X):
return np.where(self.predict_proba(X)>0.5,1,0)

def sigmoid(self, z):
return 1/(1+np.exp(z))

6.2 softmax regression

softmax回归是logistic回归的推广,它属于多分类模型。仿照logistic的假设函数,softmax的假设函数可表示为:

注意你可以看到,此处与6.1.4中的多项逻辑斯蒂回归有所区别,这是因为6.1.4中,我们把最后一类的logit值设置为1,因此没有对应exp表达式。而此处的最后一类对应的logit值为

6.2.1 目标函数

通过对数似然来得到代价函数,并通过最大化对数似然函数来求解参数。对数似然函数如下:

这里的是一个矩阵。需要逐个求出,i=1,2,…,k。利用logistic二分类的思想,在求的时候把它视为正样本的参数,其他的为常量,即负样本的参数。