逻辑斯蒂回归是统计学习重的经典分类方法。最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型。逻辑斯蒂回归模型与最大熵模型都属于对数线性模型。
定义:设X是连续随机变量,X服从逻辑斯蒂分布是指X具有下列分布函数和密度函数:
式中,为位置参数,为形状参数。
所谓的位置参数就是在x轴上的偏移量,形状参数就是图形的形状啦。
其中,曲线在中心附近增长速度较快,在两端增长速度较慢,形状参数的值越小,曲线在中心符进增长得越快。
二项逻辑斯蒂回归模型是一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯蒂分布。这里,随机变量X取值为实数,随机变量Y取值为1或0.我们通过监督学习的方法来估计模型参数。这里需要注意一件事情,虽然模型带有回归模型的字眼,但完全是一个分类模型,只是模型的中间值是一个连续值而已,比如神经网路中的中间值,甚至是模型的输出都是一个连续值,需要通过其他函数操作来转换成离散值,以让模型变成一个分类模型,那么,很明显,这些模型也可以作为回归模型来使用。
定义:二项逻辑斯蒂回归模型是如下的条件概率分布:
现在考察逻辑斯蒂回归模型的特点。一个事件的几率是指该事件发生的概率与该时间不发生的概率的比值。如果事件发生的概率是p,那么该事件的几率是,该事件的对数几率或logit函数是
对逻辑斯蒂回归而言,由式(6.5)与式(6.6)得
这就是说,在逻辑斯蒂回归模型中,输出Y=1的对数几率是输入x的线性函数。
这个地方很重要,就是先确定模型目标,然后根据目标列出最大似然函数,接着求最大似然函数的极大值就可以了。具体的公式不列举
多分类基本就是多次二分类,可以不讲。(没错,我就是这么嚣张的)
最大熵原理是概率模型学习的一个准则。最大熵原理认为,学习概率模型时,在所有可能的概率模型中,熵最大的模型是最好的模型。通常用约束条件来确定概率模型的集合,所以,最大熵原理也可以表述为在满足约束条件的模型集合中选取熵最大的模型。(这里我的理解是,熵最大的模型,最公平,还是有点说不明白的感觉)
假设离散随机变量X的概率分布是P(X),则其熵是
熵满足下列不等式:
直观地,最大熵原理认为要选择的概率模型首先必须满足已有的事实(难道哪个方法不是这样的吗?),即约束条件(也就是目标)。在没有更多信息的情况下,那些不确定的部分都是“等可能的”。最大熵原理通过熵的最大化来表示等可能性。“等可能”不容易操作,而熵则是一个可优化的数值指标。
定义:假设满足所有约束条件的模型结合为
定义在条件概率分布P(Y|X)上的条件熵为
则模型集合C这种条件熵H(P)最大的模型称为最大熵模型。式中的对数为自然对数。
数学功底有限,计划在第二次学习的时候再深入学习。
同上。
同上。
不过这里我梯度下降还是会用的。
具体的代码请看文末的链接。
这里的迭代更新步骤与之前的感知机迭代更新算法基本相同。
由于需要跟sigmoid的结果关联起来,所以再最后更新的时候,加入sigmoid的结果。
yi - result 表示sigmoid结果与yi的差距,如果差值为正,则说明,当前样例应被分类为正;如果差值为负,则说明当前样例应被分类为负;一上两种情况都说明模型的正确性不足,以差值乘上样例特征向量来调整权重向量。至于为什么可以写成这种形式,当然是一堆字数学推导式推过来的啦,可以直接参考感知机部分的推导。
class LogisticRegressionClassifier:
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):
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 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)
1. 《统计机器学习》 -- 李航
2. lihang-code--书中代码实现