机器学习系列之逻辑回归

前一篇博客介绍了线性回归,纵使可以撇开 y 是离散值得事实,给定 x, 使用线性回归对 y 进行预测,可以找到很多示例说明这种预测结果不会很好,比如说,房价不可能随着面积大小线性增长。并且当我们知道 y 的取值范围在{0,1}时,预测结果大于 1 或者小于 0 已经没有了意义。怎样解决这个问题?可以使用逻辑回归。

逻辑回归于线性回归有很多相似之处,最大的不同在于他们的因变量不同。线性回归用来预测连续变量的值,而逻辑回归是用来求分类的,可以用来解决二分类问题,也可以用于解决多分类问题,但是解决二分类问题更为常见。

g(z)=11+ez

称为logistic 函数或者 sigmod 函数。函数图像如下所示:

g(z) 的导数 g(z) 为:
g(z)=ddz11+ez=1(1+ez)2)(ez)=1(1+ez)(11(1+ez))=g(z)(1g(z)).

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

假设有:

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

P(y=0|x;θ)=1hθ(x)

更为一般的形式 :
P(y|x;θ)=(hθ(x))y((1hθ(x)))1y

最大似然函数为:

L(θ)=p(y⃗ |X;θ)=i=1mp(y(i)|x(i);θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

上式求对数得:

l(θ)=logL(θ)=i=1my(i)logh(x(i))+(1y(i))log(1h(x(i))))

l(θ) 求导得:

θjl(θ)=(y1g(θTx)(1y)11g(θTx))θjg(θTx)=(y1g(θTx)(1y)11g(θTx))g(θTx)(1g(θTx))θjθTx=(y(1g(θTx)(1y)g(θTx)xj)=(yhθ(x))xj

所以随机梯度下降规则为 :

θj:=θj(y(i)hθ(x(i)))(xj)(i)

实验代码如下 :

    # encoding=utf-8
    import numpy as np


    def gradAscent(dataMatIn, classLabels):
        dataMatrix = np.mat(dataMatIn)  # 数据列表转换成矩阵
        labelMat = np.mat(classLabels).transpose()  # 类标签列表转换成矩阵
        m, n = np.shape(dataMatrix)  # 得到dataMatrix矩阵大小
        alpha = 0.001  # 每次上升的步长
        maxCycles = 500  # 迭代次数
        weights = np.ones((n, 1))
        for k in range(maxCycles):
            h = sigmoid(dataMatrix * weights)  # 计算假设函数h(列向量)
            error = (labelMat - h)  # 类标签和假设函数的误差
            weights = weights + alpha * dataMatrix.transpose() * error  # 对weights进行迭代更新
        return weights


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


    def loadDataSet():
        dataMat = []
        labelMat = []
        fr = open('../resources/lr.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


    if __name__ == '__main__':
        data, lable = loadDataSet()
        weights = gradAscent(data, lable)
        print(weights)

源代码以及实验数据存储在github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值