逻辑回归常用于分类问题,最简单诸如二分类问题:是否是垃圾邮件?比赛是赢是输?
对于线性回归问题, z = w0*x0+w1*x1+w2*x2+...
一般的通过最小二乘法学习参数w来预测 给定一个x值时z的大小,其值域在(-∞,+∞),而对于分类问题,显然预测值是离散的,通过引入S函数先将值域y缩小到(0,1),这样子,
当y>=0.5, 可分为正例
当y<0.5,可分为负例。这样预测问题就转化为分类问题了。
那么预测函数就写成
其中Z=ω.T x , ω是参数列向量,x是样本向量
那么样本xj为 正例的概率可以表示成
import numpy as np def predict(x,w): return 1.0/1.0+np.e**(-x.dot(w)))
如果每个样本都分类正确,概率都为1,这当然是我们所最希望的,极大似然估计就是这样一个想法:假设样本间独立,找出一组参数使得当前样本出现的可能性最大,即将每个样本的概率相乘,使得概率最大。基于这个想法,我们就通过求极大似然函数的最大值来求解参数w
很明显,上面这个表达式不适合优化方法的求解,我们给他加一个对数,可以知道并不会改变极大值性质,这是由于对数函数的凸性。 那么就有对数似然函数
我们可以取对偶问题,求损失函数最小值
采用梯度下降法,对其求导
这样子就得到w的更新公式: (g即为h)
α是步长,也称为学习速率,α旁边的因子就是由损失函数计算出来梯度值。
def iter_w(x, y, a, w):
prediction = predict(x,w) g = (prediction - y) * x w = w+ a * g * (1.0 / y.size) return w
迭代,max_epochs表示迭代数
while counter < max_epochs: counter += 1 for i in range(len(Y)): w = update(X[i,:], Y[i], a, w)
在实际学习中需要测试 不同的步长对学习结果的影响,进而选取比较合适的步长
from sklearn.cross_validation import KFold