第6章 逻辑斯蒂回归和最大熵模型
逻辑斯谛回归(LR)是经典的分类方法
1.逻辑斯谛回归模型是由以下条件概率分布表示的分类模型。逻辑斯谛回归模型可以用于二类或多类分类。
这里,x 为输入特征,w 为特征的权值。
逻辑斯谛回归模型源自逻辑斯谛分布,其分布函数F ( x )是S 形函数。逻辑斯谛回归模型是由输入的线性函数表示的输出的对数几率模型。
2.最大熵模型是由以下条件概率分布表示的分类模型。最大熵模型也可以用于二类或多类分类。
其中,Z w ( x ) 是规范化因子,f i为特征函数,w i为特征的权值。
3.最大熵模型可以由最大熵原理推导得出。最大熵原理是概率模型学习或估计的一个准则。最大熵原理认为在所有可能的概率模型(分布)的集合中,熵最大的模型是最好的模型。
最大熵原理应用到分类模型的学习中,有以下约束最优化问题:
求解此最优化问题的对偶问题得到最大熵模型。
4.逻辑斯谛回归模型与最大熵模型都属于对数线性模型。
5.逻辑斯谛回归模型及最大熵模型学习一般采用极大似然估计,或正则化的极大似然估计。逻辑斯谛回归模型及最大熵模型学习可以形式化为无约束最优化问题。求解该最优化问题的算法有改进的迭代尺度法、梯度下降法、拟牛顿法。
逻辑斯蒂回归(logistic regression)是统计学习中的经典分类方法。最大熵是概率模型学习的一个准则,推广到分类问题得到最大熵模型(maxium entropy model)
都属于对数线性模型
逻辑斯蒂模型
- 二项逻辑斯谛回归模型是一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯谛分布。
- 分类问题,可以表示成one-hot的形式,而one-hot可以认为是一种确定概率的表达。而最大熵模型,是一种不确定的概率表达,其中这个概率,是一个条件概率,是构建的特征函数生成的概率
逻辑斯谛分布
X是连续随机变量,X服从逻辑斯谛分布,具有以下分布函数和密度函数
关于逻辑斯谛, 更常见的一种表达是Logistic function
- 这个函数把实数域映射到(0, 1)区间,这个范围正好是概率的范围, 而且可导,对于0输入, 得到的是0.5,可以用来表示等可能性。
二项逻辑斯谛回归模型
项逻辑斯谛回归模型是如下的条件概率分布:(这里的w 是对扩充的权值向量,包含参数b)
一个事件的几率(odds)是指改时间发生的概率与该事件不发生的概率的比值。对于逻辑斯蒂回归而言,可得
- 当线性函数值越接近正无穷,概率值就越接近1;线性函数值越接近负无穷,概率值就越接近0。
模型参数估计
应用极大似然估计法估计模型参数,从而得到回归模型,具体步骤为求对数似然函数,并对L ( w ))求极大值,得到w 的估计值
上述过程将P ( Y = 1 ∣ x ) = π ( x ) 代入L ( w ) L(w)L(w)中,从而对L ( w )求极大值,得到w 的估计值,这样问题就变成了以对数似然函数为目标函数的最优化问题。通常采用的方法是梯度下降法以及拟牛顿法。
多项逻辑斯谛回归
假设离散型随机变量Y 的取值集合是1 , 2 , … , K 多项逻辑斯谛回归模型是
- 上述两式和为1
- 二项逻辑斯蒂回归的参数估计法也可以推广到多项逻辑斯蒂回归
练习
回归模型:
其中w x wxwx线性函数:w x = w 0 ⋅ x 0 + w 1 ⋅ x 1 + w 2 ⋅ x 2 + . . . + w n ⋅ x n , ( x 0=1)
我们用逻辑斯蒂回归模型来进行分类问题的求解
class LogisticReressionClassifier:
def init(self, max_iter=200, learning_rate=0.01):
self.max_iter = max_iter
self.learning_rate = learning_rate
def sigmoid(self, x): return 1 / (1 + exp(-x)) def data_matrix(self, X): data_mat = [] for d in X: data_mat.append([1.0, *d]) return data_mat def fit(self, X, y): # label = np.mat(y) data_mat = self.data_matrix(X) # m*n self.weights = np.zeros((len(data_mat[0]), 1), dtype=np.float32) for iter_ in range(self.max_iter): for i in range(len(X)): result = self.sigmoid(np.dot(data_mat[i], self.weights)) error = y[i] - result self.weights += self.learning_rate * error * np.transpose( [data_mat[i]]) print('LogisticRegression Model(learning_rate={},max_iter={})'.format( self.learning_rate, self.max_iter)) # def f(self, x): # return -(self.weights[0] + self.weights[1] * x) / self.weights[2] def score(self, X_test, y_test): right = 0 X_test = self.data_matrix(X_test) for x, y in zip(X_test, y_test): result = np.dot(x, self.weights) if (result > 0 and y == 1) or (result < 0 and y == 0): right += 1 return right / len(X_test)
lr_clf = LogisticReressionClassifier() lr_clf.fit(X_train, y_train) x_ponits = np.arange(4, 8) y_ = -(lr_clf.weights[1]*x_ponits + lr_clf.weights[0])/lr_clf.weights[2] plt.plot(x_ponits, y_) #lr_clf.show_graph() plt.scatter(X[:50,0],X[:50,1], label='0') plt.scatter(X[50:,0],X[50:,1], label='1') plt.legend()
sklearn 实例
当然,我们也可以直接用sklearn来帮我们快速构建逻辑斯蒂回归模型
sklearn.linear_model.LogisticRegression
solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:
a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
from sklearn.linear_model import LogisticRegression clf = LogisticRegression(max_iter=200) clf.score(X_test, y_test) x_ponits = np.arange(4, 8) y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1] plt.plot(x_ponits, y_) plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0') plt.plot(X[50:, 0], X[50:, 1], 'bo', color='orange', label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend()