Logistics Rrgression(Logistics回归)

来源:互联网 发布:韩顺平java全套视频 编辑:程序博客网 时间:2024/05/19 16:27

Logistics Rrgression(Logistics回归)

Logistic回归 优点:计算代价不高,易于理解和实现。 缺点:容易欠拟合,分类精度可能不高。适用数据类型:数值型和标称型数据。 Logistic回归的一般过程 (1) 收集数据:采用任意方法收集数据。 (2) 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳。 (3) 分析数据:采用任意方法对数据进行分析。 (4) 训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。 (5) 测试算法:一旦训练步骤完成,分类将会很快。 (6) 使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值; 接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于 哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。

前导知识

Sigmoid函数

s(x)=11ex

x为0时,Sigmoid函数值为0.5,随着x的增大,对应的Sigmoid值将趋近与1;而随着x的减小,Sigmoid值将逼近于0。如果刻度足够大,Sigmoid函数看起来很像一个阶跃函数。(如下两图)

特性:

s(x)=ex(1ex)2=s(x)(1s(x))

![屏幕快照 2017-08-20 09.04.22](/Users/liwei/Desktop/屏幕快照 2017-08-20 09.04.22.png)

![屏幕快照 2017-08-20 09.07.27](/Users/liwei/Desktop/屏幕快照 2017-08-20 09.07.27.png)

最大似然估计(Maximum Likelihood Estimate,MLE)

​ 它是建立在极大似然原理的基础上的一个统计方法,极大似然原理的直观想法是:一个随机试验如有若干个可能的结果A,B,C,…。若在仅仅作一次试验中,结果A出现,则一般认为试验条件对A出现有利,也即A出现的概率很大。一般地,事件A发生的概率与参数θ相关,A发生的概率记为P(A,θ),则θ的估计应该使上述概率达到最大,这样的θ顾名思义称为极大似然估计。

梯度上升法(Gradient Ascent)公式推导

记Sigmoid函数的输入为x,对应的分类为y

x=θ0x0+θ1x1+θ2x2+···+θnxn


hθ(x)=g(θTx)=11+eθTx(θx)

由于Sigmoid函数的性质,我们对分类做如下处理
y={01hθ(x)<0.5hθ(x)>0.5

于是我们假设:
P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1hθ(x)

所以
P(y|x;θ)=hθ(x)y(1hθ(x))1y

根据极大似然估计,假设样本与样本之间独立,整个样本生成的概率即为所有样本生成概率的乘积,L(θ) 最大时取得最佳回归系数
L(θ)=P(y⃗ |x⃗ ;θ)=i=1nP(y(i)|x(i);θ)=i=1nhθ(x(i))y(i)(1hθ(x(i)))(1y(i))y⃗ x⃗ n,y(i)x(i)i

为方便计算,对总概率
L(θ)
取自然对数
l(θ)=ln(L(θ))=i=1ny(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))=i=1ny(i)ln(g(θTx(i)))+(1y(i))ln(1g(θTx(i)))

通过梯度上升法求出
l(θ)
最大时对应的各个回归系数
l(θ)θj=i=1n(y(i)g(θTx(i))1y(i)1g(θTx(i)))(g(θTx(i))θj)=i=1n(y(i)g(θTx(i))1y(i)1g(θTx(i)))g(θTx(i))(1g(θTx(i)))θTx(i)θj=i=1n(y(i)(1g(θTx(i)))(1y(i))g(θTx(i)))xj=i=1n(y(i)hθ(x(i)))xj=(yhθ(x))xj

所以最终梯度上升求最佳回归系数的表达式为:
θ=θ+α(yhθ(x))xαxθ

重复计算此表达式,直到该结果收敛(既与训练集中的数据相差小于某个值)或者重复到一定次数时。

随机梯度上升(Stochastic Gradient Ascent)

随机梯度上升法是为了解决大数据需要计算特别久的情况。采用每次随机选择一个样本来更新回归数据,使回归系数更快的收敛。

代码解释

# -*- coding: UTF-8 -*-from numpy import *def loadDataSet():    dataMat = []; labelMat = []    fr = open('testSet.txt')    for line in fr.readlines():        lineArr = line.strip().split()        dataMat.append([1.0, float(lineArr[0]),float(lineArr[1])])    labelMat.append(int(lineArr[2]))    return dataMat,labelMatdef sigmoid(inX): # sigmoid函数    return 1.0/(1+exp(-inX))def gradAscent(dataMatIn, classLabels): # 梯度上升    dataMatrix = mat(dataMatIn)    labelMat = mat(classLabels).transpose() # transpose函数为转置函数    m,n = shape(dataMatrix)    alpha = 0.001 # 步长    maxCycles = 500 # 最多循环500次    weights = ones((n,1)) # 将回归系数最开始都初始为1    for k in range(maxCycles):        '''            以下均为矩阵计算,而非数组计算            其中weight为回归系数labelMat为y,h为h(x),dataMartix为x        '''        h = sigmoid(dataMatrix * weights)        error = (labelMat - h)        weights = weights + alpha * dataMatrix.transpose() * error    return weights
原创粉丝点击