一周搞懂一个机器学习算法之逻辑回归Logistic Regression

Logistic Regression

逻辑回归是我接触机器学习之后学到的第二个算法,主要用于二分类问题

  • 原理简介
  • 我的理解
  • 代码实现

逻辑回归原理简介

怎么说呢,其实对于逻辑回归,并没有一个明确的概念,更多的是一个过程性的描述:对于一个二分类问题,建立一个代价函数,通过最优化方法求解出参数,然后验证整个模型好坏的一个过程。

我的理解

我觉得搞懂逻辑回归,首先要明确两点:1.什么是Sigmoid函数,它的输入是什么;2.使用哪种最优化算法对参数进行求解。先说第一个问题,Sigmoid函数的公式如下:

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

用python中的matplotlib给这个曲线画一个图,他的大致样子是这样的
Sigmoid函数图像
可以观察到,当x为0时,函数值为0.5,随着x的增大,函数值逼近于1,随着x的减小,函数值逼近于0。其实他在大尺度下,看上去就是一个阶跃函数(可以想象把坐标轴的范围扩大到正负100,基本上就是左边是0,右边是1了,中间只有近似的一条竖线),但确是连续光滑的。所以任何大于0.5的数据被分入1类,小于0.5的被分入0类,因此也可以把逻辑回归看成一种概率估计。
Sigmoid函数的输入记为 z z ,由下面的公式得出:
z=ω0x0+ω1x1+ω2x2+...+ωnxn
写成向量形式为 z=WTX z = W T X ,其中X是分类器的输入数据,W是我们要找的参数(W和X都是向量)。以上的论述就说明白了第一个问题,而如何得到我们想要的参数W,就要说一下第二个问题了,也就是用优化方法来求解参数。
在解决第二个问题前,我们需要构造一个损失函数,损失函数如下:
J(ω)=1m[i=1m(yiloghω(xi)+(1yi)log(1hω(xi)))] J ( ω ) = − 1 m [ ∑ i = 1 m ( y i l o g h ω ( x i ) + ( 1 − y i ) l o g ( 1 − h ω ( x i ) ) ) ]
,其中, hω(x)=σ(ωTx)=11+eωTx h ω ( x ) = σ ( ω T x ) = 1 1 + e − ω T x ,对于这个损失函数,我们通过梯度上升法来求解最优参数,在梯度上升法的过程中,取 ωj=ωj+αδδωjJ(ω) ω j = ω j + α δ δ ω j J ( ω ) ,如此即可求出最优的参数 ω ω 。有了最优的参数,带回原式,就得到了一个逻辑回归模型,进而可以对输入的数据进行分类了。

代码实现

import numpy as np

def loadData():
    data = []
    label = []
    #这里使用的是machine learning in Action中的一个小数据集,里面存放了带label的点
    #格式是像这样子的:-0.017612 14.053064   0 第一个是x坐标,第二个是y坐标,第三个是label
    f = open('testSet.txt') 
    for line in f.readlines():
        lineArr = line.strip().split()
        data.append([1.0, float(lineArr[0]), float(lineArr[1])]) #这里把w0设为1
        label.append(int(lineArr[2]))
    return  data, label

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

def gradAescent(data, label):
    dataMat = np.mat(data)
    labelMat = np.mat(label).transpose() #转变为列向量
    m, n = np.shape(dataMat)
    alpha = 0.01 #学习率
    cycles = 500 #迭代次数
    weights = np.ones((n, 1))
    for i in range(cycles):
        h = sigmoid(dataMat * weights)
        error = labelMat - h
        weights = weights + alpha * dataMat.transpose() * error #梯度上升求参数
    return weights

if __name__ == "__main__":
    dataArr, labelVec = loadData()
    print gradAescent(dataArr, labelVec)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值