前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习 学习笔记(6) Logistic 回归

机器学习 学习笔记(6) Logistic 回归

作者头像
发布2018-09-03 18:15:24
5770
发布2018-09-03 18:15:24
举报
文章被收录于专栏:WD学习记录

线性模型可以进行回归学习,但是若要做分类任务该怎么办,只需要找一个单调可微函数将分类任务的真实标记y与线性回归的预测值联系起来。

对数几率函数(logistic function)(逻辑斯蒂回归):

y=\frac{1}{1+e^{-z}}
y=\frac{1}{1+e^{-z}}

对数几率函数是一种Sigmoid函数,将z值转化为一个接近0或者1的y值,并且其输出值在z=0附近变化很陡。

y=\frac{1}{1+e^{-(w^Tx+b)}}
y=\frac{1}{1+e^{-(w^Tx+b)}}
ln \frac{y}{1-y}=w^Tx+b
ln \frac{y}{1-y}=w^Tx+b

将y视为样本x作为正例的可能性,1-y则是反例的可能性,两者的比值为

\frac {y}{1-y}
\frac {y}{1-y}

称为几率。反应了x作为正例的可能性。

可以看出,

y=\frac{1}{1+e^{-(w^Tx+b)}}
y=\frac{1}{1+e^{-(w^Tx+b)}}

是用线性回归模型的预测结果去逼近真实标记的对数几率,因此,其对应模型称为对数几率回归。需要注意的是名字带有回归,实际上式分类方法。

这种方法的优点包括:直接对分类可能性进行建模,无需事先假设数据分布,避免假设分布不准确所带来的问题,不是仅仅预测出类别,而是可以得到近似概率预测,这对许多需要利用概率辅助决策的任务很有用,此外,对率函数是任意阶可导的凸函数,有很好的数学性质,现在的许多数值优化算法都可直接用于求取最优解。

如何确定其中的w和b。将y视为类后验概率

p(y=1|x)
p(y=1|x)

,则:

ln \frac{p(y=1|x)}{p(y=0|x)}=w^Tx+b
ln \frac{p(y=1|x)}{p(y=0|x)}=w^Tx+b

,有

p(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}}
p(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}}

p(y=0|x)=\frac{1}{1+e^{w^Tx+b}}
p(y=0|x)=\frac{1}{1+e^{w^Tx+b}}

,然后可以通过极大似然大来估计w和b。

给定数据集,对率回归模型最大化对数似然,

l(w,b)=\sum_{i=1}^m ln p(y_i|x_i;w,b)
l(w,b)=\sum_{i=1}^m ln p(y_i|x_i;w,b)

,即令每个样本术语其真实标记的概率越大越好。

\beta =(w ;b)
\beta =(w ;b)

x=(x;1)
x=(x;1)

,则

p(y_i|x_i;w,b)=y_ip(y=1|x_i,\beta)+(1-y_i)(y=0|x_i,\beta )
p(y_i|x_i;w,b)=y_ip(y=1|x_i,\beta)+(1-y_i)(y=0|x_i,\beta )

,将其带入上式,

l(\beta )=\sum_{i=1}^m(-y_i\beta ^Tx_i+ln(1+e^{\beta ^Tx_i}))
l(\beta )=\sum_{i=1}^m(-y_i\beta ^Tx_i+ln(1+e^{\beta ^Tx_i}))

,该式子是关于

\beta
\beta

的高阶可导连续函数,可以通过经典的数值优化算法梯度下降法、牛顿法等求得其最优解。

梯度下降法实现代码:

梯度下降w迭代公式为:

w_j=w_j+\eta \sum_{i=1}^n(y^{(i)}-\varphi (z^{(i)}))x^{(i)}_j
w_j=w_j+\eta \sum_{i=1}^n(y^{(i)}-\varphi (z^{(i)}))x^{(i)}_j
代码语言:javascript
复制
# 代码以及数据集源自于机器学习实战,见https://github.com/AnnDWang/MachineLearning/blob/master/thirdbook/ch5/logRegres.py
# logistic 回归梯度上升优化算法
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):
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):
    dataMatrix=mat(dataMatIn)
    labelMat=mat(classLabels).transpose()
    m,n=shape(dataMatrix)
    alpha=0.001
    maxCycles=500
    weights=ones((n,1))
    for k in range(maxCycles):
        h=sigmoid(dataMatrix*weights)
        error=(labelMat-h)
        weights=weights+alpha*dataMatrix.transpose()*error
    return weights

dataArr,labelMat=loadDataSet()
weights=gradAscent(dataArr,labelMat)
代码语言:javascript
复制
# 随机梯度上升算法
def stocGradAscent0(dataMatrix,classLabels):
    m,n=shape(dataMatrix)
    alpha=0.01
    weights=ones(n)
    for i in range(m):
        h=sigmoid(sum(dataMatrix[i]*weights))
        error=classLabels[i]-h
        weights=weights+alpha*error*dataMatrix[i]
    return weights

# 改进的随机梯度上升算法
# alpha在每次迭代时候都会调整,这回缓解数据波动或者高频波动
# 虽然alpha会随着迭代次数不断减小,但永远不会减小到0
# 这是因为alpha更新公式中存在一个常数项,保证多次迭代之后新数据仍然有一定的影响
# 如果要处理的问题是动态变化的,那么可以适当加大常数项,来确保新的值获得更大的回归系数
# 在降低alpha函数中,每次减少1/(j+i),其中j是迭代次数,i是样本点的下标,
# 这样当j<<max(i)时,alpha就不是严格下降的
# 避免参数的严格下降也常见于模拟退火等其他优化算法
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
    m,n=shape(dataMatrix)
    weights=ones(n)
    for j in range(numIter):
        dataIndex=list(range(m))
        for i in range(m):
            alpha=4/(1.0+j+i)+0.01 # alpha在每次迭代时候都会调整
            randIndex=int(random.uniform(0,len(dataIndex))) # 随机选取更新
            h=sigmoid(sum(dataMatrix[randIndex]*weights))
            error=classLabels[randIndex]-h
            weights=weights+alpha*error*dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

多项逻辑斯谛回归

上述介绍的是二项分类模型,用于二类分类,可以将其推广为多项逻辑斯蒂回归模型,用于多类分类,假设离散型随机变量Y的取值集合是{1,2,...,K},那么多项逻辑斯蒂回归模型是:

P(Y=k|x)=\frac{exp(w_kx_i)}{1+\sum_{k=1}^{K-1} exp(w_kx)}, k=1,2,...K-1
P(Y=k|x)=\frac{exp(w_kx_i)}{1+\sum_{k=1}^{K-1} exp(w_kx)}, k=1,2,...K-1
P(Y=K|x)=\frac{1}{1+\sum_{k=1}^{K-1}exp(w_kx)}
P(Y=K|x)=\frac{1}{1+\sum_{k=1}^{K-1}exp(w_kx)}

x\in R^{n+1},w_k\in R^{n+1}
x\in R^{n+1},w_k\in R^{n+1}

参考:

  1. 《机器学习》
  2. 《统计学习方法》
  3. 《机器学习实战》
  4. 逻辑回归(logistic regression)的本质——极大似然估计
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年08月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多项逻辑斯谛回归
  • 参考:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档