zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Solr 规格严格
    createsimplepojoclassesbytecodeatruntimedynamically 规格严格
    Mongo 规格严格
    Java Classpath 规格严格
    ClassLoader 规格严格
    Lucene 规格严格
    封包和拆包
    NetBeans 时事通讯(刊号 # 25 Sep 11, 2008)
    安全注释和授权在 GlassFish 和 Java EE 5 SDK 中的应用
    Building Enterprise Applications for GlassFish using Netbeans IDE and Maven2
  • 原文地址:https://www.cnblogs.com/who-a/p/5650959.html
Copyright © 2011-2022 走看看