logistic回归

回归就是对已知公式的未知参数进行估计。比如已知公式是y=a∗x+by=a∗x+b,未知参数是a和b,利用多真实的(x,y)训练数据对a和b的取值去自动估计。估计的方法是在给定训练样本点和已知的公式后,对于一个或多个未知参数,机器会自动枚举参数的所有可能取值,直到找到那个最符合样本点分布的参数(或参数组合)。

logistic分布

设X是连续随机变量,X服从logistic分布是指X具有下列分布函数和密度函数:

F(x)=P(x≤x)=11+e−(x−μ)/γ f(x)=F′(x)=e−(x−μ)/γγ(1+e−(x−μ)/γ)2F(x)=P(x≤x)=11+e−(x−μ)/γ f(x)=F′(x)=e−(x−μ)/γγ(1+e−(x−μ)/γ)2

其中,μμ为位置参数,γγ为形状参数。

f(x)f(x)与F(x)F(x)图像如下,其中分布函数是以(μ,12)(μ,12)为中心对阵,γγ越小曲线变化越快。

logistic回归模型

二项logistic回归模型如下:

P(Y=1|x)=exp(w⋅x+b)1+exp(w⋅x+b) P(Y=0|x)=11+exp(w⋅x+b)P(Y=1|x)=exp(w⋅x+b)1+exp(w⋅x+b) P(Y=0|x)=11+exp(w⋅x+b)

其中,x∈Rnx∈Rn是输入,Y∈{0,1}Y∈{0,1}是输出,w称为权值向量,b称为偏置,w⋅xw⋅x为w和x的内积。

参数估计

假设:

P(Y=1|x)=π(x),P(Y=0|x)=1−π(x)P(Y=1|x)=π(x),P(Y=0|x)=1−π(x)

则似然函数为:

∏_i=1N[π(x_i)]y_i[1−π(x_i)]1−y_i∏_i=1N[π(x_i)]y_i[1−π(x_i)]1−y_i

求对数似然函数:

L(w)=∑_i=1N[y_ilogπ(x_i)+(1−y_i)log(1−π(x_i))] =∑_i=1N[y_ilogπ(x_i)1−π(x_i)+log(1−π(x_i))]L(w)=∑_i=1N[y_ilog⁡π(x_i)+(1−y_i)log⁡(1−π(x_i))] =∑_i=1N[y_ilog⁡π(x_i)1−π(x_i)+log⁡(1−π(x_i))]

从而对L(w)L(w)求极大值,得到ww的估计值。

求极值的方法可以是梯度下降法,梯度上升法等。

梯度上升确定回归系数

logistic回归的sigmoid函数:

σ(z)=11+e−zσ(z)=11+e−z

假设logstic的函数为:

y=w_0+w_1x_1+w_2x_2+...+w_nx_ny=w_0+w_1x_1+w_2x_2+...+w_nx_n

可简写为:

y=w_0+wTxy=w_0+wTx

梯度上升算法是按照上升最快的方向不断移动,每次都增加α∇_wf(w)α∇_wf(w),

w=w+α∇_wf(w)w=w+α∇_wf(w)

其中,∇_wf(w)∇_wf(w)为函数导数,αα为增长的步长。

训练算法

本算法的主要思想根据logistic回归的sigmoid函数来将函数值映射到有限的空间内,sigmoid函数的取值范围是0~1,从而可以把数据按照0和1分为两类。在算法中,首先要初始化所有的w权值为1,每次计算一次误差并根据误差调整w权值的大小。

  • 每个回归系数都初始化为1
  • 重复N次
    • 计算整个数据集合的梯度
    • 使用α⋅∇f(x)α⋅∇f(x)来更新w向量
    • 返回回归系数

#!/usr/bin/env python
# encoding:utf-8

import math
import numpy
import time
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1.0 / (1 + numpy.exp(-x))

def loadData():
    dataMat = []
    laberMat = []
    with open("test.txt", 'r') as f:
        for line in f.readlines():
            arry = line.strip().split()
            dataMat.append([1.0, float(arry[0]), float(arry[1])])
            laberMat.append(float(arry[2]))
    return numpy.mat(dataMat), numpy.mat(laberMat).transpose()

def gradAscent(dataMat, laberMat, alpha=0.001, maxCycle=500):
    """general gradscent"""
    start_time = time.time()
    m, n = numpy.shape(dataMat)
    weights = numpy.ones((n, 1))
    for i in range(maxCycle):
        h = sigmoid(dataMat * weights)
        error = laberMat - h
        weights += alpha * dataMat.transpose() * error
    duration = time.time() - start_time
    print "duration of time:", duration
    return weights

def stocGradAscent(dataMat, laberMat, alpha=0.01):
    start_time = time.time()
    m, n = numpy.shape(dataMat)
    weights = numpy.ones((n, 1))
    for i in range(m):
        h = sigmoid(dataMat[i] * weights)
        error = laberMat[i] - h
        weights += alpha * dataMat[i].transpose() * error
    duration = time.time() - start_time
    print "duration of time:", duration
    return weights

def betterStocGradAscent(dataMat, laberMat, alpha=0.01, numIter=150):
    """better one, use a dynamic alpha"""
    start_time = time.time()
    m, n = numpy.shape(dataMat)
    weights = numpy.ones((n, 1))
    for j in range(numIter):
        for i in range(m):
            alpha = 4 / (1 + j + i) + 0.01
            h = sigmoid(dataMat[i] * weights)
            error = laberMat[i] - h
            weights += alpha * dataMat[i].transpose() * error
    duration = time.time() - start_time
    print "duration of time:", duration
    return weights
    start_time = time.time()

def show(dataMat, laberMat, weights):
    m, n = numpy.shape(dataMat)
    min_x = min(dataMat[:, 1])[0, 0]
    max_x = max(dataMat[:, 1])[0, 0]
    xcoord1 = []; ycoord1 = []
    xcoord2 = []; ycoord2 = []
    for i in range(m):
        if int(laberMat[i, 0]) == 0:
            xcoord1.append(dataMat[i, 1]); ycoord1.append(dataMat[i, 2])
        elif int(laberMat[i, 0]) == 1:
            xcoord2.append(dataMat[i, 1]); ycoord2.append(dataMat[i, 2])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcoord1, ycoord1, s=30, c="red", marker="s")
    ax.scatter(xcoord2, ycoord2, s=30, c="green")
    x = numpy.arange(min_x, max_x, 0.1)
    y = (-weights[0] - weights[1]*x) / weights[2]
    ax.plot(x, y)
    plt.xlabel("x1"); plt.ylabel("x2")
    plt.show()

if __name__ == "__main__":
    dataMat, laberMat = loadData()
    #weights = gradAscent(dataMat, laberMat, maxCycle=500)
    #weights = stocGradAscent(dataMat, laberMat)
    weights = betterStocGradAscent(dataMat, laberMat, numIter=80)
    show(dataMat, laberMat, weights)

未优化的程序结果如下,

随机梯度上升算法(降低了迭代的次数,算法较快,但结果不够准确)结果如下,

对αα进行优化,动态调整步长(同样降低了迭代次数,但是由于代码采用动态调整alpha,提高了结果的准确性),结果如下


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-30 03:09:50

logistic回归的相关文章

数据挖掘-Logistic回归数据预处理问题

问题描述 Logistic回归数据预处理问题 我在做一个新闻数据集的分类,用Logistic回归模型.(数据集来源:http://archive.ics.uci.edu/ml/datasets/Online+News+Popularity) 这个数据集中的数据类型比较杂,有离散的数据也有连续的,有些范围在1以内,有些可以达到几十万,请问对这样的数据可以采用一些什么样的方法预处理,使之适用于Logistic回归? 解决方案 分类数据之logistic回归Logistic 回归Logistic回归p

6、spss做logistic回归

前边我们用两篇笔记讨论了线性回归的内容.线性回归是很重要的一种回归方法,但是线性回归只适用于因变量为连续型变量的情况,那如果因变量为分类变量呢?比方说我们想预测某个病人会不会痊愈,顾客会不会购买产品,等等,这时候我们就要用到logistic回归分析了. Logistic回归主要分为三类,一种是因变量为二分类得logistic回归,这种回归叫做二项logistic回归,一种是因变量为无序多分类得logistic回归,比如倾向于选择哪种产品,这种回归叫做多项logistic回归.还有一种是因变量为有

TensorFlow训练Logistic回归

Logistic回归 在用线性模型进行回归训练时,有时需要根据这个线性模型进行分类,则要找到一个单调可微的用于分类的函数将线性回归模型的预测值关联起来.这时就要用到逻辑回归,之前看吴军博士的<数学之美>中说腾讯和谷歌广告都有使用logistics回归算法. 如下图,可以清晰看到线性回归和逻辑回归的关系,一个线性方程被逻辑方程归一化后就成了逻辑回归.. Logistic模型 对于二分类,输出y∈{0,1},假如线性回归模型为z=θTx,则要将z转成y,即y=g(z).于是最直接的方式是用单位阶跃

MachineLearning之Logistic回归

一.概述 假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称为回归: 利用Logistic回归进行分类的主要思想是: 根据现有数据对分类边界线建立回归公式, 以此进行分类. 这里的"回归"一词源于最佳拟合, 表示要找到最佳拟合参数集, 其背后的数学分析将在下一部分介绍. 训练分类器时的做法就是寻找最佳拟合参数, 使用的是最优化算法. 二.基于Logistic回归和Sigmoid函数的分类  单位阶跃函数也称海维赛德阶跃函数(Heaviside

机器学习之旅---logistic回归

一.logistic回归分析简介     logistic回归是研究观察结果(因变量)为二分类或多分类时,与影响因素(自变量)之间关系的一种多变量分析方法,属于概率型非线性回归.     利用logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类.这里"回归"是指通过最优化方法找到最佳拟合参数集,作为分类边界线的方程系数.通过分类边界线进行分类,具体说来就是将每个测试集上的特征向量乘以回归系数(即最佳拟合参数),再将结果求和,最后输入到logist

Logistic 回归

Logistic 回归:从入门到进阶(之一) --如何理解Logistic回归 我们在做统计分析之前,往往会做个散点图,以对数据有直观的了解.今天,我们就从散点图入手,来探究Logistic回归的奥秘. 如下,分别是连续型因变量和二分类因变量的散点图.很直观的,我们会想到用一条直线来代表左图中两个变量的关系.那么右图中,用一条什么样的线来代表呢? 如下,左图可以完美地拟合出一条直线:而右图如果绘制成S型曲线,意义就与左图有所不同了. 右图的纵轴已经换成了P值.所以右图曲线上的点,代表的就是在对应

谁在人肉搜索?——网络人肉搜索主体的Logistic回归模型分析

本文发表于<广告大观(理论版)>2010年02期,主要使用SPSS软件对一份包含5758个样本的数据进行Logistic回归分析,考察网络人肉搜索参与主体的人口统计特征.基本网络使用情况以及具体的网络参与行为对其参与人肉搜索的影响程度.研究发现23-27岁的男性低收入群体.经常参与网络口水战的人.在网络上爱说谎的人.网络发言是为了发泄情绪的人.网络发言为了引起别人注意的人.更愿意讨论陌生人的私人话题的人.在网络和现实中表现不一的人更容易参与人肉搜索.而且是否参与人肉搜索与网龄和每天上网时间相关

logistic回归算法及其matlib实现

     一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大.如果非要使用回归算法,可以使用logistic回归.      logistic回归本质上是线性回归,只是在特征到结果的映射中多加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)作为假设函数来预测,g(z)可以将连续值映射到0和1上.      logistic回归的假设函数如下,线性回归假设函数只是\(\theta^Tx\). \[h_\theta(x)=g(\theta^Tx)=\frac{1}{

Logistic回归与最小二乘概率分类算法简述与示例

Logistic Regression & Least Square Probability Classification 1. Logistic Regression Likelihood function, as interpreted by wikipedia: https://en.wikipedia.org/wiki/Likelihood_function plays one of the key roles in statistic inference, especially met