Logistics Rrgression(Logistics回归)
Logistic回归 |
---|
优点:计算代价不高,易于理解和实现。 |
缺点:容易欠拟合,分类精度可能不高。适用数据类型:数值型和标称型数据。 |
Logistic回归的一般过程 |
---|
(1) 收集数据:采用任意方法收集数据。 |
(2) 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳。 |
(3) 分析数据:采用任意方法对数据进行分析。 |
(4) 训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。 |
(5) 测试算法:一旦训练步骤完成,分类将会很快。 |
(6) 使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值; 接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于 哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。 |
前导知识
Sigmoid函数
s(x)=11−e−x
当
x
为0时,Sigmoid函数值为0.5,随着
特性:
![屏幕快照 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
,对应的分类为
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;θ)=1−hθ(x)
所以
P(y|x;θ)=hθ(x)y(1−hθ(x))1−y
根据极大似然估计,假设样本与样本之间独立,整个样本生成的概率即为所有样本生成概率的乘积, L(θ) 最大时取得最佳回归系数
L(θ)=P(y⃗ |x⃗ ;θ)=∏i=1nP(y(i)|x(i);θ)=∏i=1nhθ(x(i))y(i)(1−hθ(x(i)))(1−y(i))y⃗ 和x⃗ 分别为n组数据的输出与输入组成的矩阵,y(i)和x(i)为第i组数据
为方便计算,对总概率
L(θ)
取自然对数
l(θ)=ln(L(θ))=∑i=1ny(i)ln(hθ(x(i)))+(1−y(i))ln(1−hθ(x(i)))=∑i=1ny(i)ln(g(θTx(i)))+(1−y(i))ln(1−g(θTx(i)))
通过梯度上升法求出
l(θ)
最大时对应的各个回归系数
∂l(θ)∂θj=∑i=1n(y(i)g(θTx(i))−1−y(i)1−g(θTx(i)))(∂g(θTx(i))∂θj)=∑i=1n(y(i)g(θTx(i))−1−y(i)1−g(θTx(i)))g(θTx(i))(1−g(θTx(i)))∂θTx(i)∂θj=∑i=1n(y(i)(1−g(θTx(i)))−(1−y(i))g(θTx(i)))xj=∑i=1n(y(i)−hθ(x(i)))xj=(y−hθ(x))xj
所以最终梯度上升求最佳回归系数的表达式为:
θ=θ+α(y−hθ(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,labelMat
def 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