python实现逻辑回归

逻辑回归常用于分类问题,最简单诸如二分类问题:是否是垃圾邮件?比赛是赢是输?

对于线性回归问题, 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

 

posted on 2016-07-07 17:32  who_a  阅读(4645)  评论(0编辑  收藏  举报

导航