码迷,mamicode.com
首页 > 其他好文 > 详细

SGD实现逻辑回归

时间:2016-07-07 19:16:56      阅读:921      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

平方损失函数

技术分享

def cost(x, y, w):
    m = y.size
    prediction = predict(x,w)
    error = prediction - y
    co = (1.0/(2.0*m)) * error.T.dot(error)  
    return co

 现在的问题是如何求出w , 再回头看看也没发现可以求出w的表达式,这时候我们想如果损失函数越小,那么我们的预测结果就会越好,而损失函数是个凸函数,凸函数有全局最优解,这样子就比较好办了,可以考虑SGD方法,通过迭代更新w来逐渐求得最小值。

技术分享

α是步长,也称为学习速率,α旁边的因子就是由损失函数计算出来梯度值。

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

 

SGD实现逻辑回归

标签:

原文地址:http://www.cnblogs.com/who-a/p/5650959.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!