http://www.cnblogs.com/ModifyRong/p/7739955.html
https://zhuanlan.zhihu.com/p/28415991
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,以sigmoid作为假设函数,运用梯度下降来求解参数,来达到将数据二分类的目的。
逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。
因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。
Sigmoid函数,也称为逻辑函数(Logistic function):
逻辑回归的假设函数形式如下:
而逻辑回归模型所做的假设是:
与之相对应的决策函数为:
选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。
决策边界(Decision Boundary):
下面两张图很清晰的解释了什么是决策边界,决策边界其实就是一个方程,在逻辑回归中,决策边界由 定义。
在逻辑回归中,假设函数 用于计算样本属于某类别的可能性;
决策函数 用于计算(给出)样本的类别;
决策边界 是一个方程,用于标识出分类函数(模型)的分类边界。
代价函数(Cost Function)
-
上面的方程等价于:
从图中可以看出, ,当预测值 时,可以看出代价 的值为0,这正是我们希望的。如果预测值 即 ,意思是预测 的概率为0,但是事实上 ,因此代价函数 相当于给学习算法一个惩罚。
or
http://www.cnblogs.com/ModifyRong/p/7739955.html
####问题1:为何选择sigmoid
https://blog.csdn.net/u011467621/article/details/48197943
Exponential model 的形式是这样的:
假设第i个特征对第k类的贡献是,则数据点属于第k类的概率正比于。(省略bias)
因为一个数据点属于各类的概率之和为1,所以可以得到
现在回到两类(0、1)的情况,此时分母上只有两项:
分子、分母同除以分子,并设,则有
说到底源于sigmoid,或者说exponential family所具有的最佳性质,即maximum entropy的性质。
or
sigmoid函数:符合我们需要用一个函数把<w,x>从实数空间映射到条件概率p(y=1|x,w),并且希望<w,x>越大,p(y=1|x,w)越大;<w,x>越小,p(y=1|x,w)越小(等同于p(y=0|x,w)越大)。首先,它的值域是(0,1),满足概率的要求;其次,它是一个单调上升函数
maximum entropy给了logistic regression一个很好的数学解释。
现在关心的是,给定某些假设之后,熵最大的分布。也就是说这个分布应该在满足我假设的前提下越均匀越好。比如大家熟知的正态分布,正是假设已知mean和variance后熵最大的分布。而我们可以通过最大熵原则推出的这个 f,就是sigmoid。
####问题2:逻辑回归的损失函数为什么要使用极大似然函数作为损失函数?
- 损失函数一般有四种,平方损失函数,对数损失函数,HingeLoss0-1损失函数,绝对值损失函数。将极大似然函数取对数以后等同于对数损失函数。至于原因大家可以求出这个式子的梯度更新 这个式子的更新速度只和xijxji,yiyi相关。和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。
- 为什么不选平方损失函数的呢?其一是因为如果你使用平方损失函数,你会发现梯度更新的速度和sigmod函数本身的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。
###问题3:训练过程特征重复或高度相关
- 逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响?
- 先说结论,如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
- 但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一。
- 如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
- 为什么我们还是会在训练的过程当中将高度相关的特征去掉?
- 去掉高度相关的特征会让模型的可解释性更好
- 可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间
###问题4:逻辑回归的优缺点总结
- 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
- 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
- 资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
- 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
但是逻辑回归本身也有许多的缺点:
- 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
- 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
- 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题
- 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
- 逻辑回归对极值敏感。
-
独立的变量不能有共线性、容易欠拟合、需大量样本。
###参数初始化对其的影响
###代码实现
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def grad_ascent(dataMatIn, classLabels):
dataMatrix = np.mat(dataMatIn) #(m,n)
labelMat = np.mat(classLabels).transpose()
m, n = np.shape(dataMatrix)
weights = np.ones((n, 1)) #初始化回归系数(n, 1)
alpha = 0.001 #步长
maxCycle = 500 #最大循环次数
for i in range(maxCycle):
h = sigmoid(dataMatrix * weights) #sigmoid 函数
error = labelMat - h #y-h, (m - 1)
weights = weights + alpha * dataMatrix.transpose() * error
return weights
# 随机梯度上升法的思想是,每次只使用一个数据样本点来更新回归系数。这样就大大减小计算开销
def stoc_grad_ascent_one(dataMatIn, classLabels, numIter=150):
m, n = np.shape(dataMatIn)
weights = np.ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4 / (1 + i + j) + 0.01 #保证多次迭代后新数据仍然有影响力
randIndex = int(np.random.uniform(0, len(dataIndex)))
h = sigmoid(sum(dataMatIn[i] * weights)) # 数值计算
error = classLabels[i] - h
weights = weights + alpha * error * dataMatIn[i]
del(dataIndex[randIndex])
return weights
最后附一个线性回归
https://www.cnblogs.com/PowerTransfer/p/8503283.html